Linux系統編程----12(線程概念,Linux線程實現原理,棧中ebp指針和ebp指針,線程的優缺點和共享資源)

線程概念

什么是線程

  1. 在一個程序里的一個執行路線就叫做線程(thread)。
  2. 更準確的定義是:線程是“一個進程內部的控制序列” 一切進程至少都有一個執行線程
  3. 線程在進程內部運行,本質是在進程地址空間內運行
  4. 在Linux系統中,在CPU眼中,看到的PCB都要比傳統的進程更加輕量化
  5. 透過進程虛擬地址空間,可以看到進程的大部分資源,將進程資源合理分配給每個執行流,就形成了線程 執行流
LWP:light weight process 輕量級進程
  1. 進程:獨立地址空間,擁有 PCB
  2. 線程:也有 PCB,但沒有獨立的地址空間(共享) 區別:在于是否共享地址空間。
    獨居(進程);合租(線程)。
    Linux 下:
    線程:最小的執行單位
    進程:最小分配資源單位,可看成是只有一個線程的進程。
    在這里插入圖片描述
    一個進程創建多少個線程,他們都共用一塊地址空間,但是線程越多,占用cpu越多,也就是cpu分的時間片越多,效率越高。因為線程是最小的執行單位,要被執行,必須要用cpu。

Linux內核線程實現原理

類 Unix 系統中,早期是沒有“線程”概念的,80 年代才引入,借助進程機制實現出了線程的概念。因此在這 類系統中,進程和線程關系密切。

  1. 輕量級進程(light-weightprocess),也有 PCB,創建線程使用的底層函數和進程一樣,都是 clone
  2. 從內核里看進程和線程是一樣的,都有各自不同的 PCB,但是 PCB 中指向內存資源的三級頁表是相同的
  3. 進程可以蛻變成線程
  4. 線程可看做寄存器和棧的集合
  5. 在 linux 下,線程最是小的執行單位;進程是最小的分配資源單位

在這里插入圖片描述

線程1和線程2程序內部執行的函數不會一樣,所以對應的棧不一樣。
在這里插入圖片描述

Linux操作系統中cpu劃分時間輪片的依據

查看 LWP 號ps –Lf pid** 查看指定線程的 lwp 號。不是線程ID**

在這里插入圖片描述

注意

  1. 對于進程來說,相同的地址(同一個虛擬地址)在不同的進程中,反復使用而不沖突。原因是他們雖虛擬地址一樣,
  2. 進程的頁目錄、頁表、物理頁面各不相同。相同的虛擬地址,映射到不同的物理頁面內存單元,最終訪問不同的物理頁 面。
  3. 線程不同。兩個線程具有各自獨立的 PCB,但共享同一個頁目錄,也就共享同一個頁表和物理頁面。所以 兩個 PCB 共享一個地址空間。 實際上,無論是創建進程的 fork,還是創建線程的 pthread_create,底層實現都是調用同一個內核函數 clone。
    如果復制對方的地址空間,那么就產出一個“進程”;如果共享對方的地址空間,就產生一個“線程”。
  4. 因此:Linux 內核是不區分進程和線程的。只在用戶層面上進行區分。所以,線程所有操作函數 pthread_ 是 庫函數,而非系統調用。*

線程共享資源

  1. 文件描述符表
  2. 每種信號的處理方式
  3. 當前工作目錄
  4. 用戶 ID 和組 ID
  5. 內存地址空間 (.text/.data/.bss/heap/共享庫)沒有stack

線程非共享資源

  1. 線程 id
  2. 處理器現場和棧指針(內核棧)
  3. 獨立的棧空間(用戶空間棧)
  4. errno 變量
  5. 信號屏蔽字
  6. 調度優先級

線程優、缺點

優點:

  1. 提高程序并發性
  2. 開銷小
  3. 數據通信、共享數據方便
  4. 創建一個新線程的代價要比創建一個新進程小得多
  5. 與進程之間的切換相比,線程之間的切換需要操作系統做的工作要少很多
  6. 線程占用的資源要比進程少很多
  7. 能充分利用多處理器的可并行數量
  8. 在等待慢速I/O操作結束的同時,程序可執行其他的計算任務
  9. 計算密集型應用,為了能在多處理器系統上運行,將計算分解到多個線程中實現
  10. I/O密集型應用,為了提高性能,將I/O操作重疊。線程可以同時等待不同的I/O操作。

