九色91_成人精品一区二区三区中文字幕_国产精品久久久久一区二区三区_欧美精品久久_国产精品99久久久久久久vr_www.国产视频

Hello! 歡迎來到小浪云!


【Linux】從硬件到軟件了解進(jìn)程


一、馮諾依曼體系結(jié)構(gòu)

我們常見的計(jì)算機(jī)結(jié)構(gòu),包括哈佛結(jié)構(gòu)和馮諾依曼體系結(jié)構(gòu),我們?nèi)粘J褂玫挠?jì)算機(jī)就是基于馮諾依曼體系結(jié)構(gòu)的。下圖展示了這種體系的直觀圖。

【Linux】從硬件到軟件了解進(jìn)程 在這里的存儲(chǔ)器指的是內(nèi)存,如果不考慮緩存的情況,CPU只能對(duì)內(nèi)存進(jìn)行讀寫,不能直接訪問輸入輸出設(shè)備。輸入輸出設(shè)備要輸入或輸出數(shù)據(jù),必須先寫入內(nèi)存或從內(nèi)存中讀取。也就是說,盡管CPU是中央處理器,但在馮諾依曼結(jié)構(gòu)中,內(nèi)存才是核心部件,所有數(shù)據(jù)必須先經(jīng)過內(nèi)存,然后再流向其他地方。

馮諾依曼體系結(jié)構(gòu)是計(jì)算機(jī)普及的重大突破。我們知道計(jì)算機(jī)的存儲(chǔ)速度如下圖所示,寄存器是最快的存儲(chǔ)設(shè)備,也是最昂貴的,而機(jī)械硬盤(HDD)是最慢的存儲(chǔ)設(shè)備,也是最便宜的。如果沒有馮諾依曼結(jié)構(gòu),我們的計(jì)算機(jī)要么便宜但速度慢,要么昂貴但速度快。馮諾依曼結(jié)構(gòu)的原理是在CPU進(jìn)行計(jì)算時(shí),內(nèi)存已經(jīng)接收并存儲(chǔ)了外部輸入設(shè)備輸入的數(shù)據(jù)。CPU計(jì)算完成后,將結(jié)果取出并發(fā)送到輸出設(shè)備,然后將新的輸入數(shù)據(jù)傳遞給CPU進(jìn)行計(jì)算。這樣,低速的輸入輸出設(shè)備、中速的內(nèi)存和高速的CPU有機(jī)結(jié)合,形成了現(xiàn)代計(jì)算機(jī)的雛形。

【Linux】從硬件到軟件了解進(jìn)程二、操作系統(tǒng)任何計(jì)算機(jī)系統(tǒng)都包含一個(gè)基本的程序集合,這個(gè)集合被稱為操作系統(tǒng)。我們前面提到過,操作系統(tǒng)操作系統(tǒng)內(nèi)核和命令行解釋器(shell)組成。設(shè)計(jì)操作系統(tǒng)的目的是更好地與硬件交互、管理軟件資源,并為應(yīng)用程序提供一個(gè)良好的執(zhí)行環(huán)境。

【Linux】從硬件到軟件了解進(jìn)程 如上圖所示,我們可以清楚地看到用戶和系統(tǒng)軟件之間的交互。我們不能直接調(diào)用操作系統(tǒng),操作系統(tǒng)就像一只小蝸牛,它縮在殼里通過觸角與你交流。除了觸角,你無法觸及蝸牛的身體。這里的觸角就是系統(tǒng)調(diào)用接口。操作系統(tǒng)也有殼,除了通過系統(tǒng)調(diào)用接口,其他方式都無法間接使用操作系統(tǒng)。由于系統(tǒng)調(diào)用在使用上比較基礎(chǔ),對(duì)用戶的要求較高,因此開發(fā)者對(duì)部分系統(tǒng)調(diào)用進(jìn)行了適度封裝,形成了庫。有了這些庫,程序員就可以更好地開發(fā)軟件,然后這些軟件再被普通用戶使用。

