[Python學習日記-84] 進程理論

[Python學習日記-84] 進程理論

簡介

進程的概念

并發與并行的區別

進程并發的實現

簡介

????????進程理論是計算機科學中一種重要的概念,用來描述操作系統中執行的程序實例。在操作系統中,每個程序的執行被稱為一個進程。進程理論研究進程的創建、調度、通信、同步和終止等方面的原理和方法。本篇我們將介紹進程的概念、進程的創建和終止,以及并發與并行的區別,并了解并發的實現。

進程的概念

一、什么是進程

????????進程是計算機中正在運行的程序的實例,大白話說就是正在進行的一個過程或者說一個任務,而負責執行任務則是 CPU。

????????每個進程都有自己獨立的內存空間,包括代碼、數據和堆棧等,使其能夠獨立運行并與其他進程隔離。操作系統通過管理進程來分配資源,確保它們能夠有效地運行并與其他進程協同工作。在多任務系統中,多個進程可以同時運行,共享計算機的處理器和內存資源。

二、進程與程序的區別

????????進程和程序是計算機領域中的兩個重要概念,它們之間有一定的區別:

程序:程序是一組指令的集合,描述了在計算機上執行特定任務的步驟和邏輯。程序是靜態的,它們通常存儲在磁盤或內存中,并且不具有執行的狀態。程序可以是源代碼、可執行文件或腳本等形式。

進程:進程是程序在計算機中執行時的實例。當程序被加載到內存中,并被操作系統調度執行時,就會形成一個進程。每個進程都擁有獨立的內存空間、堆棧和寄存器等資源,用于執行程序中的指令和處理數據。

? ? ? ? 總的來說,程序僅僅只是一堆代碼而已,而進程指的是程序的運行過程。

? ? ? ? 舉個例子,在一家有名的西餐廳中,廚師們正在為迎接顧客而做準備,他們有菜單中每道菜相應的食譜,廚房里有所需的原料(土豆、胡蘿卜、牛肉、雞肉等)。

? ? ? ? 在這個比喻中:

  • 菜單中每道菜相應的食譜就是程序(即用適當形式描述的算法)
  • 廚師們就是處理器(即CPU)
  • 做菜用的各種原材料就是輸入的數據
  • 進程就是廚師閱讀食譜,取來各種原材料以及烹飪料理等一系列動作的總和

? ? ? ? 餐廳開始營業了,顧客陸續進場,各項作業都井然有序的執行著,突然間一位顧客被鮮嫩多汁的牛排卡住了喉嚨,廚師想了想,處理被卡住喉嚨的顧客比做其他菜更加重要,于是廚師就記錄下他照著食譜做到哪兒了(保存進程的當前狀態),然后拿出一本急救手冊,按照其中的指示進行海姆立克急救法對顧客進行急救。

? ? ? ? 這里,我們看到處理機從一個進程(做菜)切換到另一個高優先級的進程(實施醫療救治),每個進程擁有各自的程序(食譜和急救手冊)。當被食物卡住喉嚨的顧客處理完之后,這位廚師又會回來繼續從他離開時的那一步開始繼續把菜做下去。

需要強調的是:同一個程序執行兩次,那也是兩個進程,例如,用 PoyPlayer(視頻播放軟件)打開兩個視頻,雖然都是同一個軟件,但是一個播放的是哆啦A夢,另一個播放的是蠟筆小新。

三、同步\異步和阻塞\非阻塞

1、同步

????????所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不會返回。按照這個定義,其實絕大多數函數都是同步調用。但是一般而言,我們在說同步、異步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。

? ? ? ? 舉個例子:

  • multiprocessing.Pool 下的 apply(發起同步調用后,就在原地等著任務結束,根本不考慮任務是在計算還是在 I/O?阻塞,總之就是無腦地等任務結束,這十分容易造成死鎖現象,實際編程中應該避免這種等待)
  • concurrent.futures.ProcessPoolExecutor().submit(func,).result()
  • concurrent.futures.ThreadPoolExecutor().submit(func,).result()

2、異步

????????異步的概念和同步相對。當一個異步功能調用發出后,調用者不能立刻得到結果。當該異步功能完成后,通過狀態、通知或回調來通知調用者。如果異步功能用狀態來通知,那么調用者就需要每隔一定時間檢查一次,效率就很低(有些初學多線程編程的人,總喜歡用一個循環去檢查某個變量的值,這其實是一 種很嚴重的錯誤)。如果是使用通知的方式,效率則很高,因為異步功能幾乎不需要做額外的操作。至于回調函數,其實和通知沒太多區別。

