MOOCOS李志軍——L8CPU管理的直觀想法L9多進程圖像

L8 CPU管理的直觀想法

CPU的工做原理——取址執行

將程序讀入內存,設置PC初值,CPU將地址從地址總線發出,讀取內存,再將指令從總線返回,CPU執行指令,PC增長,接着下一個循環...shell

存在的問題

若是程序中包含IO(如scanf),CPU須要等待IO結果才能夠繼續往下執行,這個時間CPU處於空閒,效率低。併發

:IO操做不佔用CPU時間操作系統

怎麼解決——併發執行程序

多道程序、交替執行code

在等待IO時CPU去執行別的指令blog

怎麼實現?

除了修改PC,實現程序跳轉,還須要記錄程序(進程)的上下文信息的結構PCB)。隊列

這個上下文信息只有程序在運行時纔會產生的。進程

進程——運行中的程序

L9多進程圖像

用戶視角:多個進程同時運行內存

CPU視角:將多個進程記錄好、按照合理的次序推動(分配資源、進行調度資源

多進程圖像從操做系統啓動到關機一直存在

操做系統初始化的最後一條語句是get

if(!fork()){init();}

至關於建立一個進程,這個進程執行init();init()的做用是啓動一個shell,等待用戶的命令。

shell是如下程序

while(1){
    scanf("%s",cmd);
    if(!fork()){
    exec(cmd);
    }
    wait();
}

用戶在shell輸入一個命令,shell會建立一個新進程,在該進程內完成任務

多進程如何組織?——PCB+狀態+隊列

PCB記錄進程信息

操做系統維護多個PCB的隊列

進程狀態圖

多進程如何交替?——隊列操做+調度+切換

  • pCur.state=‘W’ 將進程狀態設置爲阻塞態

  • schedule() 負責切換進程

  • getNext(ReadyQueue) 從就緒隊列裏取一個進程,關於先取哪一個進程涉及到「調度」後邊會講解。

  • pCur,pNew表明PCB

  • switch_to()涉及上下文切換

調度

  • FIFO?priority?暫時不展開講

切換

  • 保存當前上下文,恢復新的上下文:利用PCB保存寄存器值

多進程之間會不會彼此影響?

存在的問題:多個進程的程序都在內存中,可能會使用相同的內存。

注意

  • 不能用DPL=0的方法限制訪問,由於只有內核DPL=0,用戶進程的DPL,CPL都爲3

解決方法

經過映射表實現多進程的地址空間分離(內存管理部分的內容

同一個邏輯地址映射到不一樣物理地址。

所以說進程管理連帶內存管理造成多進程圖像

多進程如何合做?

例子:生產者-消費者實例

  • 生產者進程、消費者進程、共享數據區

  • 生產者進程:向共享數據區放

  • 消費者進程:從共享數據區取

  • 共享數據區:counter滿了不能放,counter爲0不能取

存在的問題

將counter++;拆分紅原子操做來看,發現問題。

解決方案——進程同步

上鎖

後邊幾章的內容

相關文章
相關標籤/搜索