對(duì)于硬件部分和系統(tǒng)軟件部分的交互,我們前面提到過,操作系統(tǒng)負(fù)責(zé)管理。對(duì)于程序員來說,管理可以通過計(jì)算機(jī)語言中的數(shù)據(jù)結(jié)構(gòu)來表示。大家不妨想想,我們?cè)谌粘I钪杏龅降墓芾韱栴},是不是都可以轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)的方式來解決?我是一個(gè)學(xué)生,我舉一個(gè)關(guān)于學(xué)生管理的例子:一個(gè)學(xué)校有十個(gè)學(xué)院,每個(gè)學(xué)院有一位院長和一百位學(xué)生,假設(shè)我們的學(xué)校就這么簡(jiǎn)單,沒有其他類似輔導(dǎo)員這樣的職位。校長不直接管理學(xué)生,而是通過院長來管理。院長需要親力親為,親自管理這些學(xué)生。學(xué)生的屬性各不相同,但學(xué)生屬性的類型是相同的,他們都有名字、性別、年齡、家庭住址。我們可以將學(xué)生這個(gè)群體定義為一個(gè)struct結(jié)構(gòu)體,然后不同的學(xué)生填寫不同的數(shù)值,再按照學(xué)號(hào)前后以單鏈表的方式連接起來,這樣就把每個(gè)學(xué)院的學(xué)生連接起來了。對(duì)學(xué)生的管理就是對(duì)鏈表的增刪查改。校長想要管理某個(gè)學(xué)生時(shí),可以通過院長執(zhí)行。這里的校長就是操作系統(tǒng),院長就是驅(qū)動(dòng)程序,而學(xué)生就是硬件資源。一個(gè)事件可以拆分為決策和執(zhí)行,操作系統(tǒng)負(fù)責(zé)決策,驅(qū)動(dòng)程序負(fù)責(zé)執(zhí)行。我們剛才的例子對(duì)于學(xué)生也就是硬件資源,就是一個(gè)先描述再組織的過程,先將個(gè)體描述出來,再將個(gè)體組織起來。

三、操作系統(tǒng)進(jìn)程管理1、概念進(jìn)程是正在執(zhí)行的程序的實(shí)例,是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位。它包含了程序計(jì)數(shù)器、寄存器、內(nèi)存空間、打開的文件描述符等運(yùn)行上下文信息,這些信息共同構(gòu)成了進(jìn)程執(zhí)行的環(huán)境。

進(jìn)程是正在執(zhí)行的程序的實(shí)例,程序本身只是存儲(chǔ)在磁盤等介質(zhì)上的一組指令和數(shù)據(jù)的集合,是靜態(tài)的。只有當(dāng)程序被加載到內(nèi)存中,并由操作系統(tǒng)為其分配資源、創(chuàng)建相應(yīng)的數(shù)據(jù)結(jié)構(gòu)來管理其執(zhí)行時(shí),它才成為一個(gè)進(jìn)程,即變成了一個(gè)動(dòng)態(tài)的執(zhí)行實(shí)體。

進(jìn)程是操作系統(tǒng)進(jìn)行資源分配的基本單位,操作系統(tǒng)需要為每個(gè)進(jìn)程分配獨(dú)立的資源,包括但不限于內(nèi)存空間、CPU時(shí)間、文件描述符、網(wǎng)絡(luò)端口等。每個(gè)進(jìn)程都有自己獨(dú)立的地址空間,進(jìn)程在自己的地址空間內(nèi)可以自由地訪問和操作數(shù)據(jù),而不會(huì)干擾其他進(jìn)程的地址空間。

進(jìn)程包含了程序執(zhí)行時(shí)的運(yùn)行上下文信息,運(yùn)行上下文是指進(jìn)程在執(zhí)行過程中所涉及的各種狀態(tài)和數(shù)據(jù),主要包括程序計(jì)數(shù)器、寄存器狀態(tài)、信息、內(nèi)存管理信息等。程序計(jì)數(shù)器指示了進(jìn)程下一條要執(zhí)行的指令地址,寄存器用于臨時(shí)存儲(chǔ)數(shù)據(jù)和指令操作數(shù)等,用于保存函數(shù)調(diào)用的相關(guān)信息和局部變量等。這些運(yùn)行上下文信息完整地描述了進(jìn)程當(dāng)前的執(zhí)行狀態(tài)。當(dāng)進(jìn)程被調(diào)度暫?;蚧謴?fù)執(zhí)行時(shí),操作系統(tǒng)需要保存和恢復(fù)這些上下文信息,以確保進(jìn)程能夠正確地繼續(xù)執(zhí)行。

