操作系統學習(二)--進程描述和執行

来源:https://www.cnblogs.com/tobe98/archive/2019/09/26/11594652.html
-Advertisement-
Play Games

這是操作系統系列第 2 篇。 如果你想知道操作系統每天都在做些什麼,那就打開你的資源監視器: 資源監視器截圖,Windows 10 單獨通過這一張圖,我們就能夠總結出操作系統的幾個重要功能: 進程管理 線程管理 記憶體管理 I/O 管理 (包含了磁碟調度) 文件管理 ,這一功能在圖裡沒有表現出來,但我 ...


這是操作系統系列第 2 篇。

如果你想知道操作系統每天都在做些什麼,那就打開你的資源監視器:

file
資源監視器截圖,Windows 10

單獨通過這一張圖,我們就能夠總結出操作系統的幾個重要功能:

  • 進程管理
  • 線程管理
  • 記憶體管理
  • I/O 管理(包含了磁碟調度)
  • 文件管理,這一功能在圖裡沒有表現出來,但我相信每個使用電腦的人都知道它。

為什麼我要從進程開始講起呢?

原因很簡單,我們每天使用電腦,包括手機和電腦,本質上是使用運行在其操作系統上的應用程式。對於我們來講,操作系統最為直觀的功能就是進程管理,所以,讓我們從進程管理入手,由表及裡,一步步深挖操作系統的本質。

進程是什麼?

我在第一篇文章里簡單提到了進程這一概念,這裡再詳細講一下,加深理解。

操作系統的設計從根本上來說是為了迎合用戶需求,對個人用戶來說,需求就是在一臺電腦上運行多個應用程式,以滿足生活和工作的需要。但應用程式這麼多,不可能讓每一個程式占用一個 CPU 核心啊,因為 CPU 核心是有限的,人的需求是無限的。

所以操作系統就需要將無限(誇張一下)的應用程式,分配到有限的 CPU 上去。

當我們打開一堆程式時,這些程式就會被載入到記憶體上,為了讓這些運行的程式與沒有打開的程式作區分,我們創造了進程(Process)這個名詞。所以,進程就是對運行的程式的一種抽象,具有動態性。進程管理其實就是操作系統通過某種方式,管理我們已經打開的程式。

註:為了簡化後面的討論,我們假設所說的電腦是單核的。

進程的狀態有哪幾種?

講到進程,我們必然需要瞭解進程狀態,想要瞭解進程的狀態,我們就得從進程的角度,看一看進程的一生會發生什麼。

首先,用戶打開某個應用程式,這個程式就處於新建態(New),這個時候操作系統還沒有為這個程式做好準備工作,這個進程自身還沒有進入記憶體,可能還留在磁碟里。

等到這個進程被載入進記憶體,就代表它已經準備好運行了,但因為 CPU 資源正被別的進程占用,它只能等待操作系統為它分配 CPU。這個狀態稱為就緒態(Ready)。

在就緒態一段時間後,總會分配到 CPU 資源,一旦進程開始執行,它就進入了運行態(Running)。

有的進程可能會執行某些阻塞操作,就拿 I/O 操作來舉例子,執行操作後,進程需要等待 I/O 操作完成,第一篇文章講過,進程在這段時間內是無法使用 CPU 的,如果讓它繼續占用 CPU,就造成了資源浪費。所以操作系統會剝奪它的 CPU 使用權,並把它放在阻塞態。等到 I/O 操作結束後,再將其放入就緒態。

還有最後一種狀態——退出態,顧名思義,進程終止後,就會進入退出態,這個進程可能還沒有從記憶體中清理出去。等到進程完全退出記憶體,進程的一生就徹底結束了。

綜合以上的討論,我們得到了進程的 5 種狀態:
file

細心的讀者可能會發現,運行態到阻塞態,以及阻塞態到就緒態之間的箭頭是單向的。為什麼?

先來看看運行態和阻塞態。回憶一下,一個進程處於阻塞態代表什麼?(希望你看到這確實停下來思考了)

一個進程處於阻塞態,代表進程執行了某個阻塞操作,正在等待操作的結果。也就是說,處於阻塞態的進程沒有使用 CPU 的能力,所以即使給了它 CPU 它也沒辦法運行,自然無法進入執行狀態。所以從阻塞態是無法直接跳到運行態的。

再來說說就緒態和阻塞態。如果一個進程位於就緒態,說明它現在沒有使用 CPU,所以更不可能執行阻塞操作。因此從就緒態也不能直接跳轉到阻塞態。

結合剛剛的解釋,我們來看看一個簡單的進程的排隊模型:
file

圖中的 ABCDEF 代表了進程

