【一】什麼是程序
【1】程序概念
- 正在進行的一個過程或者說一個任務
- 而負責執行任務則是cpu
- 程序其實就是一個正在執行的程式
【2】單任務
-
單核+多道,實現多個程序的併發執行
-
同一時刻只能做一個任務(cpu同一時間只能幹一個活)
【3】多工
- 同一時刻可以做多個任務
【二】程式和程序的區別
- 程式僅僅只是一堆程式碼而已
- 而程序指的是程式的執行過程
【三】程序的排程問題
【1】先來先服務演算法
- 該演算法既可用於作業排程,也可用於程序排程
- FCFS演算法比較有利於長作業,而不利於短作業
- 由此可知,本演算法適合於CPU繁忙型作業,而不利於I/O繁忙型的作業
【2】短作業優先排程演算法
-
短作業優先排程演算法(SJ/PF)是指對短作業或短程序優先排程的演算法
-
該演算法既可用於作業排程,也可用於程序排程
-
但其對長作業不利,不能保證緊迫性作業被及時處理,作業的長短只是被估算出來的
【3】時間片輪轉法
-
時間片輪轉法的基本思路是讓每個程序在就緒佇列中的等待時間與享受服務的時間成比例
-
由於作業排程是對除了CPU之外的所有系統硬體資源的分配,其中包含有不可搶佔資源,所以作業排程不使用輪轉法
-
在輪轉法中,時間片長度的選取非常重要
-
時間片長度的選擇是根據系統對響應時間的要求和就緒佇列中所允許最大的程序數來確定的
【4】多級反饋佇列
-
前面介紹的各種用作程序排程的演算法都有一定的侷限性
-
- 如短程序優先的排程演算法,僅照顧了短程序而忽略了長程序,而且如果並未指明程序的長度,則短程序優先和基於程序長度的搶佔式排程演算法都將無法使用
-
而多級反饋佇列排程演算法則不必事先知道各種程序所需的執行時間,而且還可以滿足各種型別程序的需要,因而它是目前被公認的一種較好的程序排程演算法
-
排程演算法的實施過程:
- 為多個就緒佇列設定優先順序
- 新程序等待呼叫
- 按順序排程佇列
【四】併發與並行
【1】併發
- 是偽並行,即看起來是同時執行。
- 單個cpu+多道技術就可以實現併發,並行也屬於併發
【2】並行
- 多個任務同時執行,只有具備多個cpu才能實現並行
【3】多道技術
- 記憶體中同時存入多道(多個)程式
- cpu從一個程序快速切換到另外一個
- 使每個程序各自執行幾十或幾百毫秒
- 這樣,雖然在某一個瞬間
- 一個cpu只能執行一個任務
- 但在1秒內,cpu卻可以執行多個程序
- 這就給人產生了並行的錯覺,即偽併發
- 以此來區分多處理器作業系統的真正硬體並行(多個cpu共享同一個實體記憶體)
【4】總結
- 並行肯定算併發
- 單核的計算機肯定不能實現並行,但是可以實現併發。
【五】同步/非同步&阻塞/非阻塞
【1】同步
-
在進行一個程式執行之後,必須等待當前程式執行完成才能繼續下一個任務
-
所謂同步就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會返回
【2】非同步
-
在進行一個程式執行之後,沒等待當前程式執行完成就能繼續下一個任務
-
非同步就是當一個非同步功能呼叫發出後,呼叫者不能立刻得到結果,當該非同步功能完成後,透過狀態、通知或回撥來通知呼叫者
【3】阻塞
- 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起(如遇到io操作)
- 函式只有在得到結果之後才會將阻塞的執行緒啟用
(1)同步呼叫
- apply一個累計1億次的任務,該呼叫會一直等待,直到任務返回結果為止,但並未阻塞住(即便是被搶走cpu的執行許可權,那也是處於就緒態)
(2)阻塞呼叫
- 當socket工作在阻塞模式的時候,如果沒有資料的情況下呼叫recv函式,則當前執行緒就會被掛起,直到有資料為止
【4】非阻塞
- 指在不能立刻得到結果之前也會立刻返回,同時該函式不會阻塞當前執行緒
【5】小結
(1)同步/非同步
-
同步與非同步針對的是函式/任務的呼叫方式
-
同步就是當一個程序發起一個函式(任務)呼叫的時候
-
- 一直等到函式(任務)完成,而程序繼續處於啟用狀態。
-
而非同步情況下是當一個程序發起一個函式(任務)呼叫的時候
-
- 不會等函式返回,而是繼續往下執行當,函式返回的時候透過狀態、通知、事件等方式通知程序任務完成。
(2)阻塞/非阻塞
- 阻塞與非阻塞針對的是程序或執行緒
- 阻塞是當請求不能滿足的時候就將程序掛起
- 而非阻塞則不會阻塞當前程序
【六】程序的建立
-
只要有作業系統,就有程序的概念,就需要有建立程序的方式
-
需要有系統執行過程中建立或撤銷程序的能力
-
建立程序是指啟動某一個應用程式,撤銷程序是指殺死指定的應用程式
【1】通用系統建立新程序的4種形式
(1)系統初始化
- 檢視程序linux中用ps命令,windows中用工作管理員
- 前臺程序負責與使用者互動,後臺執行的程序與使用者無關
- 執行在後臺並且只在需要時才喚醒的程序,稱為守護程序
(2)程序中開啟子程序
-
一個程序在執行過程中開啟了子程序
-
- 如nginx開啟多程序 ---> os.fork --> subprocess.Popen
(3)互動式請求
- 使用者的互動式請求,建立一個新程序(如使用者雙擊暴風影音)
(4)批處理作業的初始化
- 一個批處理作業的初始化,只在大型機的批處理系統中應用
【2】不同系統的新程序的建立方式
(1)UNIX
- 在UNIX中該系統呼叫是:fork,fork會建立一個與父程序一模一樣的副本
- 二者有相同的儲存映像、同樣的環境字串和同樣的開啟檔案,在shell直譯器程序中,執行一個命令就會建立一個子程序
(2)Windows
- 在windows中該系統呼叫是:CreateProcess,CreateProcess既處理程序的建立,也負責把正確的程式裝入新程序。
【七】程序的終止
【1】正常退出
- 正常退出屬於自願退出程式,如程式執行完畢呼叫發起系統呼叫正常退出
- 在 Linux 中用 exit,在 Windows 中用 ExitProcess
【2】出錯退出
- 出錯退出也屬於自願退出程式,在程式執行過程中發生錯誤,導致程式退出。
【3】嚴重錯誤
- 屬於非自願退出程式,執行非法指令,如引用不存在的記憶體,1/0等,可以捕捉異常
- try…except…
【4】被其他程序殺死
- 屬於非自願退出程式,如使用命令 kill -9 在 Linux 中強制終止程序。
【九】程序的狀態
【1】什麼是程序的狀態
- 程序狀態反映程序執行過程的變化,這些狀態隨著程序的執行和外界條件的變化而轉換。
【2】三態模型
-
執行態:已經在使用過程中的狀態
-
就緒態:雙擊應用程式啟動的過程中
-
阻塞態:上傳檔案需要讀取檔案資料的過程
【3】五態模型
- 新建態:雙擊應用程式啟動的過程中 --- 雙擊 LOL圖示
- 終止態:應用程式已經準備好了 --- 進入到 LOL客戶端
- 執行態:應用程式正在執行 --- 正在打遊戲
- 就緒態:應用處於等待狀態 --- 正在匹配隊友
- 阻塞態:應用程式結束 --- 主動將LOL退出