文章目錄
多線程有多個控制序列,單線程只有一個控制序列
控制序列(指令序列)
進程的相關概念
程序:完成特定功能的一系列有序指令的集合,通過編譯鏈接成:
可執行文件:稱之爲程序,代碼段(指令)+數據段(指令操作的程序),保存在磁盤上
進程:程序的一次動態執行過程,代碼段+數據段+堆棧段+PCB(進程控制塊:進程運行狀態(包括:就緒狀態,運行狀態,等待狀態),進程上下文,進程執行的CPU狀態,當前運行到哪個地址:IP指令指針+SP堆棧指針+寄存器狀態)
進程 | 程序 |
動態的(在不斷的推進的過程中,會更改數據段,產生一些臨時的數據保存在堆棧段當中,且PCB的的狀態也是不斷髮生改變的) | 靜態的(保存在磁盤上,程序文件信息是不會改變的) |
短暫的(只是程序的一次動態執行過程) | 永久的 |
代碼段+數據段+堆棧段+PCB | 代碼段+數據段 |
一個進程只能對應一個程序(一個進程是一個程序的動態執行實例,一個程序可以運行多個實例,一個程序可以對應多個進程
進程數據結構:多個線程共享下面的信息
進程ID,uid,gid,有效uid,有效gid,cwd當前工作狀態,地址空間Memory Map每個進程都有2^32=4GB 的地址空間(對於32位的機器而言),信號分發表Signal Dispatch Table處理信號,文件描述表File Descriptor(維護當前打開的文件),
不共享的信息如下:
CPU state(單線程只有一個,多線程有多個,保存執行程序所必要的信息):優先級Poriority,信號屏蔽字Signal Mask,寄存器Registers,內核堆棧Kernel Stack
IP指令指針+SP堆棧指針+通用寄存器等
線程的局部變量
每個線程都有一個errno
每個線程都有一個對信號的處理狀態
一個進程若有2個線程構成,則這2個線程可能競爭到2個CPU
密集:一個線程可以等待多個不同的IO,I/O密集型佔用IO,可以讓出CPU
一個進程不會隨意破壞其它進程的地址空間,因爲他受到內存管理單元MMU的保護
進程與進程之間競爭CPU時間片,這個CPU時間片分享給各個進程的多個線程
KERNEL THREADS:實際上就是進程,系統中並未提供線程的支持
USER THREADS:表示線程
只要一個線程阻塞了,另外一個線程也不能工作了
操作系統對線程開始支持了
USER THREADS的2個用戶線程,對應KERNEL THREADS核心的2個線程,這2個線程可以調度到2個CPU
結合了1:1和N:1線程的優勢,因爲輕量級進程LWP比核心線程的切換開銷小,所以用戶線程的切換開銷更小,另外也充分利用了多核處理器的功能,因爲輕量級進程可以調度到核心線程KERNEL THREAD,每個核心線程可以調度到CPU,因爲可以充分利用到多核的功能;
當前的POSIX 線程就是N:M混合線程實現的
進程數據結構
輕量級進程的數據結構,用他調度到核心線程,因而這些輕量級進程(線程)共享進程的數據結構,但是他也有自己的CPU狀態,調度到核心線程,從而調度到CPU