程序有三種狀態:
併發性
擁有資源
系統開銷
程序同步就是對多個相關程序在執行次序上進行協調,使得併發執行的各個程序之間可以有效地共享資源。
臨界資源:一次只能被乙個程序所占用的資源
臨界區:程序中訪問臨界資源的**為臨界區。
每個程序在進入臨界區之前,先對欲訪問的臨界資源進行檢查:
訊號量是乙個確定的二元組(s,q),其中s是乙個具有非負初值的整形變數,q是乙個初始狀態為空的佇列,整形變數s表示系統中某類資源的數目:
除訊號量的初值外,訊號量的值僅能由p操作和v操作更改,作業系統利用它的狀態對程序和資源進行管理。
s.value = s.value - 1; /*可理解為占用1個資源,若原來就沒有則記帳「欠」1個*/
若s.value ≥ 0,則程序繼續執行,否則(即s.value < 0),則程序被阻塞,並將該程序插入到訊號量s的等待佇列s.queue中
s.value = s.value + 1;/*可理解為歸還1個資源,若原來就沒有則意義是用此資源還1個欠帳*/
若s.value > 0,則程序繼續執行,否則(即s.value ≤ 0),則從訊號量s的等待隊s.queue中移出第乙個程序,使其變為就緒狀態,然後返回原程序繼續執行。
此類執行緒的建立、撤銷和切換都是依靠核心完成的。核心也為每乙個核心級執行緒設定了乙個執行緒控制塊。
優點:
缺點:
對於使用者的執行緒切換來說,在同乙個程序中從乙個執行緒切換到另乙個執行緒,需要從使用者態轉到核心態執行,開銷較大。
這類執行緒的建立、撤銷、同步與通訊等無需系統呼叫來實現,也無需核心支援。
優點:
缺點:
程序的執行在系統上的兩個級別:使用者級和核心級,也稱為使用者態和系統態。
程式的執行一般是在使用者態下執行的,但當程式需要使用作業系統提供的服務時,比如說開啟某一裝置、建立檔案、讀寫檔案等,就需要向作業系統發出呼叫服務的請求,這就是系統呼叫。
當程序發出系統呼叫申請的時候,會產生乙個軟中斷。產生這個軟中斷以後,系統會去對這個軟中斷進行處理,這個時候程序就處於核心態了。
那麼使用者態和核心態之間的區別是什麼呢?
死鎖:多個程序因迴圈等待資源而造成無法執行的現象。
產生死鎖的原因:
產生死鎖的必要條件:
處理死鎖的幾個方式:
避免死鎖:該方法同樣是屬於事先預防的策略,但是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。比如銀行家演算法檢測死鎖:這種方法並不須事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在執行過程中發生死鎖。但可通過系統所設定的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的程序和資源,然後採取適當措施,從系統中將已發生的死鎖清除掉。
解除死鎖:與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將程序從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些程序,以便**一些資源,再將這些資源分配給已處於阻塞狀態的程序,使之轉為就緒狀態,以繼續執行
先來先服務fcfs:從就緒佇列中選擇乙個最先進入該佇列的程序來分配處理機。
fcfs比較有利於長作業。、非搶占、不適合互動式。
短作業優先sjf:最短的作業最先排程。sjf可以保證最小的平均等待時間。
優先權排程:每個任務關聯乙個優先權,排程優先權最高的任務。
注意:優先權太低的任務一直就緒,得不到執行,出現「飢餓」現象。
時間片輪轉排程:設定乙個時間片,按時間片來輪轉排程(「輪叫」演算法)
優點: 定時有響應,等待時間較短;缺點: 上下文切換次數較多;
如何確定時間片?
時間片太大,響應時間太長;吞吐量變小,周轉時間變長;當時間片過長時,退化為fcfs。
多級佇列排程:按照一定的規則建立多個程序佇列
不同的佇列有固定的優先順序(高優先順序有搶占權)
不同的佇列可以給不同的時間片,高優先順序的時間片較小。
多級反饋佇列:在多級佇列的基礎上,任務可以在佇列之間移動,更細緻的區分任務。
頁式:將乙個程序的邏輯位址空間分成若干大小相等的片,稱為頁。相應地也罷物理記憶體空間分成與頁面相同大小的儲存快,稱為物理塊。在為程序分配記憶體時,以塊為單位將程序中的若干頁分別裝入到多個可以不相鄰接的物理塊中。
段式:將使用者程式位址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯資訊。儲存分配時,以段為單位,段與段在記憶體中可以不相鄰接,也實現了離散分配。
二者都採用離散分配方式,分頁和分段的主要區別有:
除此之外,還有將段式和頁式結合起來的段頁式:分頁系統能有效地提高記憶體的利用率,而分段系統能反映程式的邏輯結構,便於段的共享與保護,將分頁與分段兩種儲存方式結合起來,就形成了段頁式儲存管理方式。
在段頁式儲存管理系統中,作業的位址空間首先被分成若干個邏輯分段,每段都有自己的段號,然後再將每段分成若干個大小相等的頁。對於主存空間也分成大小相等的頁,主存的分配以頁為單位。
連續分配指為乙個使用者程式分配乙個連續的記憶體空間。
基於區域性性原理,在程式裝入時,可以將程式的一部分裝入記憶體,而將其餘部分留在外存,就可以啟動程式執行。在程式執行過程中,當所訪問的資訊不在記憶體時,由作業系統將所需要的部分調入記憶體,然後繼續執行程式。另一方面,作業系統將記憶體中暫時不使用的內容換出到外存上,從而騰出空間存放將要調入記憶體的資訊。這樣,系統好像為使用者提供了乙個比實際記憶體大得多的儲存器,稱為虛擬儲存器。
之所以將其稱為虛擬儲存器,是因為這種儲存器實際上並不存在,只是由於系統提供了部分裝入、請求調入和置換功能後(對使用者完全透明),給使用者的感覺是好像存在乙個比實際物理記憶體大得多的儲存器。虛擬儲存器的大小由計算機的位址結構決定,並非是記憶體和外存的簡單相加。
實現方式:
若要訪問的頁面不在記憶體而需要把它們調入記憶體,但是記憶體已經沒有空閒空間時,需要從記憶體中調出一頁程式。
在訪問頁面6的時候產生了缺頁,此時將最近最久未被訪問的頁4置換出去。
lru演算法的效能接近於opt,但是實現起來比較困難,且開銷大;可以看出這個演算法使迴圈地檢查各頁的使用情況。fifo演算法實現簡單,但效能差。
面試筆試題
1 昨天參加一公司筆試,給幾道演算法題整懵了,其實也不難,但好久沒有碰演算法,只是有思路,要讓我在這麼短的時間內寫出程式來還是不行。2 這裡將其中一道稍微複雜一點的演算法題寫下來,以此小結。3 4 題目描述 5 將n個雞蛋放入到m個籃子中去 n m 保證每個籃子中至少乙個雞蛋,然後指定乙個數x,要求...
面試筆試題
1.文字檔案裡面有很多單詞 單詞與單詞之間以空格 換行符隔開,且不管單個單詞的正確性 統計各單詞出現的次數,刪掉出現次數最少的那些 實現 fstream讀入事先準備好的檔案test.txt,存到c 的關聯容器map,用單詞string做key,出現的次數int做value,找到最小的value,然後...
面試筆試題
智力 1.有abcd四人過橋,時間為1,2,5,10,只有乙個手電筒,同時只能過兩人,怎麼過17分鐘能過完?2 1 10 2 2 走的快的就多走走 2.假設有乙個池塘,裡面有無窮多的水,現有兩個空水壺,容積分別為5公升和6公升,如何只用這2個水壺從池塘裡取得3公升的水 1l 6 5 2l 6 5 1...