操作系統----CPU、內存、進程管理

操作系統

一、 操作系統的功能

1)概念:管理硬件的軟件

主要的核心就是:CPU管理、內存管理、磁盤管理、文件管理(硬盤管理),還有一個隱藏的進程管理

2)操作系統中的庫函數和系統調用

1>概念:爲什麼要有庫函數和系統調用函數,主要是爲了保護操作系統。將內存分爲了內核態和用戶態,內核態能訪問所有內容,包括硬件等,而用戶態的權限有限,用戶程序一般運行在用戶態,當需要時候纔會進入內核態。而在用戶態所執行的函數正是庫函數,當需要進入內核態的時候,就要執行系統調用進入內核態,也可以說系統調用函數就是一個接口。

在這裏插入圖片描述

硬件(內存條)提供了主動進入到內核態的方法,對於Intel X86來說,就是中斷指令int,其中int指令將使上面的CS中的CPL改爲0,“進入內核”

2>從一個程序來看

在這裏插入圖片描述

當我們在終端執行shell指令的時候,操作系統首先會fork()一個子進程來執行,(整個操作系統進程就是一個大的父進程),然後調用printf命令,最後經過系統調用函數write()進入到內核態。(相關的系統調用函數還有open(),fork(),read()等等),而在調用系統調用時採用的是中斷處理通知system_call(),其中的一個重要的指令就是0x80

在這裏插入圖片描述

二、CPU 管理

1)cpu工作原理:自動取指-執行的方式(cpu會根據我們設置的額PC(程序計數器)開始的位置,然後一步步往下執行),但這時就有問題了,當我們執行的一個進程中,存在讀文件的操作,而讀文件的操作需要訪問到磁盤,也就是執行I/O操作,I/O操作就會阻塞,這樣CPU就會空閒,導致CPU利用率低下。所以就有了操作系統是一個多進程執行的概念,就是爲了提高CPU的利用率。

在這裏插入圖片描述

CPU單進程執行的情況

在這裏插入圖片描述

CPU多進程執行的情況,當遇到阻塞的時候,切換去執行另外的進程,這樣就可以提高CPU的利用率

但是這時候又有另外一個問題,PC切換到另外一個進程的時候,如何保存當前進程的執行信息呢。這時候就出現了一個叫做PCB(進程控制塊),所有進程執行的信息都保存在這個結構裏面,當切換到這個進程的時候,在這個結構裏面進行相關信息的查找和恢復。

在這裏插入圖片描述

在這裏插入圖片描述

因爲CPU是一個多進程執行圖像,所有就涉及到多進程調度。常見的算法有FCFS(先到執行),Priority(優先級),SCF(短作業優先)。多進程調度還涉及到另外一個問題也就是當多個進程同時處於內存空間時,如何防止他們訪問同一塊內存地址空間,這就涉及到操作系統的內存管理。(也是後面會提到的)

在這裏插入圖片描述

2)用戶級線程

在這裏插入圖片描述

在一個UC瀏覽器中,打開UC瀏覽器就是打開一個進程,我們可以用這個瀏覽器做很多事情,這時候就是一個執行多線程的命令。

關鍵的一個概念就是線程共享全局變量,但擁有自己的執行棧。必須擁有自己的執行棧的原因是因爲這樣不會出現跳轉錯誤。當兩個線程中存在相同名稱的時候,不會再執行線程1的時候,回調時跑到線程2中去。

在這裏插入圖片描述

這種情況就是當只有一個線程棧的時候

在這裏插入圖片描述

這種情況是每個線程都有自己的線程棧,這樣就不會跑到別人的線程中去。主要關鍵的函數是Yield()函數,yield()進行線程的切換。所以當有兩個線程時,就必須要有兩個TCB表(線程控制塊,保存線程信息),兩個棧。當用戶級線程經過調用而陷入內核的時候,就會調用核心級線程

3)核心級線程

和用戶級線程一樣,核心級線程對於棧也必須有兩個,但它不單單是兩個棧,而是兩套。因爲核心級線程還要關聯到它在用戶級下的線程,當核心級線程切換時,用戶級線程也必須跟着切換。

在這裏插入圖片描述

一套內核棧

這就是兩套內核級線程的棧,可以看出是採用Schedule()函數進行調度的

所以核心級線程的棧在創建的時候,會關聯到用戶級的線程棧。做到同步切換。

在這裏插入圖片描述

三、進程同步和信號量

[外鏈圖片轉存失敗(img-ffBa142r-1566118254443)(C:\Users\tangyuan\AppData\Roaming\Typora\typora-user-images\1566040669033.png)]

上面這張圖說明了什麼是兩個進程同步,這時候問題來了,當有多個生產者和多個消費者的時候,當生產者的緩衝區剛好慢,這時候有多個生產者進程處於阻塞狀態,而消費者進程判斷到緩衝區有東西可以緩存,這時候如果我們採取的是一個信號的機制,就會出現一種情況,就是後面等待的進程永遠無法被喚醒,

在這裏插入圖片描述

這時候就有了信號量了,信息只能表示兩種狀態,而信號量可以用來表示由多少個在等待。

這裏應該注意的是這個-1表示當前有一個進程在等待,+1表示由一個空閒的可用資源。

