国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Linux下多任務(wù)編程之任務(wù)、進(jìn)程和線程詳解,厲害的

Linux下多任務(wù)編程之任務(wù)、進(jìn)程和線程詳解,厲害的 時(shí)間:2018-06-25      來源:未知

多任務(wù)是指用戶可以在同一時(shí)間內(nèi)運(yùn)行多個(gè)應(yīng)用程序。Linux就是一種支持多任務(wù)的操作系統(tǒng),它支持多進(jìn)程、多線程等多任務(wù)處理和任務(wù)之間的多種通信機(jī)制。掌握多任務(wù)開發(fā),會(huì)有助于大家成為系統(tǒng)工程師。

Linux下多任務(wù)機(jī)制的介紹

Linux就是一個(gè)支持多任務(wù)的操作系統(tǒng),它比單任務(wù)系統(tǒng)的功能增強(qiáng)了許多。當(dāng)多任務(wù)操作系統(tǒng)使用某種任務(wù)調(diào)度策略允許兩個(gè)或更多進(jìn)程并發(fā)共享一個(gè)處理器時(shí),事實(shí)上處理器在某一時(shí)刻只會(huì)給一個(gè)任務(wù)提供服務(wù)。由于任務(wù)調(diào)度機(jī)制保證了不同的任務(wù)之間的切換速度十分迅速,因此給人多個(gè)任務(wù)同時(shí)運(yùn)行的錯(cuò)覺。多任務(wù)系統(tǒng)中有3個(gè)功能單位:任務(wù)、進(jìn)程和線程,下面分別進(jìn)程介紹。

1、任務(wù)

任務(wù)是一個(gè)邏輯概念,指由一個(gè)軟件完成的活動(dòng),或者是一系列共同達(dá)到某一個(gè)目的的操作。通常一個(gè)任務(wù)是一個(gè)程序的一次運(yùn)行,一個(gè)任務(wù)包含一個(gè)或多個(gè)完成獨(dú)立功能的子任務(wù),這個(gè)獨(dú)立的子任務(wù)就是進(jìn)程或線程。例如,一個(gè)殺毒軟件的一次運(yùn)行是一個(gè)任務(wù),目的是從各種病毒的侵害中保護(hù)計(jì)算機(jī)系統(tǒng),這個(gè)任務(wù)包含多個(gè)獨(dú)立功能的子任務(wù)(進(jìn)程或線程),包含實(shí)時(shí)監(jiān)控功能、定時(shí)查殺功能、防火墻功能及用戶交互功能等。個(gè)人理解:就好比假設(shè)一個(gè)應(yīng)用程序中由一個(gè)或多個(gè)可執(zhí)行文件共同執(zhí)行組成,那么此應(yīng)用程序的一次執(zhí)行就是一個(gè)任務(wù),而這些可執(zhí)行文件的執(zhí)行就是一個(gè)進(jìn)程的執(zhí)行,而可執(zhí)行文件是由一個(gè)線程或多個(gè)線程構(gòu)成的,當(dāng)只有一個(gè)線程構(gòu)成了這個(gè)進(jìn)程,則此時(shí)進(jìn)程和線程就是一樣的概念(可執(zhí)行文件的一次運(yùn)行)。

2、進(jìn)程

進(jìn)程的基本概念

進(jìn)程是一個(gè)具有獨(dú)立功能的程序在某個(gè)數(shù)據(jù)集上的一次動(dòng)態(tài)執(zhí)行過程,它是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位(個(gè)人理解:系統(tǒng)好比是一個(gè)大型的任務(wù),由多個(gè)進(jìn)程(可執(zhí)行文件)構(gòu)成,而資源分配和資源調(diào)度分別都是一個(gè)進(jìn)程,所以進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位)。一次任務(wù)的運(yùn)行可以并發(fā)激活多個(gè)進(jìn)程,這些進(jìn)程相互合作來完成該任務(wù)的一個(gè)最終的目標(biāo)。

