作業系統中最核心的概念是程序,它是對正在執行程式的乙個抽象,包括作業系統。乙個程序就是乙個正在執行程式的例項,包括程式計數器、暫存器和變數的當前值。下圖中有四個程序,但是只有乙個物理程式計數器。在執行其中某個程式時,例如執行a程序,此時程序a的邏輯程式計數器就會被載入到物理程式計數器中。
並且在實際的執行當中,只有乙個程式在執行。雖然現在多核的cup盛行,但是即使是多核的cpu每個核就只能執行乙個程序。而實現並行操作,實際上就是不停地切換不同的程序,使使用者感覺上像是多個程式在同時執行(每個程序間的切換時間很短且很頻繁)。所以實際上我們在對程序程式設計時絕對不可以做任何時序上的假設。
「單個程序可以被若干個程序共享,它使用某種排程演算法決定何時停止乙個程序的工作,並轉向另乙個程序提供服務。」而同乙個程式開啟兩次,算作是兩個程序。這點需要額外注意。
有以下4中情況會導致程序的建立:
系統初始化。
執行正在執行的程序所呼叫的程序建立系統呼叫。
使用者請求建立乙個程序。
乙個批處理作業的初始化。
新程序都是由乙個已存在的程序由於工作需要而建立的,其使用建立程序的系統呼叫來建立新的程序。在unix系統中,fork()系統呼叫是用來建立新程序的。在呼叫這個系統呼叫後,兩個程序(父程序和子程序)會擁有相同的儲存映像、同樣的環境字串和同樣的代開檔案。子程序接著執行execve或乙個類似的系統操作後,可以修改子程序儲存映像並執行乙個新的程式。其實實際上就是把所需要在該子程序中執行的**複製到該子程序的儲存映像中。
在建立新的程序後,子程序和父程序的位址空間是不同的。但是需要強調的是,子程序的位址空間是父程序的位址空間的乙個副本。這兩個程序之間的部分資源是共享的,如:開啟的檔案等。但是程式計數器、暫存器等資源是互不相關的。
程序的終止發生在以下4種情況:
正常退出(自願的)。
出錯退出(自願的)。
嚴重錯誤(非自願的)。
被其他程序殺死(非自願的)。
執行態(該時刻程序實際占用cpu)
就緒態(可執行,但是因為其他程序正在執行而暫停執行)
阻塞態(除非某種外部事件發生,否則程序不能執行)
在作業系統發現程序不能進行下去時,發生轉換1。轉換2和3是由程序排程程式引起的,程序排程程式是作業系統的一部分。當作業系統認為某個程序執行的時間足夠久了,那麼作業系統會將當前執行的程式切換到就緒態,讓另乙個處於就緒態的程序開始執行。另外,在等待例如外部鍵盤輸入時,程序會被切換到阻塞態,一旦完成資料的輸入會直接切換到執行態。
在程序的執行的過程當中,作業系統需要去維護一張程序表。每個程序占用乙個程序表項。每個表項包括程式計數器、堆疊指標、記憶體分配情況、所開啟檔案的狀態,以及其他在程序由執行態切換到就緒態或阻塞態時必須儲存的資訊,從而保證該程序在隨後啟動後能夠正確執行。
現代作業系統 程序與執行緒
多道程式設計 實際上cpu在各個程序之間來回切換。由於cpu在各程序之間來回快速切換,所以每個程序執行其運算的速度是不確定的,對程式設計進行程式設計時不能做出任何想當然的假設。程序的建立與寫時複製 在unix系統中,只有乙個系統呼叫可以用來建立新程序 fork,程序建立後,子程序共享父程序的所有記憶...
現代作業系統 程序和執行緒
概念 對正在執行程式的乙個抽象。偽並行 由於cpu在各個程序中的切換時間很短 幾十毫秒到幾百毫秒 所以在1s內它可以執行多個程序,這樣就產生了並行的錯覺。這就是說乙個cpu在乙個時間點只能執行乙個程序,在下乙個時間點切換到另外乙個程序,造成同時執行的錯覺。程序和程式 程式就是一些 用一些語言來描述演...
作業系統之程序與執行緒3
訊息傳遞 訊息組成的鍊錶,放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少 管道只能承載無格式位元組流以及緩衝區大小受限等缺點 共享記憶體允許多個程序共享乙個給定的記憶體區域,這一段儲存區可以被共享的程序對映至自身的位址空間中,乙個程序寫入共享記憶體的資訊,可以被其他使用這個共享記憶...