linux 2.6進程與線程

來源:互聯網
上載者:User

1 >    線程和進程的差別
線程機制支援並發程式設計技術,在多處理器上能真正保證平行處理。而在linux實現線程很特別,linux把所有的線程都當作線程實現。
linux下線程看起來就像普通進程(只是該進程和其他進程共用資源,如地址空間)。上述機制與Microsoft windows或是Sun
Solaris實現
差異很大。這些系統提供專門支援線程機制(輕量級進程)。
在現代作業系統中,進程支援多線程。進程是資源管理及分配的最小單元;而線程是程式執行的最小單元。一個進程的組成實體可以分為兩大部分:線程集和資源
集。進程中的線程是動態對象,代表了進程指令的執行過程。資源,包括地址空間、開啟的檔案、使用者資訊等等,由進程內的線程共用。線程有自己的私人資料:
程式計數器,棧空間以及寄存器。
現實中有很多需要並發處理的任務,如資料庫的伺服器端、網路伺服器、大容量計算等。
如果採用多進程的方法,則有如下問題:
      1> fork一個子進程的消耗是很大的,fork是一個昂貴的系統調用。
      2> 各個進程擁有自己獨立的地址空間,進程間的協作需要複雜的IPC技術,如訊息傳遞和共用記憶體等。
線程推廣了進程的概念,使一個進程可以包含多個活動(或者說執行序列等等)。多線程的優點和缺點實際上是對立統一的。使用線程的優點在於:
      1> 改進程式的即時響應能力;
      2> 更有效使用多處理器,真正的並行(parallelism);
      3> 改進程式結構,具備多個控制流程;
      4> 通訊方便,由於共用進程的代碼和全域資料;
      5>
減少對系統資源的使用。對屬於同一個進程的線程之間進行調度切換時不需要調用系統調用,因此將減少額外的消耗,往往一個進程可以啟動上千個線程也沒有什麼
問題。
缺點在於:
由於各線程共用進程的地址空間,因此可能會導致競爭,因此對某一塊有多個線程要訪問的資料需要一些同步技術。

2 >     線程的分類
2.1     核心線程
Linux核心可以看作一個服務進程(管理軟硬體資源,響應使用者進程的種種合理以及不合理的請求)。核心需要多個執行流並行,為了防止可能的阻塞,多線程
化是必要的。核心線程就是核心的分身,一個分身可以處理一件特定事情。Linux核心使用核心線程來將核心分成幾個功能模組,像kswapd、
kflushd等,這在處理非同步事件如非同步IO時特別有用。核心線程的使用是廉價的,唯一使用的資源就是核心棧和環境切換時儲存寄存器的空間。支援多線
程的核心叫做多線程核心(Multi-Threads kernel
)。核心線程的調度由核心負責,一個核心線程處於阻塞狀態時不影響其他的核心線程,因為其是調度的基本單位。這與使用者線程是不一樣的。
2.2使用者線程
使用者線程在使用者空間中實現,核心並沒有直接對使用者線程進程調度,核心的調度對象和傳統進程一樣,還是進程本身,核心並不知道使用者線程的存在。
由於Linux核心沒有輕量級進程(線程)的概念,因此不能獨立的對使用者線程進行調度,而是由一個線程運行庫來組織線程的調度,其主要工作在於在各個線程
的棧之間調度。如果一個進程中的某一個線程調用了一個阻塞的系統調用,整個進程就會被發送器切換為等待狀態,其他線程得不到啟動並執行機會。因此linux
使用了非同步I/O機制。

3 >     核心線程
核心線程(thread)或叫守護進程(daemon),在作業系統中佔據相當大的比例,當Linux作業系統啟動以後,尤其是X
window也啟動以後,你可以用”ps -ef”命令查看系統中的進程,這時會發現很多以”d”結尾的進程名,確切說名稱顯示裡面加
"[]"的,這些進程就是核心線程。系統的啟動是從硬體->核心->使用者態進程的,pid的分配是一個往前的迴圈的過程,所以隨系統啟動的內
核線程的pid往往很小。
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:42 ?        00:00:01 /sbin/init
root         2     0  0 09:42 ?        00:00:00 [kthreadd]
root         3     2  0 09:42 ?        00:00:00 [migration/0]
root         4     2  0 09:42 ?        00:00:00 [ksoftirqd/0]
root         5     2  0 09:42 ?        00:00:00 [watchdog/0]
root         6     2  0 09:42 ?        00:00:00 [events/0]
root         7     2  0 09:42 ?        00:00:00 [khelper]
root        40     2  0 09:42 ?        00:00:00 [kblockd/0]
root        64     2  0 09:42 ?        00:00:00 [kseriod]
root       110     2  0 09:42 ?        00:00:00 [pdflush]
root       111     2  0 09:42 ?        00:00:00 [pdflush]
root       112     2  0 09:42 ?        00:00:00 [kswapd0]
root       151     2  0 09:42 ?        00:00:00 [aio/0]
root      1327     2  0 09:42 ?        00:00:00 [ksuspend_usbd]
root      1330     2  0 09:42 ?        00:00:00 [khubd]
root      1362     2  0 09:42 ?        00:00:00 [ata/0]
root      1370     2  0 09:42 ?        00:00:00 [ata_aux]
root      1428     2  0 09:42 ?        00:00:00 [scsi_eh_0]
root      1430     2  0 09:42 ?        00:00:01 [scsi_eh_1]
root      2304     2  0 09:42 ?        00:00:00 [kjournald]
root      2507     1  0 09:42 ?        00:00:00 /sbin/udevd --daemon
root      2787     2  0 09:42 ?        00:00:00 [kgameportd]
root      3698     2  0 09:42 ?        00:00:00 [kapmd]
root      3872     2  0 09:42 ?        00:00:00 [kjournald]
3.1     核心線程
      events 處理核心事件 很多軟硬體事件(比如斷電,檔案變更)被轉換為events,並分發給對相應事件感興趣的線程進行響應
      ksoftirqd 處理非強制中斷
