作業系統系列----程式與程式
程式
1.程式的概念
程式是一組有序的指令集合
2.程式的執行方式
在早期的單道批處理系統中,程式的執行方式是順序執行,即在記憶體僅僅轉入一道程式,讓他獨佔系統中的所有資源。一個程式執行完畢後另一個程式才能執行,這種執行效率極其低,而且十分浪費資源
而在多道程式處理系統中,記憶體中可以同時裝入多個程式,這多個程式可以共享資源,併發執行,但是程式的併發執行會導致一系列問題,所以才引入了程式的概念
2.1什麼是順序執行
所謂順序執行就是比如我們去食堂排隊打飯,排成一列列隊伍,我們可以理解為一個個程式,而打飯的阿姨可以理解為cpu,我們按照佇列一個個去打飯,而阿姨則按照順序一個個給我們打飯,一次只能給一個人打飯,這就是順序執行
2.1.1順序執行時的特徵
1.順序性:這個我們在上面已經說過了,就是程式一個個執行,而且一次只可以執行一個
2.封閉性:程式在執行的時候佔用整個計算機的資源,只有本程式能改變自己,這也可理解為一個封閉的環境,因為整個計算機只有他一個程式在執行
3.可再現性:只要程式的執行環境與初始條件相同,當程式重複執行的時候,獲得的都是相同的結果,比如我們使用計算器算1+1等於2,只要這個計算器沒壞,只要我們輸入的是1+1,那麼結果就一定為2
2.2 程式的併發執行
順序執行的方式雖然十分方便,但是效率實在是太低了,看看我們今天一邊聽歌一邊打遊戲,這顯然不是順序執行所能實現的。
多道程式技術,即多個程式併發執行,多個程式併發執行指的相互之間不存在前驅關係的程式才可以併發執行,如果一個程式 依賴另
一個程式的執行結果而執行,那麼這兩個程式顯然是不可以併發執行的
程式併發執行時的特徵
我們可以思考,在併發執行中,系統的吞吐量和執行效率雖然不斷提高了,但是他們在共享系統資源的時候,以及他們在為了實現同一個目的而合作的時候,他們之間必然會形成相互制約的關係。這時候程式就具備了許多新特性
間斷性
程式併發執行時,由於它們共享系統資源,以及為完成同一項任務而相互合作,致使在這些併發執行的程式之間形成了互相制約的關係:併發程式具有“執行--暫停--執行”的間斷性的活動規律。
失去封閉性
這個就很好理解了,在順序執行中整個計算機的資源都被一個程式所佔用,但是在併發執行中,系統的資源被各個程式所共享,這也就導致程式的狀態不再由自身決定,會受到其他程式的影響
失去可再現性
程式在併發執行的過程中失去了封閉性,,也導致程式失去可再現性
兩個迴圈程式A和B,它們共享一個變數N。
程式A每執行一次時,都要做N=N+1操作;
程式B每執行一次時,都要做執行Print(N)操作,之後執行N=0操作;
A、B以不同的速度執行,則可能出現下述3種情況(假設某時刻變數N的值為n)
n+1,n+1,0
n,n+1,0
n,0,n+1
程式
為什麼引入程式?程式的作用是什麼?
在多道程式環境下,程式的執行屬於併發執行,此時它們將失去其封閉性,並具有間斷性及不可再現性的特徵。這決定了通常的程式是不能參與併發執行的,因為程式執行的結果是不可再現的,程式的執行也就失去了意義。
所以為了使併發執行的每個程式能夠獨立的執行,所以作業系統就為之配備了一個專屬的資料結構,稱為程式控制模組(PCB Process C ontrol Bolck),這樣子程式段,相關的資料段程式和PCB三部分就構成了程式實體。一般情況下我們把程式實體稱為程式,而建立程式的實質就是建立程式實體中的PCM,而撤銷程式就是撤銷程式中的PCB
這是因為併發執行的程式(即程式)是“停停走走”地執行,只有在為它建立程式後,在它停下時,方能將其現場資訊儲存在它的PCB中,待下次被排程執行時,再從PCB中恢復CPU現場並繼續執行,而傳統的程式卻無法滿足上述要求。
建立程式所帶來的好處是使多個程式能併發執行,這極大地提高了資源利用率和系統吞吐量。但管理程式也需付出一定的代價,包括程式控制塊及協調各執行機構所佔用的記憶體空間開銷,以及為進行程式間的切換、同步及通訊等所付出的時間開銷。
程式的相關定義:
1.程式是程式的一次執行
2.程式是一個程式及其資料在處理及順序執行時所發生的活動
3.程式是一個獨立功能的程式在資料集合上執行的過程,程式是系統資源分配和排程的基本單位
PCB概念及其功能
為了便於系統描述和管理程式的執行,在OS中專門為每個程式專門定義了一個資料結構---程式控制塊PCB(Process Control Block)
PCB記錄了當前情況以及管理程式執行執行的全部資訊,是作業系統中最重要的記錄型資料結構
作用
使在多道程式環境下不能獨立執行的程式(含資料)成為一個能執行的基本單位,一個能與其他程式併發執行的程式
1.作為獨立執行的基本標誌,,當系統建立程式時就為他建立一個PCB,當結束時收回其PCB,程式也隨之消亡,PCB已經成為程式存在系統中的唯一標識
2.能實現間斷性執行方式。在多道程式環境下,程式採用的是走走停停的方式執行的,當程式由於阻塞而停止執行的時候,系統將CPU現場保留在被中斷程式的CPU中,當該程式再次被排程的時候,就可以恢復CPU現場,而傳統意義的靜態程式不具備保留現場的能力,無法保留結果的可再現性,從而失去執行的意義
3.提供程式管理所需的資訊。作業系統總是根據PCB實施對程式的控制和管理,排程程式排程到程式執行的時候,只能根據PCB中記錄的程式和資料在記憶體或外存中的始址指標,找到對應的程式和資料,還可根據資源清單中的資料瞭解到該程式所需的全部資源
4.提供程式排程所需的資訊。只有處於就緒狀態的程式才可以被排程執行,而在PCB中就提供了程式處理哪種狀態的資訊。還有程式的優先順序,甚至是程式的等待時間和已執行時間。
5.實現與其他程式的同步與通訊。程式同步機制是用於實現,諸程式的協調執行,在採用訊號量機制的時候,他要求每個程式中都設定相應的用於同步的訊號量
程式的特徵
動態性
由建立而生,由排程而執行,由撤銷而消亡,程式是有生命週期的,而程式是一組有序的指令集合,存放於某種介質上(硬碟),是靜態的,沒有活動意義
併發性
引入程式的目的就是為了解決程式併發執行所導致的問題,,程式是沒有PCB的,不能參與獨立併發執行
獨立性
程式是系統分配資源與排程的基本單位,他自然也是一個可獨立執行的基本單位,凡是沒有建立PCB的程式都不可以作為一個獨立的單位執行
非同步性:
實質程式按照非同步的方式執行,即按各自獨立的不可預知的速度向前,也正是由於這點,才導致了傳統意義上的程式如果參與併發執行會導致結果的不可再現性,為了使程式在執行的時候有非同步性當是同時也保證程式併發執行的結果是可再現的,這才引入了程式並配備了程式同步機制
程式的狀態
就緒
程式已經處於準備好執行的狀態,即程式已經分配到了除了cpu以外的所有資源,只要再獲取cpu即可立即執行,系統中有許多處於就緒的程式,系統會按照優先順序排成一個優先順序佇列
執行
即程式已經獲取了CPU,程式正在執行狀態,,在單處理機中只要一個程式處於執行狀態,而在多處理機中有多個程式處於執行狀態
阻塞
當正在執行的程式發生了某個事件(IO請求,申請快取區失敗等等),這時候系統就會把處理機分配給另一個就緒程式,而該程式就進入阻塞狀態,主色狀態的程式也會構成一個阻塞佇列,根據阻塞原因的不同還會構成多個阻塞佇列。
建立狀態與等待狀態
建立狀態
程式由建立而生,建立程式是一個很複雜的過程
建立步驟
程式申請一個空白的PCB,並向PCB中加入控制和管理程式的資訊,讓後為該程式分配所需資源,然後把程式插入就緒佇列中
如果為該程式分配的資源尚未得到滿足,比如系統的記憶體不夠把程式插入其中,則此時經常就不能被排程執行,仍然處於建立狀態
這是為了確保對程式控制的完整性,同時建立程式的引入也增加了管理的靈活性。OS可以根據系統效能或主存容量的限制推遲新程式的提交
終止狀態
步驟
1.等待作業系統的進行善後處理,最後將其PCB清零,並將PCB返還給系統。
終止的原因:
1.到達自然的結束點,即程式執行完畢
2.被作業系統終結
3.被有其他終止權的程式終結
進入終止狀態的程式不再執行,但是作業系統中仍然保留一個記錄,儲存狀態碼和一些計時統計資料,給其他程式收集,提取完成後,作業系統刪除該程式,並將PCB清零,將空白PCB返還給系統
掛起狀態與程式狀態的切換
掛起:即讓程式暫時停止執行,處於靜止狀態,如果程式正在執行他將暫停執行,如果程式原本就處於就緒狀態,則該程式暫時不接受排程。掛起操作會把程式從記憶體轉入外存。
為什麼引入掛起操作
1.負荷調節的需要,當實時系統中的工作負荷較重的時候,已可能影響到對實時任務的控制時,為了讓系統正常執行就會掛起某些不重要的程式
2.作業系統的需要,作業系統有時候希望掛起某些程式,以便檢查執行中的資源使用情況
3.父程式的請求,有時候父程式希望掛起自己的某個子程式,以便考察和修改該子程式或則協調個各程式之間的活動
4.終端使用者的需要,當終端使用者發現自己的程式在執行期間有問題,希望暫停程式的執行,就讓他先停下來,以便考察其執行情況,並對其做修改
引入掛起原語Suspend操作後和啟用原語Active後,在他們的作用下,程式將可能發生一下幾種狀態的切換,
1.活動就緒------>靜止就緒,當程式處於未掛起的就緒狀態時,此成此活動就緒狀態表示為Readya,此時的程式可以接受排程,而使用掛起原語Suspend將程式掛起後,程式就變為靜止就緒狀態,表示為Readys。此時的程式不接受排程
2.活動阻塞-->靜止阻塞,當程式處於未被掛起的阻塞狀態的時候 ,稱它為活動阻塞,表示為Blockeda,當使用Suspend原語掛起後,程式就轉換為靜止阻塞狀態,處於該程式轉狀態的某個事件出現後,該程式就由靜止阻塞狀態轉為靜止就緒狀態
3.靜止就緒---->活動就緒,處於Readys狀態的程式使用Active啟用後,該程式就變為活動就緒狀態,即由Readys轉為Readya
4.靜止阻塞------>活動阻塞,處於Blockeds狀態的程式使用啟用原語Active啟用後,程式將轉換為Blockeda(活動阻塞)狀態
圖一:
圖二:
1.NULL---->建立,當一個新程式產生時,該程式處於建立狀態,
2.建立--->活動就緒,當前系統的效能和記憶體容量都允許的時候,完成對程式建立的必要操作後,相應的系統程式將系統的狀態轉為活動就緒狀態
3.建立--->靜止就緒,考慮到當前系統的資源狀況與效能要求,不分配給新建程式所需資源,。相應的程式狀態轉為靜止就緒狀態安放於外存
4.執行--->終止,當一個程式已經完成任務的時候,,或者出現了無法克服的錯誤,或者被其他程式終結,則轉為終止狀態
程式控制塊PCB(Process Control Block)
1.程式控制塊的組織方式
1.1線性方式,即所有PCB保留在一張線性表中
優點:開銷小,實現簡單
缺點:每次掃描都需要掃描整張表
2.連結方式,把具有相同狀態程式的PCB分別通過PCB中的連結關鍵字連結成一個佇列,從而形成就緒佇列、阻塞佇列、執行佇列等。
3. 索引方式:系統根據程式狀態的不同建立幾張索引表,,並把各索引表在記憶體的首地址記錄在記憶體的一些專用單元中系統按照程式的狀態分別建立就緒索引表、阻塞索引表等。
2.進排程所需的資訊
1.程式的優先順序
2.程式進入阻塞狀態的原因
3.程式檔當前的狀態
4.程式排程所需的其他資訊
3.程式控制資訊
1.程式的同步與通訊機制
2.程式和資料的地址
3.資源清單
4.連結指標,他給出了本程式(PCB)在所在佇列的下一個程式的PCB的首地址