初入操作系統

操作系統概述

操作系統

操作系統是一個軟件系統,使計算機變得好用(將人從繁瑣、複雜的對機器掌握的任務中解脫),是計算機運行變的有序。

根據管理資源不同,操作系統具體功能包括:

CPU管理,即如何分配cpu給不同的應用和用戶。主要是進程管理,主要有三個目的,第一,公平,每個程序都有機會使用到CPU;
第二,非阻塞,任何程序不能無休止地阻撓其他程序的正常運行;
第三,優先級,優先級高的程序優先運行。

內存管理,即如何分配內存給不同的應用和用戶。內存專利主要是管理緩存、主存、磁盤、磁帶等存儲介質所形成的內存架構,內存管理的另一個目的是讓很多程序共享同一個物理內存,這就需要對物理內存進行分割和保護,不讓一個程序訪問另一個程序所佔內存空間,稱爲運行時不能越界。

外存管理,即如何分配磁盤給不同的用戶和應用。主要是文件系統。

I/O管理,即如何分配輸入輸出設備給應用和用戶。目的有兩個:一是屏蔽不同設備的差異性,即用戶用同樣的方式訪問不同的設備,從而降低變成的難度;二是提供併發訪問,即將那些看上去並不具有共享性的設備,變得可以共享,如打印機。

操作系統的發展階段

第一階段:狀態機操作系統。
第二階段:單一操作員、單一控制端操作系統。
第三階段:批處理操作系統。一部分是控制程序執行,一部分是支持程序執行。
第四階段:多道批處理操作系統。
第五階段:1.分時操作系統。2.實時操作系統(計算機對這些應用必須在規定的時間內做出響應,不然就會發生事故或災難),實時系統通常又分爲軟實時系統和硬實時系統。
第六階段:現代操作系統

中斷:它是操作系統獲得計算機控制權的根本保證。中斷的基本原理是:設備在完成自己的任務後向CPU發出中斷,CPU判斷優先級,然後確定是否響應。如果響應,則執行中斷服務程序,並在中斷服務程序執行完後繼續原來的程序。

內核態和用戶態:實際上是處理器的一種狀態,而不是程序的狀態。內核態是特權態,而用戶態是普通態。特權態下運行的程序可以訪問任何資源,而用戶態下的訪問則受到限制。要限制一個程序對資源的訪問,需要對程序執行的每一條指令進行檢查才能完成,而這種檢查就是地址翻譯。程序發出的每一條指令都要經過這個地址翻譯過來。通過對翻譯的控制,就可以限制程序對資源的訪問。系統處於內核態時,內核可以繞過內存地址翻譯而直接執行特權指令。

進程、內存和文件

進程:它指的是一個運行中的程序。在任何一個時候,進程所佔有的全部資源,包括分配給該進程的內存、內核數據結構和軟資源形成一個進程核(core)。核快照(Core Image)代表的是進程在某一特定時刻的狀態。在linux或unix下編程,當出現分段錯誤(segmenttation fault)時,操作系統會自動進行核倒出(core dump)。“核倒出”把所有計算機的狀態保存在一個文件中,通過閱讀這個文件的內容可以的支出界時的進程狀況,從而幫助進程調試。
內存:它是進程的存放場所,如何對內存進行管理,使得數據的讀寫具有高效率,高安全、高空間利用率和位置透明的特性是內存管理所要達到的目的。
文件:是操作系統提供的外部存儲設備的抽象,它是程序和數據的最終存放地點。如何讓用戶的數據存放變得容易、方便、可靠和安全是文件系統要解決的問題。

系統調用

操作系統的服務是通過系統調用實現的。系統調用就是操作系統提供的應用程序界面(API)。用戶程序通過調用這些API獲得操作系統的服務。
系統調用按功能可以分爲六大類:

  • 進程控制類
  • 文件管理類
  • 設備管理類
  • 內存管理類
  • 信息維護類
  • 通信類

系統調用分爲三個階段:參數準備階段、系統調用識別階段、系統調用執行階段。

進程詳解

進程概論

進程就是進展中的程序,或者說晉城市執行中的程序。一個程序加載到內存後就變爲進程。即:

