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

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...