進(jìn)程是構(gòu)成操作系統(tǒng)中并發(fā)執(zhí)行環(huán)境的基本單元,操作系統(tǒng)通過管理和調(diào)度多個(gè)進(jìn)程,實(shí)現(xiàn)了多個(gè)任務(wù)的并發(fā)執(zhí)行,從而提高了系統(tǒng)資源的利用率和系統(tǒng)的整體性能。多個(gè)進(jìn)程之間可以通過各種進(jìn)程間通信機(jī)制進(jìn)行數(shù)據(jù)交換和協(xié)作,共同完成復(fù)雜的系統(tǒng)任務(wù)。

下圖是我們?cè)?a href="http://www.albr2v3.cn/help/index.php/tag/24">Windows中的進(jìn)程。

【Linux】從硬件到軟件了解進(jìn)程 進(jìn)程粗略來講就是內(nèi)核PCB數(shù)據(jù)結(jié)構(gòu)對(duì)象加上你自己的代碼和數(shù)據(jù)。記住上面所說的先描述后組織,通過結(jié)構(gòu)體描述進(jìn)程的屬性,然后通過鏈表組織多個(gè)進(jìn)程。

2、PCB和task_struct進(jìn)程的所有信息被存放在一個(gè)叫做進(jìn)程控制塊的數(shù)據(jù)結(jié)構(gòu)中,它是進(jìn)程屬性的集合,被稱為PCB。

Linux操作系統(tǒng)下的PCB就是task_Struct,它是一個(gè)結(jié)構(gòu)體,被裝載到RAM里。

以下是task_struct的內(nèi)容分類,除了這些,還有一些其他信息。

內(nèi)容 意義

標(biāo)示符

每個(gè)進(jìn)程的標(biāo)識(shí)符不同

狀態(tài)

任務(wù)狀態(tài)

優(yōu)先級(jí)

相對(duì)于其他進(jìn)程的優(yōu)先級(jí)

程序計(jì)數(shù)器

程序中即將被執(zhí)行的下一條指令的地址

內(nèi)存指針

包括程序代碼和進(jìn)程相關(guān)數(shù)據(jù)的指針,還有和其他進(jìn)程共享的內(nèi)存塊的指針

上下文數(shù)據(jù)

進(jìn)程執(zhí)行時(shí)處理器的寄存器中的數(shù)據(jù)

IO狀態(tài)

顯示的IO請(qǐng)求,分配給進(jìn)程的IO設(shè)備和被進(jìn)程使用的文件列表

記賬信息

處理器時(shí)間總和或使用的時(shí)鐘數(shù)總和或時(shí)間限制、記賬號(hào)等

所有運(yùn)行在系統(tǒng)里的進(jìn)程都以task_struct(雙向)鏈表的形式存在內(nèi)核里。

3、查看進(jìn)程寫一個(gè)死循環(huán)的程序,方便我們查看進(jìn)程。

【Linux】從硬件到軟件了解進(jìn)程【Linux】從硬件到軟件了解進(jìn)程ps aux 會(huì)列出系統(tǒng)中所有用戶的所有進(jìn)程的詳細(xì)信息,grep process 會(huì)在 ps aux 輸出的所有行中查找包含 process 的行,并將這些行輸出。grep 是要排除的模式,由于在執(zhí)行 grep process 時(shí),這個(gè) grep 命令本身也會(huì)作為一個(gè)進(jìn)程被 ps aux 列出,并且會(huì)匹配 process,為了避免將 grep process 這個(gè)進(jìn)程本身顯示出來,我們使用 grep -v grep 來過濾掉包含 grep 的行。

在程序執(zhí)行過程中會(huì)生成一個(gè)進(jìn)程,我們通過查看進(jìn)程指令,其中第二列就是進(jìn)程唯一標(biāo)識(shí)PID,第一列是父進(jìn)程唯一標(biāo)識(shí)PPID,該進(jìn)程沒有父進(jìn)程,所以第一列不顯示。