進(jìn)程具有并發(fā)性、動(dòng)態(tài)性、交互性、獨(dú)立性和異步性等主要特性

· 并發(fā)性:指的是系統(tǒng)中多個(gè)進(jìn)程可以同時(shí)并發(fā)執(zhí)行,相互之間不受干擾。

· 動(dòng)態(tài)性:指的是進(jìn)程都有完整的生命周期,而且在進(jìn)程的生命周期內(nèi),進(jìn)程的狀態(tài)是不斷變化的。另外,進(jìn)程具有動(dòng)態(tài)的地址空間(包括代碼、數(shù)據(jù)和進(jìn)程控制塊)。

· 交互性:指的是進(jìn)程在執(zhí)行過程中可能會(huì)與其他進(jìn)程發(fā)生直接和間接的交互操作,如進(jìn)程同步和進(jìn)程互斥等,需要為此添加一定的進(jìn)程處理機(jī)制。

· 獨(dú)立性:指的是進(jìn)程是一個(gè)相對(duì)完整的資源分配和調(diào)度的基本單位,各個(gè)進(jìn)程的地址空間是相互獨(dú)立的,只有采用某些特定的通信機(jī)制才能實(shí)現(xiàn)進(jìn)程間的通信。

· 異步性:指的是每個(gè)進(jìn)程都按照各自獨(dú)立的、不可預(yù)知的速度向前執(zhí)行。

進(jìn)程和程序是有本質(zhì)的區(qū)別:程序是靜態(tài)的一段代碼,是一些保存在非易失性存儲(chǔ)器的指令的有序集合,沒有任何執(zhí)行的概念;而進(jìn)程是一個(gè)動(dòng)態(tài)的概念,它是程序執(zhí)行的過程,包括動(dòng)態(tài)創(chuàng)建、調(diào)度和消亡的整個(gè)過程,它是程序執(zhí)行和資源管理的最小單位。

Linux系統(tǒng)中包括以下幾種類型的過程:

· 交互式過程:這類進(jìn)程進(jìn)程與用戶進(jìn)程交互,因此要花很多時(shí)間等待用戶的交互操作(鍵盤和鼠標(biāo)操作等)。當(dāng)接收到用戶的交互操作后,這類進(jìn)程應(yīng)該很快被允許,而且相應(yīng)時(shí)間的變化也應(yīng)該很小,否則用戶就會(huì)覺得系統(tǒng)反應(yīng)遲鈍或者不太穩(wěn)定。典型的交互式進(jìn)程有shell命令進(jìn)程、文本編輯器和圖形應(yīng)用程序運(yùn)行等。

· 批處理進(jìn)程:這類進(jìn)程不必與用戶進(jìn)行交互,因此進(jìn)程在后臺(tái)運(yùn)行。因?yàn)檫@類進(jìn)程通常不必很快地相應(yīng),因此往往受到調(diào)度器的“慢待”。典型的批處理進(jìn)程有編譯器的編譯操作、數(shù)據(jù)庫搜索引擎等。

· 實(shí)時(shí)進(jìn)程:這類進(jìn)程通常對(duì)調(diào)度響應(yīng)時(shí)間有很高的要求,一般不會(huì)被低優(yōu)先級(jí)的進(jìn)程阻塞。它們不僅要求很短的響應(yīng)時(shí)間,而且更重要的是響應(yīng)時(shí)間的變化應(yīng)該很小。典型的實(shí)時(shí)進(jìn)程有視頻和音頻的應(yīng)用程序、實(shí)時(shí)數(shù)據(jù)采集系統(tǒng)程序等。

Linux下的進(jìn)程結(jié)構(gòu)

進(jìn)程不但包括程序的指令和數(shù)據(jù),而且包括程序計(jì)數(shù)器和處理器的所有寄存器以及存儲(chǔ)臨時(shí)數(shù)據(jù)的進(jìn)程堆棧,因此正在執(zhí)行的進(jìn)程包括處理器當(dāng)前的一切活動(dòng)。

