【操作系統】操作系統 高頻考點總結歸納

🚩操作系統的四個特性?

  • 併發:同一段時間內多個程序執行
  • 共享:系統中的資源可以被內存中多個併發執行的進線程共同使用
  • 虛擬:通過分時複用(如分時系統)以及空分複用(如虛擬內存)技術把一個物理實體虛擬爲多個
  • 異步:系統進程用一種走走停停的方式執行,(並不是一下子走完),進程什麼時候以怎樣的速度向前推進是不可預知的

🚩線程和進程的區別?

進程是一段運行着的程序,線程是執行程序代碼的一個執行單,也是進程的一個實體。

  • 進程是資源分配的基本單位,線程是資源調度的基本單位
  • 進程之間資源不共享,同一個進程的多個線程共享進程的資源
  • 線程之間可以通過進程的共享資源進行通信,而進程之間通信更加困難
  • 線程之間上下文切換要比進程之間快,因爲只需要保存線程的少量寄存器內容,開銷較小

🚩什麼是上下文切換?

CPU通過時間片分配的算法執行任務,每一個任務會被分配一個時間片,在這個時間片之內,可以執行當前任務,時間片用完後就會切換執行下一個任務,並且保存上一個任務的狀態,以便下次切換回這個任務時可以再次加載。所以任務從保存到再次加載的一個過程就稱之爲上下文切換

🚩使用多線程的好處有哪些?

多線程相比於單線程的好處有:

  • 使用多線程減少了程序的響應時間,對於一些需要等待的操作可以專門派發給一個線程執行
  • 在多CPU或多核計算機上使用多線程提高CPU的利用率
  • 與進程相比,線程的創建和切換的開銷更小
  • 便於程序的理解和維護,使用多線程可以簡化程序結構,將一個複雜的任務分解到不同的線程執行

🚩多線程一定快嗎?

不一定,使用多線程時增加了線程的創建和上下文切換時的一系列開銷,也可能會產生死鎖問題,所以並不是多線程就一定更快。在一些簡單程序中反而比單線程要慢。

🚩併發和並行的區別?

併發是在單核CPU中多線程通過上下文切換的調度方式使得多個程序在同一時間段內發生,給用戶的感覺就是同時運行
並行是多核CPU在同一時刻運行着不同的程序

🚩進程的狀態?

進程又三種狀態,分別是:

  • 就緒狀態(ready):等待被調度
  • 運行狀態(running)
  • 阻塞狀態(waiting):等待資源

就緒態通過調度算法從而獲取CPU,運行態如果CPU的時間片用完會重回到就緒態等待調度,如果缺少資源就會轉化成阻塞態

🚩進程的調度算法有哪些?

不同環境下會有不同的調度算法,對於批處理系統來說沒有太多的用戶操作,調度算法目標是保證吞吐量和週轉時間,有以下幾種:

  • 先來先服務 first-come first-serverd(FCFS)
    非搶佔式調度算法,有利於長作業,但不利於短作業,因爲短作業必須一直等待前面的長作業執行完畢才能執行,而長作業又需要執行很長時間,造成了短作業等待時間過長。
  • 短作業優先 shortest job first(SJF)
    非搶佔式調度算法,有利於短作業,不利於長作業,會使長作業產生飢餓現象,處於一直等待短作業執行完畢的狀態。如果一直有短作業到來,那麼長作業永遠得不到調度。
  • 最短剩餘時間優先 shortest remaining time next(SRTN)
    搶佔式調度算法,最短作業優先的搶佔式版本,按剩餘運行時間的順序進行調度。 當一個新的作業到達時,其整個運行時間與當前進程的剩餘時間作比較。如果新的進程需要的時間更少,則掛起當前進程,運行新的進程。否則新的進程等待。

對於交互式系統,有大量的用戶交互操作,在該系統中調度算法的目標是快速地進行響應。基於此有以下的調度算法:

  • 時間片輪轉
    將所有就緒進程按 FCFS 的原則排成一個隊列,每次調度時,把 CPU 時間分配給隊首進程,該進程可以執行一個時間片。當時間片用完時,由計時器發出時鐘中斷,調度程序便停止該進程的執行,並將它送往就緒隊列的末尾,同時繼續把 CPU 時間分配給隊首的進程
  • 優先級調度
    爲每個進程分配一個優先級,按優先級進行調度。爲了防止低優先級的進程永遠等不到調度,可以隨着時間的推移增加等待進程的優先級
  • 多級反饋隊列
    可以看作是時間片輪轉調度算法和優先級調度算法的結合。它設置了多個隊列,每個隊列時間片大小都不同。進程在第一個隊列沒執行完,就會被移到下一個隊列。每個隊列優先權也不同,最上面的優先權最高。因此只有上一個隊列沒有進程在排隊,才能調度當前隊列上的進程。