缺點:

  1. 庫函數,不穩定 ,進程中時庫函數
  2. 調試、編寫困難、gdb 不支持
  3. 對信號支持不好 優點相對突出,缺點均不是硬傷。
  4. 線程間缺乏訪問控制,編碼難度更高
  5. 線程健壯性更低
    Linux 下由于實現方法導致進程、線程差別不是很大。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383225.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383225.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383225.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux系統編程---13(線程控制函數,創建線程,循環創建多個線程,線程間共享全局變量)

線程控制 操作系統并沒有提供創建線程的系統調用接口,因此大佬們封裝了一個線程的接口庫實現線程控制。意為著用戶創建線程都使用的是庫函數(所以有時候我們說創建的線程是一個用戶態線程,但是在內核中對應有一個輕量級進程實現線程程序的調…

Linux系統編程---14(回收子線程,回收多個子線程,線程分離,殺死線程)

回收子線程 pthread_join 函數 阻塞等待線程退出,獲取線程退出狀態 其作用,對應進程中 waitpid() 函數。 int pthread_join (pthread_t thread,void** retval); 成功:0,失敗:錯誤號 參數:thread&#x…

Linux系統編程----15(線程與進程函數之間的對比,線程屬性及其函數,線程屬性控制流程,線程使用注意事項,線程庫)

對比 進程 線程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 kill pthread_cancel ();必須到取消點(檢查點):…

內核雙向循環鏈表

#include <string.h>#include <stdio.h>#include <stdlib.h>#include<malloc.h>#include <arpa/inet.h>//鏈表頭結構struct list_head{struct list_head *next,*prev;};//真正實現鏈表插入操作void _list_add(struct list_head *nnew,struct lis…

Linux系統編程----16(線程同步,互斥量 mutex,互斥鎖的相關函數,死鎖,讀寫鎖)

同步概念 所謂同步&#xff0c;即同時起步&#xff0c;協調一致。不同的對象&#xff0c;對“同步”的理解方式略有不同。如&#xff0c;設備同步&#xff0c;是指在兩 個設備之間規定一個共同的時間參考&#xff1b;數據庫同步&#xff0c;是指讓兩個或多個數據庫內容保持一致…

轉移字符的轉換

使得網頁上不會顯示 \x0a\x0a \x0a \x0a \x0a \x0a 類似的字符static int te_escape_isDec(char *ptr, unsigned int len) { …

Linux系統編程---17(條件變量及其函數,生產者消費者條件變量模型,生產者與消費者模型(線程安全隊列),條件變量優點,信號量及其主要函數,信號量與條件變量的區別,)

條件變量 條件變量本身不是鎖&#xff01;但它也可以造成線程阻塞。通常與互斥鎖配合使用。給多線程提供一個會合的場所。 主要應用函數&#xff1a; pthread_cond_init 函數pthread_cond_destroy 函數pthread_cond_wait 函數pthread_cond_timedwait 函數pthread_cond_signa…

好友

http://blog.csdn.net/liangyuannao/article/details/8583139

Linux系統編程---18(線程池相關概念及其實現)

線程池 概念&#xff1a; 一堆線程任務隊列 作用 避免大量線程頻繁的創建/銷毀時間成本避免瞬間大量線程創建耗盡資源&#xff0c;程序崩潰危險 實現 創建固定數量的線程創建一個線程安全的任務隊列 一種線程使用模式。 線程過多會帶來調度開銷&#xff0c;進而影響緩…

設計模式--1(設計模式基礎,設計模式基本原則,設計模式分類)

設計模式基礎 模式 在一定環境中解決某一問題的方案&#xff0c;包括三個基本元素–問題&#xff0c;解決方案和環境。大白話&#xff1a;在一定環境下&#xff0c;用固定套路解決問題。 設計模式 是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使…

source insight 使用技巧

source insight 使用技巧 1 sourceinsight screen font 的默認字體是Verdana的&#xff0c;它是一直變寬字體。在Document style中可以將字體改為定寬的Courier2 document options->auto indent 去掉indent Open Brace和Indent Close Brace的效果: 繼上一段&#xff0c;在…

設計模式----2(簡單工廠模式的概念,簡單工廠模式的實現,簡單工廠模式的優缺點)

簡單工廠模式 簡單工廠模式的概念 簡單工廠模式屬于類的創建型模式,又叫做靜態工廠方法模式。通過專門定義一個類來負 責創建其他類的實例&#xff0c;被創建的實例通常都具有共同的父類。 具體分類 工廠&#xff08;Creator&#xff09;角色 簡單工廠模式的核心&#xff0…

Redis常見問題及其一些重點知識總結

1、什么是 Redis&#xff1f;簡述它的優缺點&#xff1f; Redis 的全稱是&#xff1a;Remote Dictionary.Server&#xff0c;本質上是一個 Key-Value 類型的內存數據庫&#xff0c;很像 memcached&#xff0c;整個數據庫統統加載在內存當中進行操作&#xff0c;定期通過異步操…

shell生成隨機文件名

1 #!/bin/bash 2 # tempfile-name.sh: 臨時文件名產生器 3 4 BASE_STRmcookie # 32-字符的 magic cookie. 5 POS11 # 字符串中隨便的一個位置. 6 LEN5 # 取得 $LEN 長度連續的字符串. 7 8 prefixtemp # 最終的一個臨時文…

設計模式---3(工廠方法模式的概念,工廠方法模式的實現,工廠方法模式和簡單工廠模式比較)

工廠方法模式 概念 工廠方法模式同樣屬于類的創建型模式又被稱為多態工廠模式 。 工廠方法模式的意義 定義一個創建產品對象的工廠接口&#xff0c;將實際創建工作推遲到子類當中。 核心工廠類不再負責產品的創建&#xff0c;這樣核心類成為一個抽象工廠角色&#xff0c;僅…

設計模式---4(抽象工廠模式的概念,產品組和產品等級的概念,抽象工廠模式的實現)

抽象工廠模式 抽象工廠模式的概念 抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向 客戶端提供一個接口&#xff0c;使得客戶端在不必指定產品的具體類型的情況下&#xff0c;能夠創建多個產品 族的產品對象。 抽象工廠的角色及其職責 抽象工…

Win32項目關于MessageBox參數的詳細說明

函數功能&#xff1a;該函數創建、顯示、和操作一個消息框。消息框含有應用程序定義的消息和標題&#xff0c;加上預定義圖標與Push&#xff08;下按&#xff09;按鈕的任何組合。 函數原型&#xff1a;int MessageBox(HWND hWnd,LPCTSTR IpCaption,UINT…

w3af解析

1. w3af簡介 w3afis a Web Application Attack and Audit Framework.即Web應用攻擊和審計框架。w3af用python編寫&#xff0c;依賴的庫主要有2類&#xff0c;分別如下&#xff1a; <1> Core requirements: Python 2.6 fpconst-0.7.2&#xff1a;用于處理IEEE 754浮點…

1.c++中初始化列表和構造函數初始化的區別是什么?2.類的成員變量的初始化順序是按照聲明順序嗎?

初始化列表和構造函數初始化的區別是什么&#xff1f; 初始化和賦值對內置類型的成員沒有太大的區別&#xff0c;在成員初始化列表和構造函數體內進行&#xff0c;在性能和結果上都是一樣的。只有一些需要注意的事項 初始化列表一般情況如下&#xff1a; Date(int year, int …

設計模式---5(建造者模式的概念及其實現,建造者模式的角色與職責,建造者模式和工廠模式的區別)

建造者模式 建造者模式的概念 Builder 模式也叫建造者模式或者生成器模式&#xff0c;是由 GoF 提出的 23 種設計模式中的一種。 Builder 模式是一種對象創建型模式之一&#xff0c;用來隱藏復合對象的創建過程&#xff0c;它把復合對象的 創建過程加以抽象&#xff0c;通過子…