進程=程序+執行

系統的產生與消失

主要的事件有:

  • 系統初始化
  • 執行進程創立程序
  • 用戶請求創立新進程

造成進程消亡的事件則可以分爲四種情況:

  • 壽終:進程運行完成而推出
  • 自殺:進程因錯誤而自行退出
  • 他殺:進程被其他進程強行“殺死”
  • 處決:進程因異常而強行終結。

進程的狀態

進程分爲三種狀態:執行、阻塞、就緒。


這裏寫圖片描述

進程創建

進程創建步驟:

  • 分配進程控制塊
  • 初始化機器寄存器
  • 初始化頁表
  • 將程序代碼從磁盤讀進內存
  • 將處理器狀態設置爲“用戶態”
  • 跳轉到程序的起始地址(設置程序計數器)

進程與地址空間

進程空間也稱爲地址空間,地址空間就是進程要用的所有資源,所有資源構成了狀態的劃分。地址空間是“被動”的,只提供支持。進程與地址空間研究的主要內容是如何讓多個進程空間共享一個物理內存。具體來說,就是高效、安全地讓說有進程共享這片物理內存。

進程管理

進程管理所需要的手段

當一個進程產生時,操作系統就爲其建立記錄,操作系統用於維護進程記錄的結構就是進程表或進程控制塊(PCB,Process Control Block)。

維護的資料信息包括:寄存器、程序計數器、狀態字、棧指針、優先級、進程ID、信號、創立時間、所耗CPU時間、當前持有的各種句柄等。

進程管理要處理的問題

進程管理的最大問題就是資源分配。本質是追求公平,除了公平之外,還有一個問題要考慮:效率問題,也即最優。公平與效率就是進程管理中永恆的主題。

線程

進程是運轉的程序,是爲了在CPU上實現多道編程而出現的概念,線程的出現是爲了充分利用處理器的多核性能。

線程是CPU調度的基本單位。將進程分解爲線程可以有效利用多處理器和多核計算機。線程是進程的分身,是進程的不同執行序列。

線程管理

一般情況下線程共享和獨享資源劃分

線程共享資源 線程獨享資源
地址空間 程序計數器
全局變量 寄存器
打開的文件
子進程 狀態字
鬧鈴
信號及信號服務程序
記賬信息

線程的實現方式

線程的管理有兩種選擇:一是讓進程自己來管理線程,二是讓操作系統來管理線程。不同的選擇就出現了內核態線程和用戶態線程,這也是線程實現的兩種方式。由進程自己管理就是用戶態縣城實現,由操作系統管理就是內核態線程實現。

內核態線程實現

與管理進程一樣,操作系統要管理線程,就要保持維護線程的各種資料,即將線程控制塊放在操作系統內核空間,這樣操作系統就同時保有進程控制塊和線程控制塊。根據它們提供的信息,操作系統就可以對線程進行各種類似進程的管理,如縣城調度、線程的資源分配、各種安全措施的實現等。

用戶態線程實現

線程在剛出現時,由於無法說服操作系統人員修改操作系統,實現方式只能是在用戶態。用戶自己做線程的切換,自己管理線程的信息,操作系統無需知道線程的存在。用戶自己寫一個執行系統(runtime system)作調度器(runtime scheduler),即除了正常執行任務的線程外,還有一個專門負責線程調度的線程。一個線程執行完一段時間後主動把資源釋放給別人使用,而內核態則無須如此。在用戶態實現情況下,執行系統的調度器也是線程,沒有能力強行奪走控制權。(見下圖)

現代操作系統的線程實現模型

鑑於用戶態和內核態都存在缺陷,現代操作系統是將二者結合使用。用戶態的執行系統負責進程內部線程在非阻塞時的切換,內核態的操作系統負責阻塞線程的切換,即同時實現內核態和用戶態線程管理。內核態的線程數量較少,用戶態的線程數量多,每個內核態線程可以服務一個或多個用戶態線程,換句話就是,用戶態線程被多路複用到內核態線程上。

線程通信

