將程序讀入內存,設置PC初值,CPU將地址從地址總線發出,讀取內存,再將指令從總線返回,CPU執行指令,PC增長,接着下一個循環...shell
若是程序中包含IO(如scanf),CPU須要等待IO結果才能夠繼續往下執行,這個時間CPU處於空閒,效率低。併發
注:IO操做不佔用CPU時間操作系統
多道程序、交替執行code
在等待IO時CPU去執行別的指令blog
除了修改PC,實現程序跳轉,還須要記錄程序(進程)的上下文信息的結構(PCB)。隊列
這個上下文信息只有程序在運行時纔會產生的。進程
用戶視角:多個進程同時運行內存
CPU視角:將多個進程記錄好、按照合理的次序推動(分配資源、進行調度)資源
操做系統初始化的最後一條語句是get
if(!fork()){init();}
至關於建立一個進程,這個進程執行init();init()的做用是啓動一個shell,等待用戶的命令。
shell是如下程序
while(1){ scanf("%s",cmd); if(!fork()){ exec(cmd); } wait(); }
用戶在shell輸入一個命令,shell會建立一個新進程,在該進程內完成任務
PCB記錄進程信息
操做系統維護多個PCB的隊列
進程狀態圖
pCur.state=‘W’ 將進程狀態設置爲阻塞態
schedule() 負責切換進程
getNext(ReadyQueue) 從就緒隊列裏取一個進程,關於先取哪一個進程涉及到「調度」後邊會講解。
pCur,pNew表明PCB
switch_to()涉及上下文切換
調度
切換
存在的問題:多個進程的程序都在內存中,可能會使用相同的內存。
注意:
解決方法:
經過映射表實現多進程的地址空間分離(內存管理部分的內容)
同一個邏輯地址映射到不一樣物理地址。
例子:生產者-消費者實例
生產者進程、消費者進程、共享數據區
生產者進程:向共享數據區放
消費者進程:從共享數據區取
共享數據區:counter滿了不能放,counter爲0不能取
存在的問題:
將counter++;拆分紅原子操做來看,發現問題。
解決方案——進程同步
上鎖