cmd 找到8080對應進程_多進程概括

多進程圖像

操作系統記錄進程,并按照合理的次序交替推進(分配資源,不斷調度),提高CPU利用率和程序執行速度,這就是操作系統的多進程圖像。

當操作系統啟動時,多進程圖像就出現了。 在linux內核源碼main.c文件中,對操作系統初始化時,通過fork()系統調用啟動了1號進程,進行初始化,再啟動shell。 在shell中,我們輸入命令時,會再調用fork()啟動其他進程。

// main.c
if (!fork()) {init();
}// shell
while(1) {scanf("%s", cmd);if (!fork()) {exce(cmd);}wait();
}

在windows中我們可以通過任務管理器看到所有進程,Linux可以通過輸入topps命令查看進程,這就實現了進程的可視化。

2b75d9267b9ad43b2e89cdba09b4e8f9.png

組織調度交替執行進程

進程隊列

操作系統會將進程劃分成不同的隊列,并用PCB來記錄進程信息。

比如有的進程正在執行的隊列,有的進程在等待被執行的隊列,有的進程在等待硬盤讀取結果的隊列,還有的進程在已經執行結束的隊列。

其實跟我們在食堂排隊一樣,一條隊伍排隊等著打飯,一條隊伍排隊等著打菜,一條隊伍排隊等著打湯。

7aaa90bc489572304629c7e3231e6ea2.png

進程狀態

操作系統通過進程的狀態來劃分不同的隊列。

新建態,剛剛被創建,分配資源。

就緒態,進程已經可以被執行了,等待CPU中。

運行態,進程正在被CPU執行。

阻塞態,進程正在等待,磁盤等IO操作完成返回結果。

終止態,進程執行結束。

操作系統對通過狀態的不同管理進程,將相同狀態的進程連接成一個隊列,通過調度算法不斷交替執行進程,改變進程狀態,從而推進多個進程不斷向前推進。

2c402cdb39c9382236633feaa827122c.png

進程的管理和我們現實生活中處理方式一樣,比如我們去政府大廳辦事,不同窗口的工作人員就是CPU。 在機器正在掃碼領取排隊號的人就處于新建態,正在辦理業務的人就處于運行態,坐在椅子上等的人就處于就緒態,而辦理業務的時候發現身份證沒帶,去一邊等朋友送身份證的人就是阻塞態,辦理完了的人就處于終止態了。

調度算法

進程數量遠大于CPU數量,操作系統就要對進程進行調度,如果調度不合理也會導致效率低的問題,極端情況下CPU無事可干,再比如有的進程比較重要需要優先執行完,操作系統還需要將CPU資源優先分配給這類進程。

總之一個好的調度算法非常重要,這也是很多計算機科學家在不斷研究推進的一個課題。

最簡單的調度算法就是FIFO+優先級。 FIFO就是先進先出算法,高優先級的先被執行,相同優先級下,先進入隊列的先被執行,后進入隊列的后執行。

其他調度算法有興趣可以慢慢研究。

進程切換

進程切換首先修改PCB中的狀態值,并插入到對應的狀態隊列中。

調用schedule()模塊進行切換,getNext()可以理解成內部實現了一個調度算法,從就緒隊列中取出下一個可被執行的進程。

e3280a27d22cb0ca35dac5347afef671.png

PCB信息切換,switch_to()就先保存被切換的進程信息,再初始化或恢復即將執行的進程信息。

代碼只是簡單描述,實際工作非常復雜。

其實對照我們上面的描述,先將資源,比如寄存器中的值保存到當前進程的PCB中。然后將即將執行的進程信息從PCB中恢復或初始化,比如PCB中保存的寄存器值賦值給寄存器。

33b16afe39a7074330a2c625e72f1d99.png

多進程的內存隔離

多進程執行過程可能遇到下圖這個問題。

當進程1使用數據的內存地址是進程2代碼的指令地址。 當進程1執行的過程中,有可能在0x100地址寫入新值,導致進程2被破壞無法執行。

5c8c210735834c79bd04b9c208ccd67b.png

這個問題解決的辦法就是將不同進程使用的內存進行空間分離。

因此需要有個中間帶進行隔離,在進程和物理內存之間引入映射表。 進程使用的內存地址,通過映射表轉換成物理內存地址,從而使不同進程的內存地址進行分離。

如下圖所示,雖然進程1和進程2都使用了內存地址0x100,但是通過映射表獲取的物理地址分別是0x7800x1260

32594686c71cb6523f87bb94436f2830.png

