深入理解操作系統中進程與線程的區別及切換機制(上)

来源:https://www.cnblogs.com/guoxiaoyu/archive/2023/08/28/17659686.html
-Advertisement-
Play Games

進程是正在運行的程式的實例,它可以包含一個或多個線程。我們瞭解了進程的執行方式,包括早期單核處理器上的順序執行以及引入多任務概念實現的偽並行。我們還探討了進程的狀態模型。進程可以處於就緒、運行、阻塞和結束等不同的狀態。就緒狀態表示進程已經準備好運行,但還沒有被調度執行。運行狀態表示進程正在執行。阻塞... ...


進程

所謂進程,大家可以理解為我們打開的應用程式,如微信、QQ、游戲等,但也有系統應用是我們看不見的,可以打開任務管理器一探究竟,我們寫的代碼程式在伺服器上在不運行的情況下,它就是一個二進位文件,並不是進程!

image

一個進程可以包含一個或者多個線程,但對於CPU來說他就是一個任務而已;

image

在早期,我們的CPU只有一個,而有多個任務需要執行時,它們只能排隊等待,無論前面的任務執行時間有多長,後面的任務都得耐心等待。這種方式顯然存在明顯的弊端。舉個例子,假設排在前面的A任務需要執行1小時,而排在後面的B任務僅需1分鐘,那麼B任務必須等待A任務完成後才能執行,這種方式顯得極其不靈活。

進一步發展後,我們擁有了多任務的系統。在CPU在同一時間只能處理一個任務的前提下,系統將時間劃分為多個時間片,每個任務只能占用一個時間片來執行自己的任務。一旦時間片用完,就必須輪到下一個任務執行,這種方式看起來就像是多個進程或任務同時在運行,這就是我們所說的併發,也稱為偽並行。

有偽並行,那麼就有真並行,隨著現代化發展,我們的CPU開始擁有多核處理器,如4核、8核等。這樣每個核心就像一個獨立的CPU一樣,可以並行處理多個任務。,8核對應的就是8個任務並行處理;

image

然而,我們當前的伺服器系統都是高併發狀態,不僅要運行自己的業務,還要占用一定的CPU資源來運行系統進程。因此,以下一系列問題就出現了:

  1. 一個任務占用多長時間的時間片?
  2. CPU如何進行任務切換?當一個任務正在執行時被切換,資源如何處理?
  3. CPU如何找到下一個要執行的任務的位置?

進程的狀態

五狀態模型

image

當我們的程式啟動後就會變成這種狀態,關聯如下:

就緒->運行:當任務獲得時間片後,使用CPU執行操作,進入運行狀態。

運行->阻塞:進程調用系統服務時,無法立即獲取返回值(如IO操作),進入阻塞狀態。

運行->就緒:如果占用的時間片已經結束了,但任務未完成,回到就緒狀態。

阻塞->就緒:阻塞結束後,進程回到就緒狀態。

運行->結束:進程自行完成任務後,那麼會被系統終止;

以上便是對於單個進程的5狀態描述,從上面可以看出由於系統通常同時運行多個進程,因此就緒和阻塞狀態的進程可能會有多個,那麼這麼多進行都在就緒態和阻塞態怎麼辦?一般來說就是使用隊列,這不跟你寫java是一樣的解決方案嗎?排隊就行了

七狀態模型

image

隊列是可以解決排隊了問題了,但是這麼長的隊列放到哪裡呢?我們的記憶體是很寶貴的,所以這裡面就有上一節說的記憶體交換的問題了,可以使用記憶體交換機制將部分進程交換到磁碟中,這時候就是一個掛起的狀態;

掛起的狀態分兩種:

  1. 就緒狀態的掛起:一旦進程重新載入到記憶體中,就會立即運行。
  2. 阻塞狀態的掛起:等待特定事件發生後才會運行。

這時候你就知道為什麼你可以運行很多個程式,但是有時候你打開的太多了,你正打開某一個軟體的同時,另一個軟體自己退了,你就可以看下你的記憶體是不是滿了,這是因為已經被交換到磁碟中的進程不容易重新載入回記憶體。一旦記憶體已滿,重新載入進程就變得困難。

總結

進程是指正在運行的程式,可以包含一個或多個線程。在早期,CPU只有一個核心,多個任務需要排隊等待執行。後來,引入了多任務的概念,將時間劃分為多個時間片,每個任務占用一個時間片執行,實現了偽並行。現代CPU擁有多核處理器,可以並行處理多個任務。高併發的伺服器系統中,除了運行業務,還要占用一定的CPU資源運行系統進程。進程的狀態通過隊列進行管理。同時還討論了記憶體交換和進程掛起的問題。


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

-Advertisement-
Play Games
更多相關文章
  • TDengine 是國內比較流的時序庫之一,支持群集並且免費,在.NET中資料比較少,這篇文章主要介紹SqlSugar ORM來操作TDengine 優點: 1、SqlSugar支持ADO.NET操作來實現TDengine,並且支持了常用的時間函數、支持聯表、分頁和批量插入和刪等操作 2、使用了原生 ...
  • ****## 前言 在講述之工廠方法模式前,我們來先瞭解簡單工廠模式,簡單工廠模式是最簡單的設計模式之一,它雖然不屬於GoF的23種設計模式,但是應用也較為頻繁,同時它也是學習其他創建型模式的基礎。下麵我們來先瞭解下簡單工廠模式,然後針對它的缺點來引出工廠方法模式。 ## 簡單工廠模式定義 **簡單 ...
  • 經過一段時間的準備,新的一期【ASP.NET Core MVC開發實戰之商城系統】已經開始,在之前的文章中,講解了商城系統的整體功能設計,頁面佈局設計,環境搭建,系統配置,及首頁【商品類型,banner條,友情鏈接,降價促銷,新品爆款】,商品列表頁面,商品詳情,購物車等功能的開發,今天繼續講解訂單管... ...
  • 目錄 Linux運維工程師面試題(3)1 LVS 的工作模式有幾種,分別是什麼2 LVS 由哪幾部分組成3 LVS 相關的術語有哪些4 LVS 集群的負載調度演算法有哪些5 使用LVS 可不可以把iptables給禁用刪除6 haproxy 調度演算法有哪些7 nginx 實現負載均衡的分發策略有那些8... ...
  • > 利用for迴圈語句, # 方案一 ##### > 定義1到10的變數,for語句引用該變數 ### 單行代碼 `list="1 2 3 4 5 6 7 8 9 10"; for i in $list; do echo $i; done` ### 多行代碼 for……do……done ``` li ...
  • # 鍵盤敲入 A 字母時,操作系統期間發生了什麼? 關於[8.1 鍵盤敲入 A 字母時,操作系統期間發生了什麼?](https://xiaolincoding.com/os/7_device/device.html)的總結,前面都介紹了,但是在最後總結操作系統發生了什麼的時候,我覺得有點不詳細,於是 ...
  • # Git和Gitlab使用 ## 前言 **版本控制概念**:記錄開發文件的時間機器 **分類**:1.本地版本控制系統、2.集中化的版本控制系統CVS、Subversion(SVN)、3.分散式版本控制系統GIT **產品**:github、git、gitlab ## Gitlab部署 **1. ...
  • 很多運維同學都遇到過“磁碟告警”,遇到這種情況就需要去清理磁碟。 這時候,很多同學通過各種途徑、手段、命令找到了占用磁碟比較大的文件,然後大手一揮, sudo rm -rvf xxxxx.log 以為這樣任務就完成了,誰知道,一查詢磁碟使用量還是居高不下,完全沒有釋放。 這是因為在Linux中,如果 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...