程序排程的認識和小結

2021-08-19 13:33:15 字數 2650 閱讀 1149

1.資源繼承

fork()函式,分叉函式

呼叫fork()函式,可以生成當前程式的副本(子程序)。 子程序有複製來自父程序的堆疊段和資料空間(包括流緩衝區)。之後由系統排程演算法決定執行哪乙個程序先執行(包括顯示中終端命令列的程序也會參與系統資源的爭奪)。

如在下面的兩個程式中,就因為乙個'\n',而使兩個程式出現的結果,有別於以往的認識。

程式一:

#include#include#include int main()

else

return 0;

}

執行結果:

不知道你們注意到沒有,子程序它的父程序竟然與最開始的程序的id不一樣,原因就是因為顯示終端命令的程序也參與了系統資源的競爭,此時子程序沒能競爭上,所以他(3754程序)的父程序就變成了2170(顯示終端命令的程序)。

程式二:

#include#include#include int main()

else

return 0;

}

執行結果:

可以看到在程式二中,before fork... 只出現了一次。這是因為printf的輸出機制,當printf中沒有'\n'時,只是先將內容放入標準輸出佇列緩衝區中,所以在程式一,子程序也擁有了(繼承但不是共享)父程序緩衝區的內容。而當遇到了'\n', 此時會重新整理標準輸出佇列(stdout),因此,在程式二中,也就只有乙個before fork...

2.程序併發執行和併發控制

(1)併發執行

程式三:

#include#includeint main()

return 0;

}

執行結果:

三個程序隨機排程,理論上還有其他的結果bbb aaa ccc等。

(2)併發控制

lockf函式

int lockf(int fd, int cmd, off_t len);

/*fd代表檔案描述符(0為寫入(stdin),1為輸出(stdout))

cmd操作控制值(0~3),0代表開鎖,1代表加鎖

len代表要鎖定或解鎖的連續位元組數。0表示從呼叫lockf()後開始鎖定

*/

程式四:

#include#includeint main()

return 0;

}

執行結果:

因為結果太長,這裡只擷取了一部分,為了使效果更加明顯,輸出了1000個children單詞和100個son和100個daughter單詞。可以看到程式四和程式三隻是輸出的次數和內容不同,總體框架是一樣的,但在程式四中,程序之間的排程會給人一種很亂的感覺。某個程序的單詞插到了另外程序的單詞中了。這是因為在呼叫父程序輸出children時, 此時使用的是外設(列印到螢幕上),父程序會進入阻塞狀態,cpu程序數少乙個,就要排程其他的程序,比如呼叫了son這個程序,那麼它也要使用輸出的外設,而此時這個外設(列印到螢幕上)我們並沒有給它加鎖,因此它會去和children競爭這個裝置,同理daughter也一樣,結果就是正如我們所看到的一樣。在程式五中,加上了鎖,此時其他程序,只能等待當前外設的解鎖。

程式五

#include#includeint main()

else

else

}return 0;

}

執行結果:

可以看到單詞不會亂串了。

最後,補充一點exit(0),只是造成該程序終止,不一定是整個程式的結束(如果這個程式只有乙個程序的話)。

1. gcc code.c -o code#編譯鏈結並形成可執行檔案code

2. vim 下**格式化(**格式化參考:

(1)gg到第一行

(2)shift+v   轉到可視模式

(3)shift+g  全選

(4) 按下 =

3. linux shell 重複執行n次同一命令:seq n|xargs -i cmd (效果:執行cmd命令n次, 順序執行)

作業排程和程序排程的區別

處理機排程是作業系統的主要功能之一,它的實現策略決定了作業系統的型別,其排程演算法的優劣直接影響整個系統的效能。處理機排程的任務是選出待分派的作業或程序,為之分配處理機。一般來說,處理機排程可分為三個級別,分別是高階排程 中級排程和低階排程。高階排程又稱作業排程,作業就是使用者程式及其所需的資料和命...

程序排程和程序時間

由核心決定 排程策略,排程優先順序 nice值決定優先順序,nice越低優先順序越高 nice的範圍在 0 2 nzero 1 nzero是系統預設的nice值 只有特權程序允許提高排程許可權 關於nzero 定義nzero的標頭檔案因系統而異,除了標頭檔案,linux3.2 可以通過非標準的sys...

程序管理和排程 排程器的實現

2.5 排程器的實現 記憶體中儲存了對每個程序的唯一描述,並通過若干結構域其他程序鏈結起來。排程器面對的情形就是這樣,器任務是在程式之間共享cpu時間,創造並行執行的錯覺。正如以上的討論,改任務分為兩個不同部分 乙個設計排程策略,另乙個設計上下文切換 2.5.1 概觀 核心必須提供一種方法,在各個程...