操作系統為每個進程的設置的映射表,是按照一定映射規則來的,具體細節不去研究,但是可以保證內存地址空間分離,每個進程都在自己的一畝三分地里面執行。

就好比南京和福州都有鼓樓區,雖然名字一樣,但是南京和福州空間已經分離了,所以各地的人說到鼓樓區并不會沖突。

多進程合作

進程也可以相互合作,但是如果兩個進程共同修改使用相同的數據,可能會導致數據錯亂的問題。

比如一個傳統模型-生產者消費者模型。

生產者進程負責生成數據,消費者進程負責使用數據。

如下圖所示,生產者進程,生產一個數據count++,當count=10時,停止生產數據。消費者進程,消費一個數據count--,當count=0,停止消費數據。

消費者進程和生產者進程共享了count

395691403b48ae0589c827bcd342816d.png

由于進程是交替執行,有可能生產者進程生產了數據,但是count還沒有+1,就切換到了消費者進程,導致消費者進程使用的count的值是錯誤的,從而導致合作結果產生錯誤。

c7d27812349237072fb73c59f403c4d5.png

如果要解決這個問題,就需要保證當一個進程正在使用count時,其他進程不會使用。 其他進程只有等到count被釋放時,才能使用。

這就是多進程的鎖機制,實現進程同步,后面會詳細說。

7c838a5e8ff7f19db50e3f9541668962.png

總結

操作系統通過PCB保存進程信息。

操作系統根據進程的執行情況設置不同的狀態,并劃分到相應的狀態隊列中,通過調度算法交替切換執行進程。

每個進程通過映射表訪問物理內存地址,實現了不同進程之間的空間隔離。

多進程合作共享數據會可能導致數據不一致等問題,通過鎖機制實現進程同步,合理推進進程順序。

PS: 以上圖片來自MOOC的哈工大李老師的操作系統課程,李老師的課講的非常好,推薦大家觀看學習,如果文章有錯誤之處,歡迎指正,目前還處于學習階段。

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

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

相關文章

機器學習接口和代碼之 KNN

