【刷題】線程與進程 & 線程池

線程的幾個狀態:

  • 被建立;運行;凍結;消亡。
  • 運行:具有CPU的執行資格,具有CPU的執行權;
  • 凍結:釋放了CPU的執行權,釋放了CPU的執行資格;
  • 臨時阻塞狀態:
  • 注:網上有別的說法,5種或6種

線程與進程

區別:linux

進程是資源分配的最小單位,線程是程序執行的最小單位(資源調度的最小單位)
進程有本身的獨立地址空間,每啓動一個進程,系統就會爲它分配地址空間,創建數據表來維護代碼段、堆棧段和數據段,這種操做很是昂貴。而線程是共享進程中的數據的,使用相同的地址空間,所以CPU切換一個線程的花費遠比進程要小不少,同時建立一個線程的開銷也比進程要小不少。
線程之間的通訊更方便,同一進程下的線程共享全局變量、靜態變量等數據,而進程之間的通訊須要以通訊的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。
可是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另一個進程形成影響,由於進程有本身獨立的地址空間。
進程與線程的資源多線程

線程共享:進程代碼段、進程的公有數據(利用這些共享的數據,線程很容易的實現相互之間的通信)、進程打開的文件描述符、信號的處理器、進程的當前目錄和進程用戶ID與進程組ID。
線程獨有:棧(保存其運行狀態和局部自動變量)、程序計數器。
進程與線程的同步函數

進程:無名管道、有名管道、信號、共享內存、消息隊列、信號量
線程:互斥量、讀寫鎖、自旋鎖、線程信號、條件變量
殭屍進程性能

定義:一個進程使用fork建立子進程,若是子進程退出,而父進程並無調用wait或者waitpid獲取子進程的狀態信息,那麼子進程的進程描述符等一系列信息還會保存在系統中。這種進程稱之爲僵死進程。
危害:在Unix系統管理中,當用ps命令觀察進程的執行狀態時,常常看到某些進程的狀態欄爲defunct,這就是所謂的「殭屍」進程。「殭屍」進程是一個早已死亡的進程,但在進程表(processs table)中仍佔了一個位置(slot)。因爲進程表的容量是有限的,因此,defunct進程不只佔用系統的內存資源,影響系統的性能,並且若是其數目太多,還會致使系統癱瘓。
處理方法:
改寫父進程,在子進程死後要爲它收屍。具體作法是接管SIGCHLD信號。子進程死後,會發送SIGCHLD信號給父進程,父進程收到此信號後,執行waitpid()函數爲子進程收屍。這是基於這樣的原理:就算父進程沒有調用wait,內核也會向它發送SIGCHLD消息,儘管默認處理是忽略,若是想響應這個消息,能夠設置一個處理函數。
把父進程殺掉。父進程死後,殭屍進程成爲」孤兒進程」,過繼給1號進程init,init始終會負責清理殭屍進程.它產生的全部殭屍進程也跟着消失。
孤兒進程線程

父進程運行結束,但子進程還在運行(未運行結束)的子進程就稱爲孤兒進程。孤兒進程最終會被init進程(進程號爲1)所收養,所以init進程此時變成孤兒進程的父進程,並由init進程對它們完成狀態收集工做。(linux下,init是內核啓動的第一個用戶級進程,init有許多很重要的任務,好比像啓動getty(用於用戶登陸)、實現運行級別、以及處理孤立進程。)隊列

線程池

相關文章
相關標籤/搜索