因?yàn)長(zhǎng)inux是一個(gè)多進(jìn)程的操作系統(tǒng),所以其他的進(jìn)程必須等到系統(tǒng)將處理器使用權(quán)分配各自己之后才能運(yùn)行。當(dāng)正在運(yùn)行的進(jìn)程等待其他的系統(tǒng)資源時(shí),Linux內(nèi)核將取得處理器的控制權(quán),并將處理器分配給其他正在等待的進(jìn)程,它按照內(nèi)核中的調(diào)度算法決定處理器分配給哪個(gè)進(jìn)程。

內(nèi)核將所有進(jìn)程存放在雙向循環(huán)鏈表(進(jìn)程鏈表)中,其中鏈表的頭是init_task描述符。鏈表的每一項(xiàng)都是類型為task_struct,稱為進(jìn)程描述符的結(jié)構(gòu),該結(jié)構(gòu)包含了與一個(gè)進(jìn)程相關(guān)的所有信息,定義在文件中。task_struct內(nèi)核結(jié)構(gòu)比較大,它能完整地描述一個(gè)進(jìn)程,如進(jìn)程的狀態(tài)、進(jìn)程的基本信息、進(jìn)程標(biāo)識(shí)符、內(nèi)存相關(guān)信息、父進(jìn)程相關(guān)信息、與進(jìn)程相關(guān)的終端信息、當(dāng)前工作目錄、打開的文件信息、所接收到的信號(hào)信息等。

下面詳細(xì)講解task_struct結(jié)構(gòu)中最為重要的兩個(gè)域:state(進(jìn)程狀態(tài))和pid(進(jìn)程標(biāo)識(shí)符,即進(jìn)程號(hào))。

1)進(jìn)程狀態(tài),Linux中的進(jìn)程有以下幾種狀態(tài)

· 運(yùn)行狀態(tài)(TASK_RUNNING):進(jìn)程當(dāng)前正在運(yùn)行,或者正在運(yùn)行隊(duì)列中等待調(diào)度。

創(chuàng)建一個(gè)task.c文件,task.c文件內(nèi)容如下:

多任務(wù)編程

保存后,輸入gcc task.c -o task編譯生成二進(jìn)制代碼task,輸入./task運(yùn)行task進(jìn)程

多任務(wù)編程

打開另一個(gè)終端,輸入ps -aux查看進(jìn)程狀態(tài):(ps -axjf 可查看進(jìn)程有哪些子進(jìn)程,ps -e 也 可以查到進(jìn)程的狀態(tài),但只顯示進(jìn)程的PID、TTY、TIME和CMD)

ps工具標(biāo)識(shí)進(jìn)程的5中狀態(tài)碼:

D 不可中斷 uninterruptible sleep (usually IO)

R 運(yùn)行 runnable (on run queue)

S 中斷 sleeping

T 停止 traced or stopped

Z 僵尸 a defunct ("zombie") process

注:其它狀態(tài)還包括W(無駐留頁),<(高優(yōu)先級(jí)進(jìn)程),N(低優(yōu)先級(jí)進(jìn)程),L(內(nèi)存鎖頁)

每列對(duì)應(yīng)關(guān)系:

USER:進(jìn)程所有者

PID:進(jìn)程ID

%CPU:占用CPU的使用率

%MEM:占用內(nèi)存的使用率

VSZ:占用虛擬內(nèi)存大小

RSS:占用內(nèi)存大小

TTY:終端次要裝置號(hào)碼

STAT:進(jìn)程狀態(tài)

START:進(jìn)程啟動(dòng)時(shí)間

TIME:進(jìn)程消耗cup時(shí)間

COMMAND:命令的名稱和參數(shù)

多任務(wù)編程
多任務(wù)編程
多任務(wù)編程