官網地址:https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors class sklearn.neighbors.KNeighborsClassifier(n_neighbors5, weights’uniform’, algorithm’auto’, leaf_size30, p2, metric’minkowski’, metric_paramsNone, n…

Eclipse中安裝Ext插件(Spket IDE)

在網上找了很多資料,這里重新整理一下。 Spket IDE是目前支持Ext 2.0最為出色的IDE。 它采用.jsb project file 文件并將繼承于基類和所有文檔的內容嵌入到生成代碼提示的. doc中。由于Spket只是一個單純的編輯器,沒有其它格式的支持(如CSS&a…

職業程序員培養之道

作者:粘新育 任甲林 來源:希賽網  http://www.csai.cn 2004年06月28日軟件開發是以人為核心的過程,對人的依賴性遠高于傳統的硬件生產企業,為了保持開發能力的穩定性,一方面需要定義軟件過程,以過程為樞紐…

MongoDB啟動

詳細見大神鏈接 鏈接: https://blog.csdn.net/chenpuzhen/article/details/90642147.

Go 語言編程規范

1. gofmt 命令 大部分的格式問題可以通過 gofmt 來解決,gofmt 自動格式化代碼,保證所有的 go 代碼與官方推薦的格式保持一致,所有格式有關問題,都以gofmt的結果為準。所以,建議在提交代碼庫之前先運行一下這個命令。 2…

python去噪音_python中的噪聲是什么意思

你的序列均值為零嗎? 方差隨時間變化嗎? 值與延遲值相關嗎? 你可以用一些工具來檢查你的時間序列是否為白噪音: 創建一個折線圖。檢查總體特征,如變化的平均值,方差或延遲變量之間的明顯關系。 計算匯總統計。對照序列中有意義的連續塊的均值和方差&a…

pycharm 離線安裝插件

插件離線下載地址: http://plugins.jetbrains.com/ 1、下載插件:http://plugins.jetbrains.com/ 2、安裝插件: settings -> plugins -> install plugin from disk,然后重啟IDEA即可。

為機器學習占地16

是將若干個學習器(分類器&回歸器)組合之后產生一個新學習器。弱分類器(weak learner)指那些分類準確率只稍微好于隨機猜測的分類器(errorrate < 0.5)。 集成算法的成功在于保證弱分類器的多樣性(Diversity)。而且集成不穩定的算法也能夠得到一個比較明顯的性能提升。 …

VC DLL學習

1 用VC創建DLL動態鏈接庫1.1 創建dll項目1.2 為dll項目編寫源文件頭文件dllDemo.hextern"C"_declspec(dllexport) intSum(inta,intb);//加法函數。extern"C"_declspec(dllexport) intMax(inta, intb);//取較大值函數extern"C"_declspec(dllexpor…

mciSendString 多線程播放多首音樂 注意事項

昨天晚上遇到一個問題&#xff1a; 使用 mciSendString 控制播放多首音樂的時候&#xff0c;出現最后一次播放的音樂無法通過 mciSendString ("close mp3") 關閉音樂的播放。 mciSendString 在多個線程中調用。 到23點&#xff0c;問題依然沒解決&#xff0c;只好先…

python代碼比例_Python如何輸出百分比

Python 輸出百分比的兩種方式 注&#xff1a; 在python3環境下測試。 方式1&#xff1a;直接使用參數格式化&#xff1a;{:.2%} {:.2%}&#xff1a; 顯示小數點后2位 顯示小數點后2位&#xff1a; >>> print(percent: {:.2%}.format(42/50)) percent: 84.00% 不顯示小…

為機器學習占地15

是將若干個學習器(分類器&回歸器)組合之后產生一個新學習器。弱分類器(weak learner)指那些分類準確率只稍微好于隨機猜測的分類器(errorrat弱分類器的多樣性(Diversity)。而且集成不穩定的算法也能夠得到一個比較明顯的性能提升。 常見的集成學習思想有&#xff1a;Baggi…

編寫一個項目開發文檔

項目開發過程中為了增加程序的可讀性和程序的健壯性&#xff0c; 方便后期程序的調試和維護&#xff0c;所以需要在開發過程中統一技術規范&#xff0c;一般會在項目初期確定好相關文檔作為這一統一的規范。不同公司會對文檔做不同要求&#xff0c;劃不同的分類&#xff0c;但一…

樂在其中設計模式(C#) - 原型模式(Prototype Pattern)

[索引頁][源碼下載]樂在其中設計模式(C#) - 原型模式(Prototype Pattern)作者&#xff1a;webabcd介紹用原型實例指定創建對象的種類&#xff0c;并且通過拷貝這個原型來創建新的對象。示例有一個Message實體類&#xff0c;現在要克隆它。MessageModelusing System; using Syst…

python123添加列表元素_Python之列表

Python變量沒有數據類型&#xff0c;所以Python沒有數組。 整數&#xff1b;浮點數&#xff1b;字符串&#xff1b;對象 創建一個列表&#xff1a; 1.member[大魚,123,3.14,[1,2,3]] 2.empty[] 向列表添加元素&#xff1a; append&#xff08;&#xff09;&#xff1a; member[…

為機器學習占地14

是將若干個學習器(分類器&回歸器)組合之后產生一個新學習器。弱分類器(weak learner)指那些分類準確率只稍微好于隨機猜測的分類器(errorrate <。 集成算法的成功在于保證弱分類器的多樣性(Diversity)。而且集成不穩定的算法也能夠得到一個比較明顯的性能提升。 常見的…

優秀程序員 分析提高能力 程序進階

我出生在南方的一個農村。還記得小時候家里是很窮的&#xff0c;那時候上學也很便宜&#xff0c;我已記不清初中以前的學費是多少了。反正從小在家里玩泥巴&#xff0c;有一日村里兩個女孩去上學&#xff0c;看到我就說一起去上學吧。當時一想&#xff0c;玩泥巴也厭煩了&#…

html中通過點擊button標簽實現頁面跳轉的三種方法

方法1&#xff1a;使用onclick事件 <input type"button" value"按鈕"onclick"javascrtpt:window.location.hrefhttp://www.baidu.com/" />或者直接使用button標簽 <button onclick"window.location.href https://www.baidu.com…

mybatis調用存儲過程

直接貼代碼吧 注解式可以調用 但是不能返回結果 所有我就貼配置式的 有知道注解怎么返回結果的請評論 數據庫代碼 #表 DROP TABLE IF EXISTS p_user; CREATE TABLE p_user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(10) DEFAULT NULL,sex char(2) DEFAULT NULL,PRIMAR…

java dump分析工具_Java 性能分析工具 (2):Java 內置監控工具

引言本文為 Java 性能分析工具系列文章第二篇&#xff0c;第一篇&#xff1a;操作系統工具。在本文中將介紹如何使用 Java 內置監控工具更加深入的了解 Java 應用程序和 JVM 本身。在 JDK 中有許多內置的工具&#xff0c;其中包括&#xff1a;jcmd&#xff1a;打印一個 Java 進…