? ? ? ? 舉個例子:

  • multiprocessing.Pool().apply_async()(發起異步調用后,并不會等待任務結束才返回,相反,會立即獲取一個臨時結果,該結果并不是最終的結果,可能是封裝好的一個對象)
  • concurrent.futures.ProcessPoolExecutor(3).submit(func,)
  • concurrent.futures.ThreadPoolExecutor(3).submit(func,)

3、阻塞

????????阻塞調用是指調用結果返回之前,當前線程會被掛起(例如,遇到 I/O 操作)。函數只有在得到結果之后才會將阻塞的線程激活。有人也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對于同步調用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回而已。
????????舉個例子:

  • 同步調用:apply 一個累計1億次的任務,該調用會一直等待,直到任務返回結果為止,但并未阻塞住(即便是被搶走 CPU 的執行權限,那也是處于就緒態)
  • 阻塞調用:當 socket 工作在阻塞模式的時候,如果沒有數據的情況下調用 recv 函數,則當前線程就會被掛起,直到有數據為止

4、非阻塞

????????非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前也會立刻返回,同時該函數不會阻塞當前線程。

? ? ? ? 總的來說,同步與異步針對的是函數(任務)的調用方式。同步就是當一個進程發起一個函數(任務)調用的時候,一直等到函數(任務)完成,而進程繼續處于激活狀態;異步情況下是當一個進程發起一個函數(任務)調用的時候,不會等函數返回,而是繼續往下執行當,函數返回的時候通過狀態、通知、事件等方式通知進程任務完成。阻塞與非阻塞針對的是進程或線程。阻塞是當請求不能滿足的時候就將進程掛起;非阻塞則不會阻塞當前進程。

四、進程的創建與終止

1、創建

????????但凡是硬件,都需要有操作系統去管理,只要有操作系統,就有進程的概念,就需要有創建進程的方式,一些操作系統只為一個應用程序設計,例如,電飯煲中的控制器,一旦電飯煲啟動,電飯煲中的所有進程都會啟動,并存在于存儲當中。而對于通用系統(Windows、Linux、MacOS,之類會跑很多應用程序的),需要有系統運行過程中創建或撤銷進程的能力,主要分為四種形式創建新的進程:

  1. 系統初始化(查看進程:例如,Linux 中用?ps 命令查看,Windows 中用任務管理器查看。前臺進程負責與用戶交互,后臺運行的進程則與用戶無關,而運行在后臺并且只有在需要時才喚醒的進程,被稱為守護進程,例如,電子郵件、Web 頁面、新聞、打印等)
  2. 一個進程在運行過程中開啟了子進程(例如,nginx 開啟多進程、os.fork、subprocess.Popen 等)
  3. 用戶的交互式請求,而創建一個新進程(例如,用戶雙擊 QQ)
  4. 一個批處理作業的初始化(只在大型機的批處理系統中應用)

? ? ? ? 無論上述的哪一種,新進程的創建都是由一個已經存在的進程執行了一個用于創建進程的系統調用而創建的,而在不同系統中調用的方法也各不相同:

  1. 在 Unix 中該系統調用的是 fork,fork 會先創建一個與父進程一模一樣的副本,二者有相同的存儲映像、同樣的環境字符串和同樣的打開文件(在 shell 解釋器進程中,執行一個命令就會創建一個子進程)
  2. 在 Windows 中該系統調用的是 CreateProcess,CreateProcess 既處理進程的創建,也負責把正確的程序裝入新進程中

? ? ? ? 對于 Unix 和 Windows 創建的子進程有什么區別:

  1. 相同的是進程創建后,父進程和子進程有各自不同的地址空間(即多道技術要求物理層面實現進程之間內存的隔離),任何一個進程的在其地址空間中的修改都不會影響到另外一個進程
  2. 不同的是在 Unix 中,子進程的初始地址空間是父進程的一個副本,也就是說子進程和父進程是可以有只讀的共享內存區的。但是對于 Windows 來說,從一開始父進程與子進程的地址空間就是不同的

2、終止

? ? ? ? 對于進程的終止主要分為四種形式:

  1. 正常退出(自愿,如用戶點擊交互式頁面的叉號,或程序執行完畢調用發起系統調用正常退出,在 Linux 中用 exit,在 Windows 中用 ExitProcess)
  2. 出錯退出(自愿,執行命令 python a.py 時,命令中的 a.py 不存在)
  3. 嚴重錯誤(非自愿,執行非法指令,例如,引用不存在的內存地址、1/0 等,可以通過捕捉異常 try...except... 來規避)
  4. 被其他進程殺死(非自愿,例如,在 Linux 中使用 kill -9 殺死某個 pid)