· 可中斷的阻塞狀態(tài)(TASK_INTERRUPTIBLE):進(jìn)程處于阻塞(睡眠)狀態(tài),正在等待某些事件發(fā)生或能夠占用某些資源。處在這種狀態(tài)下的進(jìn)程可以被信號(hào)中斷。接收到信號(hào)或被顯式的喚醒呼叫(如調(diào)用wake_up系列宏:wake_up、wake_up_interruptible等)喚醒之后,進(jìn)程轉(zhuǎn)變?yōu)門ASK_RUNNING狀態(tài)。

· 不可中斷的阻塞狀態(tài)(TASK_UNINTERRUPTIBLE):此進(jìn)程狀態(tài)類似于可中斷的阻塞狀態(tài)(TASK_INTERRUPTILBE),只是它不會(huì)處理信號(hào),把信號(hào)傳遞到這種狀態(tài)下的進(jìn)程不能改變它的狀態(tài)。在一些特定的情況下(進(jìn)程必須等待,直到某些不可被中斷的事件發(fā)生),這種狀態(tài)是很有用的。只有在它所等待的事件發(fā)生時(shí),進(jìn)程被顯式的喚醒呼叫喚醒。

· 可終止的阻塞狀態(tài)(TASK_KILLABLE):Linux內(nèi)核2.6.25引入了一種新的進(jìn)程狀態(tài),名為TASK_KILLABLE。該狀態(tài)的運(yùn)行機(jī)制類似于TASK_UNINTERRUPTILBE,只不過在該狀態(tài)下的進(jìn)程可以響應(yīng)致命信號(hào)。它可以替代有效但可能無法終止的不可中斷的阻塞狀態(tài),以及易于喚醒安全性欠佳的可中斷的阻塞狀態(tài)。

· 暫停狀態(tài)(TASK_STOPPED):進(jìn)程的執(zhí)行被暫停,當(dāng)進(jìn)程收到SIGTOP、SIGTSTP、SIGTTIN、SIGTTOU等信號(hào)時(shí),就會(huì)進(jìn)入暫停狀態(tài)。

· 跟蹤狀態(tài)(TASK_TRACED):進(jìn)程的執(zhí)行被調(diào)試器暫停。當(dāng)一個(gè)進(jìn)程被另一個(gè)進(jìn)程監(jiān)控是(如調(diào)試器使用ptrace()系統(tǒng)調(diào)用監(jiān)控測(cè)試程序),任何信號(hào)都可以把這個(gè)進(jìn)程置于跟蹤狀態(tài)。

· 僵尸狀態(tài)(EXIT_ZOMBIE):進(jìn)程運(yùn)行結(jié)束,父進(jìn)程尚未使用wait函數(shù)族(如使用waitpid()函數(shù))等系統(tǒng)調(diào)用來“收尸”,即等待父進(jìn)程銷毀它。處于該狀態(tài)下的進(jìn)程“實(shí)體”已經(jīng)放棄了幾乎所有的內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能調(diào)度,僅僅在進(jìn)程列表保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集。

· 僵尸撤銷狀態(tài)(EXIT_DEAD):這是最終狀態(tài),父進(jìn)程調(diào)用wait函數(shù)族“收尸”后,進(jìn)程徹底有系統(tǒng)刪除。

它們之間的轉(zhuǎn)換關(guān)系如圖所示:

內(nèi)核可以使用set_task_state和set_current_state宏來改變指定進(jìn)程的狀態(tài)和當(dāng)前執(zhí)行進(jìn)程的狀態(tài)。

2)進(jìn)程標(biāo)識(shí)符

Linux內(nèi)核通過唯一的進(jìn)程標(biāo)識(shí)符PID來標(biāo)識(shí)每個(gè)進(jìn)程。PID存放進(jìn)程描述符的pid字段中,新創(chuàng)建的PID通常是前一個(gè)進(jìn)程的PID加1,不過PID的值有上限(最大值 = PID_MAX_DEFAULT - 1,通常為32767),我們可以在終端輸入 vim /proc/sys/kernel/pid_max 來確定該系統(tǒng)的進(jìn)程數(shù)上限。