要註意的是,就緒態,運行態和阻塞態提供了一種描述進程行為的系統方法,指導了操作系統的實現,許多實際的操作系統都是按照這樣的三種狀態進行具體構造的。但這不代表就沒有其他狀態的立足之地了,在一些實現中(其實是主流實現,但由於牽扯到虛擬記憶體的概念,所以留到以後講解),還有掛起態等狀態。但不管哪種狀態,他們都是為了操作系統能夠最大化利用電腦資源而抽象出來的。

留幾個小問題做思考:

  1. 為什麼只有從運行態才能轉換到退出態?
  2. 你能看懂上圖排隊模型嗎?

PCB 是什麼東西?

操作系統在管理和控制進程的時候,首先必須知道進程的位置(即進程被載入到哪一塊記憶體了),其次,它還需要知道進程的屬性,如進程 ID,進程狀態等,所以我們就得有一個結構能夠保存這些信息。

進程式控制制塊(Process Control Block)就是這麼一個結構。進程式控制制塊會在程式啟動時就被創建出來。
file

進程式控制制塊的主要內容及記憶體映像(字醜勿怪)

我們可以看到,PCB 中存儲著進程 ID,寄存器狀態,棧指針等重要信息,這些信息現在看來非常陌生,但以後隨著你對操作系統理解的加深,你就會理解這些信息的含義和作用。

圖中還有一個信息,那就是 PCB 存儲在內核空間——表明只有操作系統有權利更改 PCB 裡面的內容。因為 PCB 太重要了,如果其內部信息被惡意修改,將造成進程意外終止,甚至可能導致操作系統的崩潰。

總結

讓我們來串一下今天的內容:

如果一個程式開始運行,那麼操作系統就會為其創建一個進程式控制制塊,並將其載入到記憶體中,進程式控制制塊內的「進程狀態」信息會更改為就緒態,並將進程放入就緒隊列等待分配 CPU。一旦分得 CPU,進程就進入運行態,根據實際情況,還可能因為執行阻塞操作而進入阻塞態,等到程式運行完畢,進程就被操作系統清出記憶體,然後刪除其進程式控制制塊。

如果看完上一段,對黑體字的概念還很模糊,那我建議你再慢慢看一遍文章,而且一定要帶上自己的思考,沒有經過思考的閱讀的效率是很低的。

希望你在看完文章之後有所收穫。感謝你的閱讀,我們後會有期!

聲明:原創文章,未經授權,禁止轉載


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄 "Java中的包概念" "包的作用" "package 的目錄結構" "設置 CLASSPATH 系統變數" "常用jar包" "java軟體包的類型" "dt.jar" "rt.jar" " .java文件的奧秘" " .Java文件簡介" "為什麼一個java源文件中只能有一個public ...
  • 如何更規範化編寫Java 代碼 Many of the happiest people are those who own the least. But are we really so happy with our IPhones, our big houses, our fancy cars? ...
  • 本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、IOC控制反轉 1、IOC容器思想 Java系統中對象耦合關係十分複雜,系統的各模塊之間依賴,微服務模塊之間的相互調用請求,都是這個道理。降低系統模塊之間、對象之間、微服務的服務之間耦合度,是軟體工程核心問題之一。因為Sprin ...
  • 六星教育php vip視頻(分享) 最近看的一個swoole的課程,應該也算是vip課程了,不是公開的直播課 比較有特點有一定深度,swoole的實戰教程一直也不多,結合swoole構建一個新型框架,最後講解如何實現分散式RPC的調用。 部分課程截圖: 下載鏈接:https://pan.baidu. ...
  • 寫的有不好的地方還請指正 1.下載與安裝 golang下載官網:1. https://golang.google.cn/dl/ 然後這裡我下載的是當前最新版本go1.13 下載完成之後直接雙擊安裝,然後預設是安裝到C盤的C:\Go目錄下,當然安裝的時候可以更改目錄,但是改不改其實無所謂,因為後面創建 ...
  • 認真閱讀,收穫滿滿,向智慧又邁進一步。。。 技術不枯燥,先來點閑聊先說點好事高興一下。前段時間看新聞說,我國正式的空間站建設已在進行當中。下半年,長征五號B運載火箭將在海南文昌航天發射場擇機將空間站核心艙發射升空。預計用2到3年將空間站建好。雖然到時你們不讓我上去,不過我也為這件事出不了什麼力,算扯 ...
  • 目錄 "final使用" "final變數" "final修飾基本數據類型變數和引用" "final類" "final關鍵字的知識點" "final關鍵字的最佳實踐" "final的用法" "關於空白final" "final記憶體分配" "使用final修飾方法會提高速度和效率嗎" "使用final ...
  • 我們知道前臺所顯示的數據一般是傳過去一些list集合封裝的信息,但面對眾多的數據自然不可能是一頁顯示完成, 需要我們進行分頁處理。這裡需要前後臺分別對數據和頁面就行處理和交互,才能形成良好界面。 先從後臺代碼說起,首先傳到前臺的數據不止集合,還需要分頁的一些數據參數,所以這裡我們選擇封裝一個Page ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...