硬體中斷處理往往需要關中斷,而這個時間不能太長,否則會丟失新的中斷。所以中斷處理的很大一部分工作移出,轉給任勞任怨的ksoftirqd在中斷之外
進行處理。比如一個網路包,從網卡裡面取出這個過程可能需要關中斷,但是TCP/IP協議處理就不必關中斷了
      kblockd 管理磁碟塊讀寫
      kjournald Ext3檔案系統的日誌管理 通常每個 _已mount_ 的 Ext3分區會有一個
kjournald看管,各分區的日誌是獨立
      pdflush dirty記憶體頁面的回寫
太多dirty的頁面意味著風險,比如故障時候的內容丟失,以及對突發的大量實體記憶體請求的響應(大量回寫會導致糟糕的回應時間)
      kswapd 記憶體回收 確保系統空閑實體記憶體的數量在一個合適的範圍
      aio 代替使用者進程管理io 用以支援使用者態的AIO
      
3.2     使用者進程
      crond 執行定時任務
      init 為核心建立的第一個線程。引導使用者空間服務,管理孤兒線程,以及運行層級的轉換
      
      mingetty 等待使用者從tty登入
      bash shell進程,一個命令列形式的系統介面;接受使用者的命令,並進行解釋、執
      sshd ssh登入、檔案傳輸、命令執行 等操作的服務進程
      klogd 從核心資訊緩衝區擷取列印資訊。核心在發現異常的時候,往往會輸出一些訊息給使用者,這個對於故障處理很有用
      syslogd 系統日誌進程
      udevd 支援使用者態裝置操作 (userspace device)
      
      
4>     建立線程 clone_flags   
最初的進程定義都包含程式、資源及其執行三部分,其中程式通常指代碼,資源在作業系統層面上通常包括記憶體資源、IO資源、訊號處理等部分,而程式的執行通
常理解為執行內容,包括對cpu的佔用,後來發展為線程。線上程概念出現以前,為了減小進程切換的開銷,作業系統設計者逐漸修正進程的概念,逐漸允許將
進程所佔有的資源從其主體剝離出來,允許某些進程共用一部分資源,例如檔案、訊號,資料記憶體,甚至代碼。應用程式可以通過一個統一的clone()系統調
用介面,用不同的參數指定建立輕量進程還是普通進程。在核心中,clone()調用經過參數傳遞和解釋後會調用do_fork(),這個核內函數同時也是
fork():
long do_fork(unsigned long                   clone_flags,             
                                                                       
                              unsigned long stack_start,
struct pt_regs *regs,
unsigned long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr)
其中的clone_flags取自以下宏的"或"值:
在 do_fork()中,不同的clone_flags將導致不同的行為,對於LinuxThreads,它使用(CLONE_VM |
CLONE_FS | CLONE_FILES |
CLONE_SIGHAND)參數來調用clone()建立"線程",表示共用記憶體、共用檔案系統訪問計數、共用檔案描述符表,以及共用訊號處理方式。本
節就針對這幾個參數,看看Linux核心是如何?這些資源的共用的。
1.CLONE_VM
do_fork()需要調用copy_mm()來設定task_struct中的mm和active_mm項,這兩個mm_struct資料與進程所關聯
的記憶體空間相對應。如果do_fork()時指定了CLONE_VM開關,copy_mm()將把新的task_struct中的mm和
active_mm設定成與
current的相同,同時提高該mm_struct的使用者數目(mm_struct::mm_users)。也就是說,輕量級進程與父進程共用記憶體地
址空間,由示意可以看出mm_struct在進程中的地位:
2.CLONE_FS
task_struct 中利用fs(struct fs_struct
*)記錄了進程所在檔案系統的根目錄和目前的目錄資訊,do_fork()時調用copy_fs()複製了這個結構;而對於輕量級進程則僅增加
fs->count計數,與父進程共用相同的fs_struct。也就是說,輕量級進程沒有獨立的檔案系統相關的資訊,進程中任何一個線程改變當前
目錄、根目錄等資訊都將直接影響到其他線程。
3.CLONE_FILES
一個進程可能開啟了一些檔案,在進程結構 task_struct中利用files(struct files_struct
*)來儲存進程開啟的檔案結構(struct
file)資訊,do_fork()中調用了copy_files()來處理這個進程屬性;輕量級進程與父進程是共用該結構的,copy_files()
時僅增加files->count計數。這一共用使得任何線程都能訪問進程所維護的開啟檔案,對它們的操作會直接反映到進程中的其他線程。
4.CLONE_SIGHAND
每一個Linux進程都可以自行定義對訊號的處理方式,在task_struct中的sig(struct
signal_struct)中使用一個struct
k_sigaction結構的數組來儲存這個配置資訊,do_fork()中的copy_sighand()負責複製該資訊;輕量級進程不進行複製,而僅
僅增加signal_struct::count計數,與父進程共用該結構。也就是說,子進程與父進程的訊號處理方式完全相同,而且可以相互更改。
儘管Linux支援輕量級進程,但並不能說它就支援核心級線程,因為Linux的"線程"和"進程"實際上處於一個調度層次,共用一個進程標識符空間,這
種限制使得不可能在Linux上實現完全意義上的POSIX線程機制,因此眾多的Linux線程庫實現嘗試都只能儘可能實現POSIX的絕大部分語義,並
在功能上儘可能逼近。

本文來自ChinaUnix部落格,如果查看原文請點:
http://blog.chinaunix.net/u1/55599/showart_1271977.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.