當(dāng)系統(tǒng)啟動(dòng)后,內(nèi)核通常作為一個(gè)進(jìn)程的代表。一個(gè)指向task_struct的宏current用來記錄正在運(yùn)行的進(jìn)程。current經(jīng)常作為進(jìn)程描述符結(jié)構(gòu)指針的形式出現(xiàn)在內(nèi)核代碼中,例如,current->pid表示處理器正在執(zhí)行進(jìn)程的PID。當(dāng)系統(tǒng)需要查看所有的進(jìn)程時(shí),則調(diào)用for_each_process()宏,這將比系統(tǒng)搜索數(shù)組的速度要快得多。

在Linux中獲得當(dāng)前進(jìn)程的進(jìn)程號(hào)(PID)和父進(jìn)程號(hào)(PPID)的系統(tǒng)調(diào)用函數(shù)分別為getpid()和getppid()。

測(cè)試代碼:

測(cè)試結(jié)果:

輸入 ps -axjf 命令查看所有進(jìn)程與父進(jìn)程

我們?cè)诖屋斎雙s -aux命令查看所有進(jìn)程,可以得知父進(jìn)程為bash

進(jìn)程的創(chuàng)建、執(zhí)行和終止

1)進(jìn)程的創(chuàng)建和執(zhí)行

許多操作系統(tǒng)提供的都是產(chǎn)生進(jìn)程的機(jī)制,也就是說,首先在新的地址空間里創(chuàng)建進(jìn)程、讀入可執(zhí)行文件、最后在開始執(zhí)行。Linux中進(jìn)程的穿件很特別,它把上述步驟分解到兩個(gè)單獨(dú)的函數(shù)中去執(zhí)行:fork()和exec函數(shù)族。首先fork()函數(shù)通過復(fù)制當(dāng)前進(jìn)程創(chuàng)建一個(gè)子進(jìn)程,子進(jìn)程與父進(jìn)程的區(qū)別在于不同的PID、PPID和某些資源及統(tǒng)計(jì)量。exec函數(shù)族負(fù)責(zé)讀取可執(zhí)行文件并將其載入地址空間開始運(yùn)行。

要注意的是,Linux中的fork()函數(shù)使用的是寫時(shí)復(fù)制頁的技術(shù),也就是內(nèi)核在創(chuàng)建進(jìn)程時(shí),其資源并沒有被復(fù)制過來,資源的復(fù)制僅僅只有在需要寫入數(shù)據(jù)時(shí)才發(fā)生,在此之前只是以只讀的方式共享數(shù)據(jù)。寫時(shí)復(fù)制技術(shù)可以使Linux擁有快速執(zhí)行的能力,因此這個(gè)優(yōu)化是非常重要的。

2)進(jìn)程的終止

進(jìn)程終結(jié)也需要做很多繁瑣的收尾工作,系統(tǒng)必須保證回收進(jìn)程所占的資源,并通知父進(jìn)程。Linux首先把終止的進(jìn)程設(shè)置為僵尸狀態(tài),這時(shí),進(jìn)程無法投入運(yùn)行,它的存在只為父進(jìn)程提供信息,申請(qǐng)死亡。父進(jìn)程得到信息后,開始調(diào)用wait函數(shù)族,最后終止子進(jìn)程,子進(jìn)程占用的所有資源被全部釋放。

進(jìn)程的內(nèi)存結(jié)構(gòu)

Linux操作系統(tǒng)采用虛擬內(nèi)存管理技術(shù),使得每個(gè)進(jìn)程都有各自互不干涉的進(jìn)程地址空間。該地址空間是大小為4GB的線性虛擬空間(當(dāng)然是指32位系統(tǒng)),用戶所看到和接觸到的都是該虛擬地址,無法看到實(shí)際的物理內(nèi)存地址。利用這種虛擬地址不但能起到保護(hù)操作系統(tǒng)的效果(用戶不能直接訪問物理內(nèi)存),而且更重要的是,用戶程序可以使用比實(shí)際物理內(nèi)存更大的地址空間。