【Linux】從硬件到軟件了解進(jìn)程進(jìn)程重啟對(duì)應(yīng)的PID會(huì)發(fā)生變化,是由于內(nèi)存重新給它分配的原因。

【Linux】從硬件到軟件了解進(jìn)程這里解答一下為什么我們?cè)谶M(jìn)行./process的時(shí)候會(huì)啟動(dòng)可執(zhí)行文件process:在進(jìn)程中有一個(gè)目錄叫做cwd,意味著當(dāng)前的工作目錄,你可以把它想象為一個(gè)指針(其實(shí)它是一個(gè)軟鏈接),指向這個(gè)文件所在的目錄,所以一個(gè)進(jìn)程在屬性中就有一個(gè)是當(dāng)前的工作目錄。亦可以看到exe這里指向的是這里的我們正在執(zhí)行的可執(zhí)行程序process。

【Linux】從硬件到軟件了解進(jìn)程4、通過系統(tǒng)調(diào)用fork創(chuàng)建進(jìn)程(1)簡(jiǎn)述上面的進(jìn)程是在執(zhí)行可執(zhí)行程序的時(shí)候程序自動(dòng)構(gòu)建的進(jìn)程,這節(jié)我們要通過系統(tǒng)調(diào)用fork創(chuàng)建進(jìn)程。

寫一個(gè)fork創(chuàng)建進(jìn)程的程序如下test.c,在我們現(xiàn)有的知識(shí)體系里,在fork函數(shù)自身不出現(xiàn)問題的情況下給到的id值是大于等于0的值,屬于雙分支結(jié)構(gòu),即id值要不然就等于0要不然就大于0,不會(huì)出現(xiàn)即等于0又大于0的情況,本身兩種情況同時(shí)出現(xiàn)就是錯(cuò)誤的。

【Linux】從硬件到軟件了解進(jìn)程【Linux】從硬件到軟件了解進(jìn)程【Linux】從硬件到軟件了解進(jìn)程 看到結(jié)果,兩個(gè)分支的程序都會(huì)執(zhí)行,就是因?yàn)閒ork這里的原因,生成了子進(jìn)程,改變了我們對(duì)該程序固有的看法,現(xiàn)在我們來研究fork是如何做到的。

(2)系統(tǒng)調(diào)用生成子進(jìn)程的過程〇提出問題該過程我們可以簡(jiǎn)化為一個(gè)問題:為什么id在等于0的同時(shí)又大于0? id值是從fork函數(shù)來的,那么進(jìn)一步提出問題:fork為什么能產(chǎn)生兩個(gè)返回值? id為什么能承載兩個(gè)返回值?

最終我們將目光移動(dòng)到fork函數(shù)身上。

①fork函數(shù)fork系統(tǒng)調(diào)用用于從一個(gè)現(xiàn)有的進(jìn)程創(chuàng)建一個(gè)新的進(jìn)程,新創(chuàng)建的進(jìn)程被稱為子進(jìn)程,而原來的進(jìn)程被稱為父進(jìn)程。子進(jìn)程是父進(jìn)程的一個(gè)副本,它幾乎繼承了父進(jìn)程的所有資源,包括代碼段、數(shù)據(jù)段、等,但擁有自己獨(dú)立的進(jìn)程控制塊(PCB)和進(jìn)程 ID(PID)。

在父進(jìn)程中,fork返回子進(jìn)程的 PID,因?yàn)楦高M(jìn)程可能需要對(duì)多個(gè)子進(jìn)程進(jìn)行管理和控制,所以通過返回的 PID 來標(biāo)識(shí)每個(gè)子進(jìn)程。在子進(jìn)程中,fork返回 0,這是因?yàn)樽舆M(jìn)程不需要知道父進(jìn)程的 PID 來進(jìn)行后續(xù)操作,它可以通過getppid函數(shù)來獲取父進(jìn)程的 PID。如果fork調(diào)用失敗,將返回 – 1,并設(shè)置errno變量來表示錯(cuò)誤原因。