五、進程的層次結構

????????在操作系統中,進程的層次結構是指多個進程之間的父子關系組成的層次結構。通常情況下,一個操作系統會以樹狀結構來組織多個進程之間的關系。

????????無論 Unix 還是 Windows,每個進程都有一個父進程(除了根進程,它是整個系統中的第一個進程),不同的是在 Unix 中所有的進程,都是以 init 進程為根,組成樹形結構。父子進程共同組成一個進程組,這樣當用戶從鍵盤發出一個信號時,該信號被送給當前與鍵盤相關的進程組中的所有成員。

?????????在 Windows 中,沒有進程層次的概念,所有的進程都是地位相同的,唯一類似于進程層次的暗示,是在創建進程時,父進程得到一個特別的令牌,稱為句柄,該句柄可以用來控制子進程,但是父進程有權把該句柄傳給其他子進程,這樣就沒有層次了。

六、進程的狀態

? ? ? ? 我們以一個 Unix 當中的命令為例

tail -f access.log |grep '404'

? ? ? ? 在執行程序 tail 時,開啟了一個子進程來執行程序 grep,兩個進程之間基于管道“|”通訊開啟了另外一個子進程,將 tail 的結果作為 grep 的輸入。

? ? ? ? 在這過程當中,進程 grep 在等待輸入(即 I/O)時的狀態被稱為阻塞,此時 grep 命令是沒有在運行的,在兩種情況下會導致一個進程在邏輯上不能運行:

  1. 進程掛起是自身原因,遇到 I/O 阻塞,便要讓出 CPU 讓其他進程去執行,這樣保證 CPU 一直在工作
  2. 與進程無關,是操作系統層面作出的操作,可能會因為一個進程占用時間過長,或者優先級等原因,進而調用其他的進程去使用 CPU

  • 運行:當一個進程在CPU上運行時(單處理機處于運行態的進程只有一個,多進程在 CPU 上交替運行)
  • 就緒:一個進程獲得了除 CPU 外的一切所需資源,一旦得到處理機即可運行
  • 阻塞:阻塞也稱等待或睡眠狀態,一個進程正在等待某一事件發生(例如,請求 I/O、等待 I/O 完成等)而暫時停止運行,此時即使把 CPU 分配給進程也無法運行,故稱進程處于阻塞狀態

并發與并行的區別

????????無論是并發還是并行,在用戶看來都是“同時”運行的,不管是進程還是線程,都只是一個任務而已,真是干活的是 CPU,CPU 來做這些任務只能一個一個來,即同一時刻只能執行一個任務。

一、并發

????????并發(Concurrency)是指在一個時間段內同時處理多個任務是偽并行,即看起來是同時運行。這些任務可以交替進行,每個任務都可能在不同的時間點被執行,但在任何時刻只有一個任務在被執行。在并發中,任務之間可能會互相影響或者依賴,需要通過調度算法來決定任務的執行順序。單個 CPU 的情況下,可以利用多道技術來實現并發。

? ? ? ? 舉個例子:

  • 情人節約會:有一個海王他有三個女朋友,在情人節這天碰巧都要去同一個商場約會,那沒辦法你只能硬著頭皮去了,我們把情人節這天和各個女朋友約會都看作是一個約會任務,這個海王被這三個任務共享,如果想要不出現修羅場的情況,那就要玩出并發戀愛的效果,具體操作應該是這樣的,先跟“女友1”去看電影,看了一會說:“不好,我要拉肚子”,然后跑去跟“女友2”吃飯,吃了一會說:“那啥,我去趟洗手間”,然后跑去跟“女友3”開了個房,做了一回又跑回“女友1”哪里繼續看電影,如此循環往復過完了情人節這天。

二、并行

????????并行(Parallelism)是指在同一時刻同時執行多個任務。在并行中,多個任務同時在不同的處理器上或者不同的計算機上并行執行,每個任務都有自己的執行流程。并行可以顯著提高計算效率,尤其是在處理大規模數據或者復雜計算任務時。

