計算機啟動的時候最後執行的是main.c中的main
main中的fork()建立了第乙個程序
if(!fork())
init執行了shell(如果是windows,桌面)
shell的核心**:
pcb+狀態+佇列
用pcb放在不同的佇列中,用狀態推進這多個程序 進行狀態轉換
當然不是所有的程序都在就緒佇列中,還有一些程序在等待佇列中,等待某一事件,就比如我們在食堂買飯,沒帶飯卡,就算排到你了,你也買不了,只能等待,等待有卡的時候,程序也是,就算排到它了,它也不能執行
程序狀態圖:
例:下圖
乙個程序要啟動磁碟讀寫
把它的狀態設為等待狀態『w』;
將它放入等待佇列;
schedule()是切換;
如何排程
switch_to()如下圖
如右圖,讓pcb1=cpu中的pcb,然後讓cpu中的pcb=pcb2
當然記錄這些得精細的記錄cpu的哪個暫存器放在**等,所以c**是不行的,要寫彙編**
為什麼會相互影響?
因為多個程序都放在記憶體中
如下圖,對於**1中第二句要把ax賦給100這個地方,
但是這100很有可能就是程序2的位址(**2),
這樣就會導致把程序2的內容修改,程序2可能就會出錯
多程序的位址空間分離(是記憶體管理的主要內容)
多個程序的位址分離
多個程序的位址必須要分離,否則它們會打架,會出事
用對映表將他們分離
如下圖,**1的真實記憶體是780,而**2的是1260
兩個程序隨便怎麼折騰,互相不影響,很好的共存
所以說程序管理連帶記憶體管理形成多程序影象
程序的同步與合作
程序不是直接開始列印,先放到佇列裡,這樣程序就可以去幹其他事了
如下圖,有的程序往佇列裡放,有的往出取,這不就合作了嘛
再比如:生產者-消費者例項
如上圖,buffer就是共享緩衝區
生產者往共享緩衝區裡放東西,消費者去東西,它倆根據共享資料進行合作
怎麼合作?
首先緩衝區滿了就不該往裡面放,所以counter共享變數用來判斷,幫助它們合作
產生的問題:
問題如下圖
生產者消費者交替執行
假設count=5
第一行:將count賦給p.register,p.register=5
二 :p.register+1就是6
三 :將count賦給c.register,c.register=5
四 :c.register+1就是6
五 :counter=p.register=6
六 :counter=c.register=6
最終counter=6,而我們想要的結果是5,加一減一之後還是五,問題不就出現了嘛
合理推進程式,
在切換程序時會檢查鎖,不通過會繼續執行p,如下圖
下圖是流程及解決方法
作業系統 多程序 多執行緒
對比維度 多程序多執行緒 結論資料共享 資料共享複雜,需要用ipc 共享程序資料,資料共享簡單 多程序 多執行緒 資料同步 資料是分開的,同步簡單 因為共享程序資料,同步複雜 多程序 多執行緒 記憶體 cpu 占用記憶體多,切換複雜,cpu利用率低 占用記憶體少,切換簡單,cpu利用率高 多程序 多...
作業系統的多程序組織 程序間切換
使用者使用計算機就是啟動了一堆程序 使用者管理計算機就是管理這一堆程序 即根據pcb 根據狀態形成不同的佇列放在不同的位置。多個程序如何組織呢?用pcb放在不同的佇列中 就緒 阻塞 用狀態轉化來推進多個程序的執行 排程選擇下乙個程序,得到下乙個程序的pcb,把上乙個程序的執行現場儲存起來,把下乙個程...
作業系統 程序
在作業系統中,作業系統將記憶體,網路,檔案系統抽象為資源的統一抽象表示。1 什麼是程序 程序就是進入記憶體中正在執行的程式。把程序當做一組元素組成的實體。程序包括兩個部分,一部分是 部分,另一部分是 相關的資料集合。程序控制塊 每乙個程序,在核心中都對應著乙個程序控制塊。程序控制塊中儲存著程序的所有...