②父子進(jìn)程關(guān)系進(jìn)程可以粗略表示為代碼+數(shù)據(jù)。當(dāng)父進(jìn)程調(diào)用fork時(shí),內(nèi)核會(huì)為子進(jìn)程分配新的 PCB,并復(fù)制父進(jìn)程的大部分資源到子進(jìn)程中,這包括進(jìn)程的代碼部分。雖然子進(jìn)程最初復(fù)制了父進(jìn)程的地址空間,但在實(shí)際運(yùn)行中,父子進(jìn)程的地址空間是相互獨(dú)立的。如果其中一個(gè)進(jìn)程修改了某些數(shù)據(jù),不會(huì)影響到另一個(gè)進(jìn)程中的相應(yīng)區(qū)域,這是通過寫時(shí)復(fù)制技術(shù)來實(shí)現(xiàn)的,即只有當(dāng)進(jìn)程試圖修改某個(gè)數(shù)據(jù)時(shí),才會(huì)真正復(fù)制該數(shù)據(jù),以節(jié)省內(nèi)存資源,就是說在不修改某些數(shù)據(jù)的情況下它們指向的是同一塊位置,如果子進(jìn)程或者父進(jìn)程某些數(shù)據(jù)要修改,它們會(huì)重新開辟一塊空間存放該進(jìn)程的特有數(shù)據(jù)。fork調(diào)用完成后,父進(jìn)程和子進(jìn)程就開始并發(fā)執(zhí)行,它們可以各自獨(dú)立地執(zhí)行不同的代碼路徑,也可以通過各種進(jìn)程間通信機(jī)制進(jìn)行通信和同步,這里就是從fork函數(shù)出現(xiàn)之后的代碼我們可以把它當(dāng)做兩份,兩份代碼同時(shí)跑,但是id不同,后面執(zhí)行的效果可能就不同。

并且我們可以發(fā)現(xiàn)上面的截圖父子進(jìn)程誰先運(yùn)行是不確定的,這個(gè)是由調(diào)度器決定的。

③解答問題問:id為什么能承載兩個(gè)返回值?答:id變量并不是同時(shí)承載兩個(gè)返回值,而是在不同的執(zhí)行流(父進(jìn)程和子進(jìn)程)中被賦予不同的值,fork函數(shù)通過這種方式讓父進(jìn)程和子進(jìn)程能夠區(qū)分彼此,并根據(jù)返回值執(zhí)行不同的操作。

問:fork為什么能產(chǎn)生兩個(gè)返回值?答:父子進(jìn)程并發(fā)執(zhí)行,每個(gè)執(zhí)行流從fork函數(shù)的返回處繼續(xù)執(zhí)行,并且根據(jù)自身的角色(父進(jìn)程或子進(jìn)程)返回不同的值,這樣就實(shí)現(xiàn)了一個(gè)函數(shù)調(diào)用在兩個(gè)進(jìn)程中產(chǎn)生不同返回結(jié)果的效果。

相關(guān)閱讀

主站蜘蛛池模板: 久草在线 | 免费高清av | 国产精品久久国产精品 | 久久久久久国产精品久久 | 亚洲视频在线观看 | 成人欧美一区二区三区在线播放 | 色频| 精品美女视频在免费观看 | 成人a免费 | 中文在线a在线 | 成人av在线网站 | 在线观看国产wwwa级羞羞视频 | 精品一区二区三区在线观看国产 | 人人精品| xx性欧美肥妇精品久久久久久 | 国产精品呻吟久久av凹凸 | 欧美成人一级 | 综合二区 | 国产视频久久久久 | 久久成人免费 | 综合网伊人| 国产成人小视频 | 欧美日韩免费一区二区三区 | 成人国产在线视频 | 女同久久另类99精品国产 | 日本一区二区三区在线观看 | av免费网站在线 | 国产成人精品免费视频大全最热 | 国产精品一区二区精品 | h小视频| 91最新入口 | av入口 | 日韩欧美在线一区 | 在线看一区二区 | 成人免费观看视频 | 国产精品一区在线播放 | 日韩精品影院 | 五月激情六月婷婷 | 日韩中文电影 | av网站免费观看 | 久久久久久电影 |