🚩進程間如何通信呢?

  • 進程間通信的方式有:
    (1)管道:只支持半雙工通信(單向交替傳輸);只能在父子進程或者兄弟進程中使用,
    (2)FIFO:也稱爲命名管道,去除了管道只能在父子進程中使用的限制,常用於客戶-服務器應用程序中
    (3)消息隊列:消息隊列可以獨立於讀寫進程存在,從而避免了 FIFO 中同步管道的打開和關閉時可能產生的困難;避免了 FIFO 的同步阻塞問題,不需要進程自己提供同步方法;讀進程可以根據消息類型有選擇地接收消息,而不像 FIFO 那樣只能默認地接收。
    (4)信號量:它是一個計數器,用於爲多個進程提供對共享數據對象的訪問
    (5)共享內存:允許多個進程共享一個給定的存儲區,多個進程可以將同一個文件映射到它們的地址空間從而實現共享內存。
    (6)Socket:可用於不同機器間的進程通信。

🚩線程間如何通信呢?

  • 線程間通信的方式有:
    (1)在Java中可使用JVM提供的API,比如wait()、notify()、notifyAll() 等方法
    (2)線程間還可以通過共享的主內存來進行值的傳遞

🚩死鎖出現的四個必要條件?

  • 互斥:每個資源要麼已經分配給了一個進程,要麼就是可用的。
  • 佔有和等待:已經得到了某個資源的進程可以再請求新的資源。
  • 不可搶佔:已經分配給一個進程的資源不能強制性地被搶佔,它只能被佔有它的進程顯式地釋放。
  • 環路等待:有兩個或者兩個以上的進程組成一條環路,該環路中的每個進程都在等待下一個進程所佔有的資源。

🚩如何處理死鎖問題?

處理死鎖有以下策略:

  • 死鎖忽略:因爲解決死鎖問題的代價太高,而且死鎖的發生概率很低或對用戶影響很小,所以大多操作系統採取死鎖忽略,不做任何反應
  • 死鎖預防:通過破壞之前死鎖的必要條件來預防死鎖發生
    (1)破壞佔有和等待:一次申請所有需要的資源,但這樣會造成資源的浪費
    (2)破壞環路等待:給資源統一編號,進程只能按編號順序來請求資源。
  • 死鎖避免:在程序運行時避免發生死鎖,常用算法有銀行家算法,當進程申請資源時,首先判斷分配資源後會否造成死鎖,如果不會造成才分配資源
  • 死鎖檢測與恢復:發現系統中出現死鎖後,選擇死鎖中的一個進程進行釋放資源(殺死進程、回滾進程、被其它進程搶佔),讓其它進程繼續執行

🚩什麼是虛擬內存?

虛擬內存的目的就是爲了讓物理內存擴充成更大的邏輯內存,從而讓程序獲得更多的可用內存。在程序裝入時,只裝入一部分在內存,程序執行期間,當訪問的信息不再內存中時,操作系統將需要的部分數據調入內存,把不使用的內存換到外存中。
虛擬內存時計算機系統內存管理的一種技術,它使得程序認爲它擁有連續可用的內存,而實際上通常是被分割成多個內存碎片,還有部分暫存在外存上,等待交換。

🚩瞭解哪些頁面置換算法?

當需要從外存中加載信息,而內存又滿了時,就要選擇將內存中的頁面置換出去,具體的置換方式有:

  • 最佳置換算法(OPT, Optimal replacement algorithm):所選擇的被換出的頁面將是最長時間內不再被訪問,通常可以保證獲得最低的缺頁率。但由於無法預知將來是否會被訪問,所以是一個理論算法
  • 最久未使用(LRU, Least Recently Used):選擇最長時間沒有被使用的頁面置換出去
  • 先進先出(FIFO,First In First Out):選擇換出的頁面是最先進入的頁面。但是該算法可能會將那些經常被訪問的頁面換出,導致缺頁率升高。
  • 最少使用算法:選擇使用次數最少的頁面進行置換
  • 時鐘算法:頁面設置訪問位,將頁面鏈接爲一個環形列表,頁面被訪問的時候訪問位設爲1。頁面置換的時候,如果當前指針的訪問位爲0,置換,否則將這個值置爲0,循環直到遇到訪問位爲0的頁面。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章