我們可以通過命令getconf LONG_BIT 來查詢當(dāng)前自己的系統(tǒng)是多少位的?

我的安裝的UbuntKylin是64位的,即實(shí)際內(nèi)存最大可能達(dá)到2^64 = 128GB。(2^10 = 1kb,2^30 = 1GB)。

4GB的進(jìn)程地址空間會(huì)被分出兩部分:用戶空間與內(nèi)核空間。用戶地址空間是從0~3GB(0xC0000000),內(nèi)存地址空間占據(jù)3GB~4GB。用戶進(jìn)程通常情況下只能訪問用戶控件的虛擬地址,不能訪問內(nèi)核空間的虛擬地址。只有用戶進(jìn)程使用系統(tǒng)調(diào)用(代表用戶進(jìn)程在內(nèi)核執(zhí)行)時(shí)可以訪問內(nèi)核空間的虛擬空間。每當(dāng)進(jìn)程切換時(shí),用戶空間就會(huì)跟著變化;而內(nèi)核空間有內(nèi)核負(fù)責(zé)映射,它并不會(huì)跟著進(jìn)程改變而改變,是固定的。內(nèi)核空間地址有自己對(duì)應(yīng)的頁表,用戶進(jìn)程各自用不同的頁表。每個(gè)進(jìn)程用戶空間都是完全獨(dú)立、互不相干的。進(jìn)程的虛擬內(nèi)存地址空間如圖所示:

其中用戶空間包括以下幾個(gè)功能區(qū)域:

· 只讀段:包含程序代碼(.init和.exit)和只讀數(shù)據(jù)(.rodata)

· 數(shù)據(jù)段:存放的是全局變量和靜態(tài)變量。其中可讀可寫數(shù)據(jù)段(.data)存放已經(jīng)初始化的全局變量和靜態(tài)變量,BSS數(shù)據(jù)段(.bss)存放未初始化的全局變量和靜態(tài)變量

· 堆:由系統(tǒng)自動(dòng)分配釋放,存放函數(shù)的參數(shù)值、局部變量的值、返回地址等

· 堆棧:存放動(dòng)態(tài)分配的數(shù)據(jù),一般由程序員動(dòng)態(tài)分配和釋放。若程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)回收。

· 共享庫的內(nèi)存映射區(qū)域:這是Linux動(dòng)態(tài)連接器和其他共享庫代碼的映射區(qū)域。

由于在Linux系統(tǒng)中每一個(gè)進(jìn)程都會(huì)有/proc文件系統(tǒng)下與之對(duì)應(yīng)的一個(gè)目錄(如將init進(jìn)程的相關(guān)信息在/proc/1 目錄下的文件中描述,1表示init進(jìn)程的進(jìn)程號(hào)),因此通過proc文件系統(tǒng)可以查看某個(gè)進(jìn)程的地址空間的映射情況。

測(cè)試代碼:

運(yùn)行此程序:

輸入 size task

text:存放的是代碼 data:存放的是初始化過的全局變量或靜態(tài)變量 bss:存放的是未初始化的全局變量或靜態(tài)變量

輸入命令 cat /proc/3834/maps 其中3834是task的PID

3、線程

前面已經(jīng)提到,進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。每個(gè)進(jìn)程都擁有自己的數(shù)據(jù)段、代碼段和堆棧段,這就造成了進(jìn)程進(jìn)程切換等操作時(shí)需要較復(fù)雜的上下文切換等動(dòng)作。為了進(jìn)一步減少處理機(jī)制的空轉(zhuǎn)時(shí)間,支持多處理器及減少上下文切換開銷,進(jìn)程在演化中出現(xiàn)了另一個(gè)概念——線程。它是進(jìn)程內(nèi)獨(dú)立的一條運(yùn)行路線,是處理器調(diào)用的最小單元,也可以成為輕量級(jí)進(jìn)程。線程可以對(duì)進(jìn)程的內(nèi)存空間和資源進(jìn)程訪問,并與同一個(gè)進(jìn)程中的其他線程共享。因此,線程上下文切換的開銷比創(chuàng)建進(jìn)程小得多。