由於一個進程通常包含多個線程,這多個線程之間因爲資源共享就存在一種合作的關係,這種合作關係既可以相互獨立也可以實現交互。這就是通信。
線程之間的交互稱爲線程通信。線程通信是從進程通信演變而來的,進程通信有個專用縮寫,叫IPC(Inter-Process Communication)。由於每個進程至少有一個線程,所以進程之間的通信就是進程裏面線程的通信。

管道、記名管道、套接字

管道

管道是一個線性字節數組,類似於文件,使用文件讀寫的方式進行訪問。但卻不是文件,因爲通過文件系統看不到管道的存在,管道可以設在內存裏,而文件很少設在內存裏。在linux/unix系統中管道使用”|”。

記名管道

如果要在兩個不相關的線程,比如兩個不同進程的線程之間進行管道通信,就需要使用記名管道。記名管道不能與文件系統命名文件重複,記名管道名稱由兩部分組成:計算機名和管道名。

套接字(socket)

使用套接字進行通信需要雙方均創建一個套接字,其中一方作爲服務器方,另一方作爲客戶方。
套接字按照傳輸媒介分爲本地套接字和網域套接字。網域套接字分爲:

  • 數據流套接字(stream socket):提供雙向,有序、可靠、非重複數據通信
  • 電報流套接字(datagram):提供雙向消息流,數據不一定按序到達
  • 序列包套接字(sequential):提供雙向、有序、可靠連接,包有最大限制
  • 裸套接字(raw socket):提供對下層通信協議的訪問

共享內存

共享內存就是兩個進程共同擁有同一片內存,這片內存中的任何內容,二者均可以訪問。
注意:使用全局變量在同一個進程的線程間實現通信不稱爲共享內存。

消息隊列

消息隊列是一列具有頭和尾的消息排列,新來的消息放在隊列尾部,而讀取消息則從隊列頭部開始。

進程同步

線程同步的目的就是不管線程之間的執行如何穿插,其運行結果都是正確的。
兩個或多個線程爭相執行同一段代碼或訪問同一資源的現象稱爲競爭。這個造成競爭的共享代碼段或資源就稱爲臨界區。要避免競爭,就需要防止兩個或多個線程同時進入臨界區,這時候就需要協調手段。協調的目的就是在任何時刻只能有一個人在臨界區,稱爲互斥。
互斥滿足的四個條件:

  • 不能有兩個進程同時在臨界區裏面
  • 能夠在任何數量和速度的CPU上正確執行
  • 在互斥區域外不能阻止另一個進程的運行
  • 進程不能無限制地等待進入臨界區

進程調度

計算機程序分爲計算密集型,I/O密集型,平衡型程序,進程調度就是爲了實現對資源的合理管理、分配,實現利用率和效率的最大化。

CPU調度

CPU調度就是要達到極小化平均響應時間、極大化系統吞吐率、保持系統各個功能部件均處於繁忙態和某種公平的機制。

先來先服務調度算法FCFS(first come first serve)

先來先到的一個隱含條件就是不能搶佔,一個程序一旦啓動就一直運行到結束或者受阻塞爲止。

時間片輪轉算法

時間片輪換算法是對FIFO算法的一種改進,主要目的是改善短程序的響應時間,實現方式是週期性地進行程序切換。

短任務優先

短任務優先算法STCF(storted time to completion first),是爲了改善短任務排在長任務後面輪轉而造成響應時間和交互體驗下降的辦法而演變來的解決方案。具體來說,就是短任務的優先級比長任務的高,系統總是安排優先級高的程序優先執行。短任務優先有兩個變種:非搶佔和搶佔。

優先級調度

系統率先執行優先級高的進程。

混合調度算法

混合調度算法是爲了解決以上調度算法缺陷而設計的。

實時調度算法

實時調度算法種類較多,只介紹兩種經典算法:動態優先級調度和靜態優先級調度。動態優先級調度又稱爲最早截至任務優先算法EDF(earliest deadline first),而靜態優先級調度又稱爲最短週期優先算法RMS(rate monotonic scheduling)。

在操作系統裏,這種可以保證互斥的同步機制我們稱爲鎖。

