程序:程序是作業系統的核心,是執行任務的單元。程序都是有對應的實體,每乙個程序被建立,系統會為他分配儲存空間等必要資源,然後在核心管理區為該程序建立管理節點,方便控制和控制程序的執行。
執行緒:執行緒的作業系統的運算排程的最小單元,是包含在程序之中。
1、目的:程序和執行緒都是用實現多工併發的技術收端,都可以獨立排程
程序是資源分配的基本單元,執行緒是排程的基本單元。程序的個體之間是相互獨立,但是執行緒資料之間是共存的。
程序使用:
fork:父程序的全部資源複製給子程序,
vfork:1、子程序和父程序共享資源。2、父程序和子程序有前後關係:子程序結束之後,父程序才會開始執行。特殊點:一般vfork之後都會使用execv啟動乙個全新的程序
執行緒:pthread_create:建立執行緒,基於clone的核心介面呼叫。
資料的獨立性:
程序會複製父程序的資料,子程序可以直接進行操作父程序的資料,
子執行緒和父執行緒共用資料,父執行緒不能使用乙個變數來執行accept,因為在子執行緒還沒有來的及複製這個變數的時候,這個父執行緒還不能處理子accept的返回值,這個時候需要執行緒間通訊,效率有些影響。
但是程序之間需要資料交換就需要進行程序間通訊。
程序繼承:
子程序會繼承父程序的所有資料也包括了套接字,這個時候針對多工設計模式設計又有特殊避免遺漏的地方(套接字,子程序關閉了但是父程序還是保留有)
程序間通訊:共享記憶體、訊息佇列、訊號量、有名管道、無名管道、訊號。程序間通訊主要是兩種方式:1、核心切換上下文;2、與外設訪問。這個兩個存在速度和效率的問題。
執行緒間通訊:程序間通訊、互斥量、自旋鎖、條件變數、讀寫鎖、執行緒訊號、全域性變數
鎖特殊點:
1、,程序的單點故障並不會損毀資料,當然這不一定全是優點。比如,程序崩潰前對訊號量加鎖,崩潰後重啟,然後再次進入執行狀態,此時直接進行加鎖,可能造成死鎖,程式再也無法繼續運轉。需要確認
1、兩者的標識不同:程序有程序的pid,是乙個int變數 ;2、執行緒有執行緒的pid . 是乙個long變數
2、資源的**控制:當子程序結束要**時(子程序呼叫exit()退出或**執行完),需要通過wait()系統呼叫來進行,未**的消亡程序會成為殭屍程序。主要是孤兒程序、殭屍程序。
執行緒:主動終止需要呼叫pthread_exit() ,主線程需要呼叫pthread_join()來**(前提是該執行緒沒有被detached
程序池:
1、首先建立了一批程序,就得管理,也就是你得分開儲存程序id,可以用陣列,也可用鍊錶。建議用陣列,這樣可以實現常數內找到某個執行緒,而且既然做了程序池,就預先估計好了生產多少程序合適,一般也不會再動態延展。就算要動態延展,也能預估範圍,提前做乙個足夠大的陣列。不為別的,就是為了快速響應。本來錯程序池的目的也是為了效率。接下來就要讓閒置程序冬眠了,可以讓他們pause()掛起,也可用訊號量掛起,還可以用ipc阻塞,方法很多,分析各自優缺點根據實際情況採用就是了。
2、分配任務,當你有任務的時候就要讓他幹活了。喚醒了程序,讓它從哪兒開始幹呢?肯定得用到程序間通訊了,比如訊號喚醒它,然後讓它在預先指定的地方去讀取任務,可以用函式指標來實現,要讓它幹什麼,就在約定的地方設定**段指標。這也只是告訴了它怎麼幹,還沒說幹什麼(資料條件),再通過共享記憶體把要處理的資料設定好,這也子程序就知道怎麼做了。幹完之後再來一次程序間通訊然後自己繼續冬眠,父程序就知道孩子幹完了,收割成果。
3、最後結束時**子程序,向各程序傳送訊號喚醒,改變啟用狀態讓其主動結束,然後逐個wait()就可以了。
執行緒池:
執行緒池的思想與上述類似,只是它更為輕量級,所以排程起來不用等待額外的資源。要讓執行緒阻塞,用條件變數就是了,需要幹活的時候父執行緒改變條件,子執行緒就被啟用。執行緒間通訊方式就不用贅述了,不用繁瑣的通訊就能達成,比起程序間效率要高一些。執行緒幹完之後自己再改變條件,這樣父執行緒也就知道該收割成果了。整個程式結束時,逐個改變條件並改變啟用狀態讓子執行緒結束,最後逐個**即可。
linux程序和執行緒
這兩天一直在看linxu程序和執行緒的東西,總是效率比較低,這麼一點基礎的東西還看了這麼久。該自我反省一下。首先來看看程序。程序分為三個部分,程序控制塊,程式段和資料段。程序是乙個有生命的實體,程式是乙個沒有生命的實體。只有cpu賦予程式生命的時候,程式才成為乙個活動的實體,我們稱之為 程序 每乙個...
Linux程序和執行緒
linux核心只有程序,沒有執行緒的概念。非要說區別,那就是執行緒沒有自己的單獨的位址空間 mm struct 執行緒和其父程序共享位址空間。pthread呼叫fork clone vm 來建立新的程序,子程序與父程序共享vm空間。注意,這裡實際上是共享mm struct結構,子程序甚至沒有建立自己...
linux 程序和執行緒
程序和執行緒 程序 process 和執行緒 thread 是作業系統的基本概念,下面用乙個模擬,來解釋它們。1.計算機的核心是cpu,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。2.假定工廠的電力有限,一次只能供給乙個車間使用。也就是說,乙個車間開工的時候,其他車間都必須停工。背後的含義就...