一個(gè)進(jìn)程可以擁有多個(gè)線程,每個(gè)線程必須有一個(gè)父進(jìn)程。線程不擁有系統(tǒng)資源,它只具有運(yùn)行所必需的一些數(shù)據(jù),如堆棧、寄存器與線程控制塊(TCB),線程與其父進(jìn)程的其他線程共享該進(jìn)程所擁有的全部資源。要注意的是,由線程共享了進(jìn)程的資源和地址空間,因此,任何線程對(duì)系統(tǒng)資源的操作都會(huì)給其他線程帶來影響。由此可知,多線程中的同步是非常重要的問題。在多線程系統(tǒng)中,進(jìn)程與線程的關(guān)系如圖所示:

在Linux系統(tǒng)中,線程可以分為以下3種:

用戶級(jí)線程

用戶級(jí)線程主要解決的是上下文切換的問題,它的調(diào)度算法和調(diào)度過程全部由用戶自己選擇決定,在運(yùn)行時(shí)不需要特定的內(nèi)核支持。在這里,操作系統(tǒng)往往會(huì)提供一個(gè)用戶空間的線程庫,該線程庫提供了線程的創(chuàng)建、調(diào)度和撤銷等功能,而內(nèi)核仍然僅對(duì)進(jìn)程進(jìn)行管理。如果一個(gè)進(jìn)程中的某一個(gè)線程調(diào)用了一個(gè)阻塞的系統(tǒng)調(diào)用函數(shù),那么該進(jìn)程好吧該進(jìn)程中的其他所有線程也同時(shí)被阻塞。這種用戶級(jí)線程的主要缺點(diǎn)是在一個(gè)進(jìn)程的多個(gè)線程的調(diào)度中無法發(fā)揮多處理器的優(yōu)勢(shì)。

輕量級(jí)進(jìn)程

輕量級(jí)進(jìn)程是內(nèi)核支持的用戶線程,是內(nèi)核線程的一種抽象對(duì)象。每個(gè)線程擁有一個(gè)或多個(gè)輕量級(jí)進(jìn)程,而每個(gè)輕量級(jí)進(jìn)程分別被綁定在一個(gè)內(nèi)核線程上。

內(nèi)核線程

內(nèi)核線程允許不同進(jìn)程中的線程按照同一相對(duì)優(yōu)先調(diào)度方法進(jìn)行調(diào)度,這樣就可以發(fā)揮多處理器的并發(fā)優(yōu)勢(shì),F(xiàn)在大多數(shù)系統(tǒng)都采用用戶級(jí)線程與核心級(jí)線程并存的方法。一個(gè)用戶級(jí)線程可以對(duì)應(yīng)一個(gè)或幾個(gè)核心級(jí)線程,也就是“一對(duì)一”或“多對(duì)一”模型。這樣既可以滿足多處理系統(tǒng)的需要,也可以最大限度地減少調(diào)度開銷。

使用線程機(jī)制大大加快了上下文切換速度,而節(jié)省了很多資源。但是因?yàn)樵谟脩魬B(tài)和內(nèi)核態(tài)均要實(shí)現(xiàn)調(diào)度管理,所有會(huì)增加實(shí)現(xiàn)的復(fù)雜度和引起優(yōu)先級(jí)翻轉(zhuǎn)的可能性。同時(shí),一個(gè)多線程程序的同步設(shè)計(jì)與調(diào)試也會(huì)增加程序?qū)崿F(xiàn)的難道。

上一篇:android ui 組件最常用的都在這里,經(jīng)典中的經(jīng)典

下一篇:進(jìn)程標(biāo)識(shí)符詳解,讓你對(duì)進(jìn)程標(biāo)識(shí)符有深入理解

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5,京公海網(wǎng)安備11010802025203號(hào)

回到頂部