? ? ? ? 舉個例子:

  • 假設銀行有四個柜臺,現在來了六個客戶都要辦理業務,這樣同一時間有四個任務被執行,假設分配給了柜臺1、柜臺2、柜臺3、柜臺4,這個時候所有柜臺都占滿了,客戶5和客戶6只能等著,一旦客戶1遇到需要等待家人拿資料過來,就會中斷當前服務,此時客戶5就拿到柜臺1的時間片去辦理業務了,而客戶1資料到了之后銀行會重新調用他,可能會被分配到四個柜臺的其中一個去繼續處理之前的業務
  • 我們換個視角,從計算機的視角出發,四個柜臺對應四個核,分別是 CPU1、CPU2、CPU3、CPU4,六個客戶對應六個任務,這樣同一時間有四個任務被執行,假設分別被分配給了 CPU1、CPU2、CPU3、CPU4,一旦任務1遇到 I/O 就被迫中斷執行,此時任務5就拿到 CPU1 的時間片去執行(這就是單核下的多道技術,也就是說并行和多道技術并不沖突),而一旦任務1的 I/O 結束了,操作系統會重新調用它(要知道進程的調度、分配給哪個 CPU 運行,都是操作系統說了算,可能被分配給四個 CPU 中的任意一個去執行

?????????所有現代計算機經常會在同一時間做很多件事,即使是一臺個人電腦(無論是單核還是多核),都可以同時運行多個任務(一個任務可以理解為一個進程),例如后臺運行著360殺毒的同時打開著 QQ 在聊天,還打開了 PotPlay 播放電影。這些被同時運行的進程都需要被管理,這也說明了一個支持多進程的多道程序系統是多么至關重要。

? ? ? ? 多道技術的回顧請查看這篇博客:操作系統的介紹

進程并發的實現

????????進程并發的實現在于,硬件中斷一個正在運行的進程,把此時進程運行的所有狀態保存下來,為此操作系統需要維護一張表格來保存下終端的狀態,這張表被稱為進程表(Process Table),每個進程占用一個進程表項,這些表項被稱為進程控制塊

????????該表存放了進程狀態的重要信息:程序計數器、堆棧指針、內存分配狀況、所有打開文件的狀態、帳號和調度信息,以及進程由運行態轉為就緒態或者阻塞態時必須保存的信息,從而保證該進程在再次啟動時,就像從未被中斷過一樣。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70915.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70915.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云創智城YunCharge 新能源二輪、四輪充電解決方案(云快充、萬馬愛充、中電聯、OCPP1.6J等多個私有單車、汽車充電協議)之新能源充電行業系統說明書

云創智城YunCharge 新能源充電行業系統說明書 ?官方文檔 ?官網地址 1. 引言 隨著全球環境保護和能源危機的加劇,新能源汽車行業得到了快速發展,充電基礎設施建設也隨之蓬勃發展。新能源充電行業系統旨在提供高效、便捷的充電服務,滿足電…

OpenWebUI配置異常的外部模型導致頁面無法打開

一、使用Ollama關閉OpenAI OpenWebUI自帶OpenAI的API設置,且默認是打開的,默認情況下,啟動后,會不斷的去連https://api.openai.com/v1,但是無法連上,會報錯,但是不會影響頁面,能正常…

RuntimeWarning: invalid value encountered in scalar power在進行標量的冪運算時遇到了無效值

year_profit ((profit / initial_cash) ** (1 / yy) - 1) * 100 RuntimeWarning: invalid value encountered in scalar power 這個警告表示在執行標量冪運算 ((profit / initial_cash) ** (1 / yy) - 1) * 100 時遇到了無效值。常見的引發原因及解決辦法如下: ###…

計算機畢業設計 ——jspssm506Springboot 的舊物置換網站

📘 博主小檔案: 花花,一名來自世界500強的資深程序猿,畢業于國內知名985高校。 🔧 技術專長: 花花在深度學習任務中展現出卓越的能力,包括但不限于java、python等技術。近年來,花花更…

Kafka消費者相關

Kafka生產者相關-CSDN博客 消費者消費數據基本流程 package com.hrui;import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache…

【軟考-架構】備戰2025軟考

新老教材對比 科目1(信息系統綜合)考點詳解 科目2(系統架構設計案例)考點詳解 科目3(系統架構設計論文)考點詳解 趨于越來越具體 學習方法推薦 第一階段 – 基礎知識階段 建議一個半月; 先過…

MMW-1碳棒磨損機設計

摘 要 為了更好的測量在一定壓力下碳棒的磨損量,提高碳棒磨損量的測量精度,本文設計了一種MMW-1碳棒磨損機,該碳棒磨損機屬于柱盤式摩擦磨損試驗機的一種。該機器主要用于做和碳棒有關的摩擦磨損試驗,可以更準確的獲得相關的參數…

網絡運維學習筆記(DeepSeek優化版)005網工初級(HCIA-Datacom與CCNA-EI)鏈路層發現協議與VLAN技術

文章目錄 一、鏈路層發現協議1.1 思科CDP協議1.2 華為LLDP協議 二、VLAN(Virtual Local Area Network,虛擬局域網)技術詳解2.1 基本概念2.2 技術特性2.3 接口工作原理2.3.1 Access模式2.3.2 Trunk模式 2.4 廠商配置對比思科配置華為配置 2.5 …

SOME/IP-SD -- 協議英文原文講解5

前言 SOME/IP協議越來越多的用于汽車電子行業中,關于協議詳細完全的中文資料卻沒有,所以我將結合工作經驗并對照英文原版協議做一系列的文章。基本分三大塊: 1. SOME/IP協議講解 2. SOME/IP-SD協議講解 3. python/C舉例調試講解 5.1.2.5 S…

APNG格式圖片文件大小優化方案 轉WEBP

文章目錄 原因過程相關下載相關文檔后記 原因 頁面上有個特效動畫,PNG文件,APNG格式,13M大小,太占用內容了,要優化一下。 過程 直接上命令吧 ffmpeg -i input.apng -vf "formatrgba" -loop 0 output.web…

個人電腦小參數GPT預訓練、SFT、RLHF、蒸餾、CoT、Lora過程實踐——MiniMind圖文版教程

最近看到Github上開源了一個小模型的repo,是真正拉低LLM的學習門檻,讓每個人都能從理解每一行代碼, 從零開始親手訓練一個極小的語言模型。開源地址: GitHub - jingyaogong/minimind: 🚀🚀 「大模型」2小時…

PHP Zip 文件處理指南

PHP Zip 文件處理指南 引言 ZIP文件是一種流行的壓縮格式,廣泛用于文件壓縮和歸檔。PHP作為一門強大的服務器端腳本語言,提供了豐富的類和方法來處理ZIP文件。本文將詳細介紹PHP中ZIP文件的處理方法,包括創建、添加文件、提取文件以及壓縮和…

Java使用ZXing庫生成帶有Logo的二維碼圖片,并去除白邊動態伸縮上傳到阿里云OSS

文章目錄 引言二維碼基本原理1、二維碼概述2、QR Code結構3、錯誤糾正級別 QR Code生成技術1、ZXing庫2、生成二維碼的步驟 圖像處理技術1、嵌入Logo2. 去除白邊 阿里云OSS基本概念1、OSS概述2. 主要功能3. 基本概念 實戰演示1、依賴庫2、類結構3、生成普通二維碼4. 去除白邊5、…

AI工具箱最新使用教程

先克隆項目 電腦需要先安裝 git ,安裝的畫看這個 Git安裝教程(超詳細)。 git鏡像 git clone https://github.com/Escaflowne1985/MyToolsWebBackendUser.gitgitee鏡像 git clone https://gitee.com/escaflowne/MyToolsWebBackendUser.git…

Android-創建mipmap-anydpi-v26的Logo

利用 Android Studio 自動創建 創建新項目:打開 Android Studio,點擊 “Start a new Android Studio project” 創建新項目。在創建項目的過程中,當設置Target SDK Version為 26 或更高版本時,Android Studio 會在項目的res目錄下…

SEO煉金術(4)| Next.js SEO 全攻略

在上一篇文章 SEO煉金術(3)| 深入解析 SEO 關鍵要素 中,我們深入解析了 SEO 關鍵要素,包括 meta 標簽、robots.txt、canonical、sitemap.xml 和 hreflang,并探討了它們在搜索引擎優化(SEO)中的作…

面試葵花寶典之React(持續更新中)

1.談談你對HOC的理解 定義: 高階組件是一個接收組件作為參數并返回新組件的函數,用于復用組件邏輯,遵循純函數特性(無副作用,輸出僅依賴輸入)。 組合性:可嵌套使用多個 HOC。 HOC(…

數據安全管理的AI工具有哪些?

數據安全管理的AI工具在不斷演進,它們憑借強大的算法和學習能力,為企業筑起了一道堅不可摧的數字防線。 在數據安全管理領域,AI工具的應用日益廣泛,以下是一些常見的工具及其功能: AI驅動的數據分類與標記 工具: Micr…

Matplotlib 繪圖標記

Matplotlib 繪圖標記 引言 Matplotlib 是一個功能強大的 Python 繪圖庫,廣泛用于數據可視化。在 Matplotlib 中,繪圖標記(markers)是數據點在圖表中顯示的方式。正確的使用繪圖標記可以增強圖表的可讀性和美觀性。本文將詳細介紹…

【DeepSeek問答】QProcess::start是異步的嗎?會使UI卡頓嗎?

好的,我現在需要回答用戶關于QProcess::start是否是異步的,以及它是否會導致UI卡頓的問題。用戶之前已經詢問過如何開發一個調用7-Zip的Qt應用,并且我給出了示例代碼。現在用戶可能在使用過程中遇到了問題,或者想更深入了解QProce…