鎖的基本操作

鎖有兩個基本操作:閉鎖和開鎖,閉鎖就是將鎖鎖上,其他人進不來。開鎖就是鎖打開,可以進入。

鎖的實現

  • 以中斷啓用與禁止來實現鎖
  • 以測試與設置指令來實現鎖
  • 以非繁忙等待、中斷啓用與禁止來實現鎖
  • 以最少繁忙等待、測試與設置來實現鎖
  • 中斷禁止、測試與設置來實現鎖

死鎖

死鎖:如果一個進程集合中的每個進程都在等待只能由該進程集合中的其它進程才能引發的事件,那麼,該進程集合就是死鎖。

死鎖發生的4個條件:

  • 死鎖發生的必要條件就是資源有限。即一個系統裏面的資源數量有限,以至於無法同時滿足所有線程的資源需求。

  • 死鎖的另外一個必要條件是持有等待。即一個縣城在請求新的資源時,已經獲得的資源並不釋放,而是繼續持有。

  • 死鎖的另一條件事不能搶佔。如果一個資源可以搶佔,則死鎖也不會發生。

  • 出現循環等待。

資源死鎖(resource deadlock):在大多數情況下,每個進程多等待的事件就是釋放該進程已經佔有的資源。但是由於所有進程都不能運行,他們中的任何一個資源都無法釋放資源,所以沒有一個進程可以被喚醒。進程的數量以及佔有或者請求的資源數量和種類都是無關緊要的,而且無論資源是何種類型都會發生這種結果。

資源死鎖的條件:

  • 互斥條件。每個資源要麼已經分配給了一個進程,要麼就是可用的。

  • 佔有和等待條件。已經得到某個資源的進程可以再請求新的資源。

  • 不可搶佔條件。已經分配給一個進程的資源不能強制性地被搶佔,它只能被佔有它的進程顯示的釋放。

  • 環路等待條件。死鎖發生時,系統中一定有兩個或者兩個以上的進程組成一條環路,該環路中的每個進程都在等待下一個進程所佔有的資源。

死鎖發生時,以上四個條件一定是同時滿足的。如果以上任何一個條件不滿足,死鎖就不會發生。

消除死鎖的必要條件

  • 消除資源獨佔條件

  • 消除保持和請求條件

  • 消除非搶佔條件

  • 消除循環等待條件

從死鎖中恢復

  • 利用搶佔恢復

  • 利用回滾恢復

  • 通過殺死進程恢復

內存管理

理想狀態下的內存:大容量、高速度和持久性。現實內存架構爲:緩存、主存、磁盤。

內存管理就是對內存架構進行管理,使程序在內存架構的任何一個層次上的存放對於用戶來說都是一樣的。用戶無需擔心自己的程序是存在緩存、主存、磁盤上。

內存管理的目的

1.地址保護:由於多道程序同時存在在內存中,操作系統要保證它們之間互不干擾,即一個進程不能隨便訪問另一個進程的地址空間。
2.地址獨立:程序發出的地址與具有機器的物理主存地址是獨立的。

虛擬內存

虛擬內存的核心思想就是把物理主存擴大到便宜、大容量的磁盤上,即將磁盤空間看作是主存空間的一部分。
虛擬內存要提供一個空間像磁盤那樣大、速度像主存那樣高的主存系統。

在程序運行前就計算出所有物理地址,這種運行前即將物理地址計算好的方式叫做靜態地址翻譯。

多道編程內存管理:固定分區和非固定分區

固定分區:就是將內存分爲固定的幾個區域,每個區域的大小固定。
非固定分區:當一個程序想要運行時,內存不足,就必須排隊等候另一個程序釋放內存,然後分配此程序運行的相應內存。

翻譯地址的方法:物理地址=虛擬地址+程序所在區域的起始地址
訪問地址滿足以下條件就是合法訪問:
程序所在區域的起始地址<=有效地址<=程序所在區域的起始地址+程序長度
由此可見,只要設置兩個端值:基址和極限,即可達到地址翻譯和地址保護的目的。

發佈了46 篇原創文章 · 獲贊 48 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章