這時候問題來了,當多個進程同時運行的時候,也就是併發對這個信號量進行修改,則會產生併發問題。這時候就要對信號量進行保護,也就有了臨界區。

在這裏插入圖片描述

並且臨界區要遵守以下原則

當然進入臨界區有很多算法:輪換法、標記法、非對稱標記法、Peterson算法 、硬件原子指令法(重要且簡單)

四、內存管理

1)應該解決的:如何讓內存使用起來

通過圖,我們可以看到,就是將程序加載到內存中去,然後pc指向開始位置,然後CPU就開始取指-執行的過程。

這個時候又有一個問題來了,通常我們的內存的大小是有限的,不可能每一個進程都全部加載到內存中去,這樣明顯內存空間不足。這時候就出來了一個概念了,SWAP。

在這裏插入圖片描述

(但是應該注意一點就是,SWAP是整個進程的換入換出,這樣代價太大,現在很少這樣做,而是採用了頁面置換,也就是以進程中更小的單位,進行置換,提高效率)

在這裏插入圖片描述

進程的切換涉及到的PC的切換,而PC的切換時根據PCB進行切換。

2)分段的概念:前面我們提到了不可能採用將整個進程進行換入換出,而是根據頁面進行置換。而在頁和進程之間,還有一個重要的概念,就是段,也就是一個進程是分成不同的段進行載入到內存,每個段都有一個PC執行單元往下執行(可以對比Java中的JVM內存管理,也是分成不同的段,這樣可以更好的進行管理,共享數據,只讀數據,私有數據分的明明白白)

在這裏插入圖片描述

程序是分成段放到內存單元中去

在這裏插入圖片描述

這時我們知道了原來程序是分爲多個段載入到內存中去,那麼現在又有一個問題了,這些段是載入到內存中的哪些區域,是隨意的還是有固定的位置,這就涉及到內存請求分配算法。

在這裏插入圖片描述

原來內存中採用兩張表來記錄,一張分配的空間表,一張剩餘空間表,其中表中的記錄比較詳細,從哪個位置和有多大進行記錄。這時候問題又來了,我們可以看到空閒分區表中有多個,那每次新的請求進來的時候要分配哪一個呢?這就涉及到了分配算法。具體有:

在這裏插入圖片描述

但是分區又會出現一個問題,就是當空閒區域的長度不夠分配的時候怎麼辦。也就是如果我有一個進程需要160K,根據上面的空閒表,只有一個150K和50K,兩個合起來就夠用,但是分開就不夠用,造成空間的浪費。所以這時就引入了一個分頁的概念。

3)分頁概念:通常一個頁的大小是4K,這時候問題又來了,如果這樣劃分了話,這個頁表的大小就要非常大了才能保存空閒和使用的表項

在這裏插入圖片描述

所以這時候可以採用一種辦法,就是不記錄空閒的區域,只記錄使用過的區域。但是這時候又有一個問題,每次要分配的時候就要進行查找,時間效率低下,這時候就出現了多級頁表,也就是我們書的目錄索引(多級目錄)

在這裏插入圖片描述
在這裏插入圖片描述

這樣,空間利用率就高了,但是時間利用率呢,這時候就引入了快表的概念(TLB,Translation Lookaside Buffer(地址轉換後援緩衝器)),作用就是頁表的Cache其中存儲了當前最可能被訪問到的頁表項,其內容是部分頁表項的一個副本。只有在TLB無法完成地址翻譯任務時,纔會到內存中查詢頁表,這樣就減少了頁表查詢導致的處理器性能下降。

現在好了,在內存中,實際使用的分配單元是頁,但是我們程序員希望的是按照段進行分配,那要怎麼樣將這兩者結合起來呢。

4)段頁結合(虛擬內存):採用的就是虛擬內存,用來存儲段跟內存之間的地址映射,內存的分配對用戶是透明的,用戶只需要關心段的分配

在這裏插入圖片描述在這裏插入圖片描述

在每一個段中都有一個映射到實際的物理內存中的表。這樣就可以將其關聯起來。
在這裏插入圖片描述

所以整個進程的狀態就是如上圖所示。

這時候我們解決了段和頁的映射,就是再硬盤中建一張虛擬內存表,而通常這張表的大小比實際的內存大小大,那麼程序是如何進行執行的時候換入換出內存的。這就是頁面置換算法。

在這裏插入圖片描述

其中換入比較簡單,當要執行的時候必須將程序換入,但是如何換出就涉及到很多算法,要將哪個頁給換出來呢。常見的算法有LRU,MIN算法,但是這些都是理論上的算法,實際在操作系統中很難實現。在操作系統中實際使用的是一個叫做CLOCK算法。
在這裏插入圖片描述

具體的CLOCK算法,可以網上查相關資料進行了解,主要是通過時鐘的方式進行的,一個清楚標誌位,一個用來選擇淘汰頁。

五、I/O與顯示器

外設也可以理解成文件,在操作系統中,一切都以處理文件爲基礎。

在這裏插入圖片描述

那麼外設是怎麼工作的呢,這一切還是要歸因於CPU的控制,外設只不過在設備驅動中,當使用外設,向CPU發送指令。
在這裏插入圖片描述
在這裏插入圖片描述

參考資料:操作系統-----李治軍## 操作系統

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章