馮諾依曼體系和操作系統(tǒng)和進(jìn)程初識
馮諾依曼體系
我們常見的計算機(jī),如筆記本。我們不常見的計算機(jī),如服務(wù)器,大部分都遵守馮諾依曼體系。
輸入設(shè)備:就是鍵盤,鼠標(biāo),掃描儀,攝像頭…
輸出深:顯示器,打印機(jī),音響…
中央處理器(CPU):內(nèi)含運(yùn)算器和控制器!
存儲器:這里指的是內(nèi)存!
內(nèi)存具有掉電易失的特性,就是斷點(diǎn)后就會失去數(shù)據(jù)!
內(nèi)存想對的是具有永久性存儲能力的設(shè)備那就叫外存!一般我們普遍認(rèn)識的就是磁盤!
對于存儲器我們可能會認(rèn)為是外存 + 內(nèi)存!但是存儲器這個概念在這里是指內(nèi)存!
外存——外部存儲器既是輸入設(shè)備也是輸出設(shè)備!磁盤是外部設(shè)備的一種!**磁盤不屬于存儲器!**磁盤和網(wǎng)卡都是典型的即使輸入也是輸出!
下面我們將對 存儲器和CPU這兩個部分的功能進(jìn)行詳細(xì)的解釋!
>> 在整個馮諾依曼體系中個部分的速度也是有快有慢!
可以看出來相比CPU和寄存器,外設(shè)的速度其實(shí)是很慢的!
CPU比外設(shè)的速度快了幾百萬倍!
接下來我們來簡單的看一下cpu功能和內(nèi)部
就像是我們在讀書前還得學(xué)會識字,cpu也是一樣執(zhí)行代碼前也必須先認(rèn)識代碼!我們學(xué)習(xí)的識字的過程中,也相當(dāng)于在大腦里面寫入指令集!我們是通過這些指令集來讀書的!
cpu的數(shù)據(jù)來源!
可以將內(nèi)存看成是CPU和磁盤之間的一個巨大的緩存,用來適配CPU和磁盤之間巨大的速度差!
所以這樣子其實(shí)就變成了CPU在讀取數(shù)據(jù)和寫入數(shù)據(jù)只和內(nèi)存(存儲器)進(jìn)行數(shù)據(jù)交流!!而不會直接和外設(shè)進(jìn)行數(shù)據(jù)交流!——這樣子可以更好的提高整機(jī)的效率!
計算機(jī)本質(zhì)是一個硬件和軟件的完美結(jié)合!
總結(jié)
- CPU不和外設(shè)直接進(jìn)行數(shù)據(jù)交流!只和內(nèi)存進(jìn)行數(shù)據(jù)交流!
- 所有的外設(shè),有數(shù)據(jù)要進(jìn)行載入,只能載入到內(nèi)存中!內(nèi)存寫出,也一定是寫到外設(shè)中去!
有了以上的結(jié)論我們就可以對平常的一些現(xiàn)象進(jìn)行解釋了!
我們都知道程序運(yùn)行必須加載到內(nèi)存!那為什么一定要加載到內(nèi)存中呢?——因?yàn)镃PU運(yùn)行程序需要代碼!但是CPU不能直接的去讀取磁盤中的數(shù)據(jù)!CPU只會從內(nèi)存中拿數(shù)據(jù)!所以我們運(yùn)行的時候就一定要把數(shù)據(jù)加載到內(nèi)存中!
我們接下來看一下數(shù)據(jù)是如何通過馮諾依曼體系來在兩個設(shè)備之間進(jìn)行傳輸?shù)模?/p>
我與我的朋友在qq上進(jìn)行聊天,我發(fā)了一句“你好!”,請問這一句”你好!“在電腦中是如何流動的?。浚ㄟ@里我們不考慮網(wǎng)絡(luò)的傳輸,只考慮在馮諾依曼體系中的數(shù)據(jù)流通?。?/strong>
操作系統(tǒng)
操作系統(tǒng)是一個軟硬件資源管理的軟件!
為什么要有操作系統(tǒng)?
這就是為什么要存在操作系統(tǒng)!操作系統(tǒng)的存在可以為我們管理好軟硬件資源!為我們(上層用戶)提供一個良好的執(zhí)行環(huán)境!
什么叫管理?
操作系統(tǒng)是如何對資源進(jìn)行管理的?這是一個看上去很抽象的概念!
我們可以舉一個例子來幫助理解這個抽象的概念!
當(dāng)我們在上學(xué)的時候,我們也是受到管理的一方!而學(xué)校最后都是由校長來進(jìn)行管理的!所以其實(shí)我們也是受到校長的管理的!可是其實(shí)我們其實(shí)很少或者說根本沒有跟校長直接的進(jìn)行接觸!校長也不會真的來我們身邊詳細(xì)的詢問我們的成績,指導(dǎo)我們的學(xué)習(xí),跟我們說我們該怎么做!
所以其實(shí)管理者根本不需要和被管理者直接的進(jìn)行交互!也是可以管理被管理者的!
我們也要明白和我們直接進(jìn)行交互的人不一定是我們的管理者!像是我們上學(xué)時候的班長!班長是我們的管理者嗎?不是!班長是監(jiān)管我們的人!但是班長不是管理我們的人!班長負(fù)責(zé)將管理的信息向下進(jìn)行傳遞!
管理者必須具備對重大的事宜具有決策權(quán)!
所以老師也不是一個管理者!因?yàn)槔蠋煵痪邆渲卮笫虑榈臎Q策權(quán)!老師不能隨意的想要將我們開除學(xué)籍,更換班級!老師和班長都是做執(zhí)行的人!
那么校長是如何做出決策的?
那校長是如何對我們進(jìn)行做出決策進(jìn)行管理的?——答案是數(shù)據(jù)!**校長根據(jù)我們的數(shù)據(jù)來管理我們!**我們的數(shù)據(jù)上有我們的學(xué)習(xí)成績,有我們的個人信息,有我們的實(shí)踐經(jīng)歷,獲獎經(jīng)歷…有我們的各種信息!像是我們遲到,我們早退,我們作弊這些都會化作數(shù)據(jù)記錄起來!這樣子校長就可以通過這些數(shù)據(jù)來進(jìn)行管理!進(jìn)行給學(xué)生頒獎!通報學(xué)生!勸退學(xué)生…各種操作!
所以雖然我們不會直接和校長打交道!但是我們的數(shù)據(jù)早就被校方拿走了!而且一直在更新!
所以管理的本質(zhì)就是對數(shù)據(jù)進(jìn)行管理!
數(shù)據(jù)哪里來?
如果校長要對數(shù)據(jù)進(jìn)行管理!那么么數(shù)據(jù)是哪里來的?管理者不會與被管理者直接的進(jìn)行接觸!**所以必須存在第三者用來獲取數(shù)據(jù)!那就是執(zhí)行者!**從老師哪里來的!所以和我們直接進(jìn)行交互的老師其目的不是為了管理我們而是為了從身上獲得必要的數(shù)據(jù)!且及時的對數(shù)據(jù)進(jìn)行更新!初次之外執(zhí)行者還有執(zhí)行管理者下達(dá)命令的職能
這樣子流程就變成了 老師收集學(xué)生的數(shù)據(jù)——學(xué)習(xí)成績,課堂表現(xiàn)… 然后老師將數(shù)據(jù)給校長,校長做決策來決定給學(xué)生的待遇!——發(fā)獎學(xué)金,處分…然后老師在根據(jù)下達(dá)的命令來執(zhí)行相應(yīng)的行為!
例如校長看到一班的成績不錯,但是出勤率很差!于是告訴老師要提高出勤率!于是老師根據(jù)這個決策來開始天天到班級點(diǎn)名!提高學(xué)生的出勤率!
接下里我們將上面所說的角色和操作系統(tǒng)進(jìn)行一一的對應(yīng)!
我們可以認(rèn)為操作系統(tǒng)就是校長是管理者!硬件就是學(xué)生是被管理者!那么他們中間一定存在一個執(zhí)行者!那就是驅(qū)動層!每一個硬件都存在驅(qū)動!操作系統(tǒng)就是通過管理驅(qū)動來管理硬件的!也是通過驅(qū)動來控制硬件的!
但是這還衍生出來一個問題!學(xué)生少的時候還好!一旦學(xué)生多了數(shù)據(jù)量大了!我們應(yīng)該 怎么處理?數(shù)據(jù)量一旦大起來!數(shù)據(jù)的管理也是一種巨大的負(fù)擔(dān)!
所以如何更好的去管理數(shù)據(jù)呢?校長總不能天天盯著這些excel的數(shù)據(jù)天天吧?恰好校長是一名程序員!校長發(fā)現(xiàn)學(xué)生信息雖然很多!但是種類都是一樣的!可以按種類進(jìn)行管理,所以校長就通過對學(xué)生的信息進(jìn)行抽象和提煉最后定義了一個結(jié)構(gòu)體!用來專門管理這些信息!
**最后對于學(xué)生的管理便轉(zhuǎn)化成了對這一個個的變量進(jìn)行管理!**但是萬一數(shù)據(jù)量還是太多了!變量管理起來也不方便!要找也很麻煩!校長作為一個優(yōu)秀的程序員于是他在結(jié)構(gòu)體里面又加了一個指針!
==這樣子對于學(xué)生信息的管理就變成了對于鏈表的管理和維護(hù)!==對于學(xué)生的管理就變成了對于鏈表的增刪查改!
有新的學(xué)生!那就添加一個節(jié)點(diǎn)!學(xué)生被退學(xué)了那就是刪除一個節(jié)點(diǎn)!學(xué)生的信息更新了那就對學(xué)生對應(yīng)的節(jié)點(diǎn)進(jìn)行修改!校長想要找到成績最好的學(xué)生!也只要設(shè)計一個遍歷的算法對整個鏈表進(jìn)行遍歷就可以找到了!
這就是對被管理的對象進(jìn)行建模的過程!
管理的兩個重要的階段 ——先描述,在組織!
描述就是將要管理的對象進(jìn)行抽象變成一個結(jié)構(gòu)體!
組織就是根據(jù)結(jié)構(gòu)體設(shè)計出來一個特定的數(shù)據(jù)結(jié)構(gòu)!
這樣就將對對象的管理轉(zhuǎn)換為了對某種結(jié)構(gòu)的管理!
==這也是我們操作系統(tǒng)的管理思想!==所有管理的本質(zhì)邏輯也都是:先描述,在組織!
這也是所有軟件的設(shè)計思路!
像是我們寫一個通訊錄!
我們首先就要先構(gòu)建對應(yīng)的結(jié)構(gòu)體!——struct person——描述
然后以鏈表或者數(shù)組的形式進(jìn)行增刪查改!——組織
所以我們就可以進(jìn)一步的去了解操作系統(tǒng)究竟是如何的去管理硬件的了!
其實(shí)也是通過描述后組織的方式來管理硬件的!
操作系統(tǒng)就是通過這個鏈表來管理硬件的!當(dāng)操作系統(tǒng)遍歷鏈表的時候發(fā)現(xiàn)有個設(shè)備的status是error 那么就將其從鏈表移除!
對于軟件做管理!
操作系統(tǒng)對于硬件做管理是先描述再組織!那么對于軟件呢?自然也是一樣的!軟件不僅能管理硬件也管理軟件!——這也是很好理解的,人不僅可以管理物品,人也能管理人!是一樣的!所以接下來我們再舉個例子用來說明這一點(diǎn)!也用這個例子來進(jìn)一步的完善整個計算機(jī)體系!
下面這是一個銀行!
’
從上面的例子我們可以顯然的看出來!這個銀行的內(nèi)部結(jié)構(gòu)和操作系統(tǒng)也具有相似性!而銀行還具有承接用戶存錢的業(yè)務(wù)!
那么問題來了!在傳統(tǒng)的銀行中是否允許用戶直接的操作銀行的電腦!直接自己存錢?——答案是否定的!一般我們都是將錢給業(yè)務(wù)人物讓他們來替我們存錢!而柜臺的前面往往還有很厚的玻璃那么為什么要怎么做?——答案自然是這樣子能保護(hù)銀行!
**銀行系統(tǒng)不相信任何人!而且自己很容易受到傷害!銀行必須保護(hù)自己!**但是銀行也承擔(dān)著為客戶服務(wù)的責(zé)任! ——所以銀行既要保護(hù)自己,又要對外提供服務(wù)!
而操作系統(tǒng)也是一樣!操作系統(tǒng)相信任何人和任何程序!但是也必須給上層的用戶提供各種服務(wù)!
**為了保護(hù)操作系統(tǒng)不允許任意用戶對操作系統(tǒng)內(nèi)做任意的修改!所以操作系統(tǒng)不允許用戶直接訪問操作系統(tǒng)里面的各種程序!但是又必須提供服務(wù),所以操作系統(tǒng)提供了一個接口!(就像銀行不允許用戶直接往倉庫存錢一樣!操作系統(tǒng)也不允許用戶直接往磁盤寫入數(shù)據(jù)?。?**
**操作系統(tǒng)接口既可以用來滿足用戶的請求,又可以拒絕用戶的非法請求!**這樣子就可以最大程度的保護(hù)操作系統(tǒng)!
**系統(tǒng)調(diào)用接口是由操作系統(tǒng)來提供的!**在linux下因?yàn)閘inux都是有c語言寫成的!所以linux的系統(tǒng)調(diào)用接口其實(shí)都是c式的接口!
系統(tǒng)調(diào)用接口是很重要的接口!從編程的角度上來看實(shí)際上我們本質(zhì)都是在調(diào)用系統(tǒng)接口!
所以我們以后對于操作系統(tǒng)的任意訪問都必須通過系統(tǒng)調(diào)用接口來進(jìn)行訪問!
隨著銀行的發(fā)展,銀行來的各種各樣的人越來越多!有的人還不識字!來了柜臺還沒法辦事!那么怎么呢?答案是銀行也有了一個大廳經(jīng)理!專門來幫組人來辦事!就是說來銀行的人甚至都不用去柜臺了**!只要把需求告訴大廳經(jīng)理!大廳經(jīng)理就拿著你的材料和帶著你的需求幫你去柜臺辦事!**
用系統(tǒng)調(diào)用接口要求我們用戶對于操作系統(tǒng)要有一定的了解!但是這樣也太麻煩了!所以在操作系統(tǒng)之上還多了一個軟件層!用來解決這個問題!
例如shell/各種各樣的庫…這些都是軟件層甚至界面也是屬于軟件層!我們只需要輸入各種的指令!軟件層就會根據(jù)這些指令去調(diào)用各種各樣的系統(tǒng)接口!
當(dāng)我們開始編程的第一行代碼就是“hello world” ,這個代碼的執(zhí)行就是調(diào)用c標(biāo)準(zhǔn)庫里面的函數(shù)接口!然后c標(biāo)準(zhǔn)庫再去調(diào)用系統(tǒng)接口!最后由操作系統(tǒng)來完成輸出到顯示器上的!
上面的所有結(jié)合起來就是計算機(jī)的軟硬件體系結(jié)構(gòu)!就是下面的這張圖!
總結(jié)
- 管理的本質(zhì):對于數(shù)據(jù)做管理!
- 管理的方法:先描述,再組織!
- 我們對于系統(tǒng)的任意訪問都必須經(jīng)過系統(tǒng)接口!
- 我們的指令和編程的本質(zhì)也是調(diào)用系統(tǒng)接口!
進(jìn)程初識
基本概念
- 課本概念:程序的一個執(zhí)行實(shí)例,正在執(zhí)行的程序等
什么叫做運(yùn)行起來呢?——答案是加載到內(nèi)存中
但是其實(shí)很多人看到這個定義其實(shí)很難理解這到底是什么意思!為什么程序加載道內(nèi)存里面就變成了進(jìn)程?把程序換個位置就變成了進(jìn)程?
或許有人看聽過另一句話進(jìn)程和程序相比就有動態(tài)的屬性!
那這句話就又要么理解呢?
我們用c/c++/java…各種語言編寫出來的程序本質(zhì)上是什么呢?
程序的本質(zhì)——就是文件!而文件放在磁盤上!
然后呢如果我們要執(zhí)行這個軟件根據(jù)馮諾依曼體系我們可以知道文件要放在內(nèi)存中!
然后CPU就去內(nèi)存中直接拿到這個文件然后執(zhí)行文件里面的代碼嗎?不是的!
因?yàn)椴恢挂粋€程序在內(nèi)存中跑!一般我們內(nèi)存中至少有幾十個程序在執(zhí)行!這就衍生出了很多的問題!每一個程序內(nèi)存該分配多少?在哪里分配內(nèi)存?程序的代碼執(zhí)行到了哪里?有沒有被調(diào)度過?CPU應(yīng)該先執(zhí)行哪一個程序,后執(zhí)行哪一個程序?程序執(zhí)行完畢了又該怎么辦?…
這些問題的本質(zhì)就是操作系統(tǒng)該如何去管理這些加載進(jìn)內(nèi)存的程序呢?因?yàn)椴僮飨到y(tǒng)本身就是用來管理軟硬件資源的軟件!所以進(jìn)程的問題本質(zhì)也屬于操作系統(tǒng)的管理問題!
那操作系統(tǒng)肯定要對這些加載進(jìn)內(nèi)存的程序進(jìn)行管理!我們上面說了管理的本質(zhì)是對數(shù)據(jù)進(jìn)行管理!管理的兩個步驟就是先描述后組織!——描述就是用結(jié)構(gòu)體進(jìn)行描述,組織就是用數(shù)據(jù)結(jié)構(gòu)進(jìn)行組織!
所以操作系統(tǒng)為了對進(jìn)程進(jìn)行描述!就有了一個叫PCB的概念!
task_struct內(nèi)容
- 標(biāo)示符: 描述本進(jìn)程的唯一標(biāo)示符,用來區(qū)別其他進(jìn)程。
- 狀態(tài): 任務(wù)狀態(tài),退出代碼,退出信號等。
- 優(yōu)先級: 相對于其他進(jìn)程的優(yōu)先級。
- 程序計數(shù)器: 程序中即將被執(zhí)行的下一條指令的地址。
- 內(nèi)存指針: 包括程序代碼和進(jìn)程相關(guān)數(shù)據(jù)的指針,還有和其他進(jìn)程共享的內(nèi)存塊的指針
- 上下文數(shù)據(jù): 進(jìn)程執(zhí)行時處理器的寄存器中的數(shù)據(jù)[休學(xué)例子,要加圖CPU,寄存器]。
- I/O狀態(tài)信息: 包括顯示的I/O請求,分配給進(jìn)程的I/O設(shè)備和被進(jìn)程使用的文件列表。
- 記賬信息: 可能包括處理器時間總和,使用的時鐘數(shù)總和,時間限制,記賬號等
- 其他信息
這些進(jìn)程屬性在當(dāng)初的可執(zhí)行程序里面有嗎?——沒有!
可執(zhí)行程序里面只有代碼和執(zhí)行邏輯!其他什么都沒有!
每一個可執(zhí)行程序進(jìn)入內(nèi)存里面,操作系統(tǒng)都會自動的生成一個相對應(yīng)的pcb!
然后這些pcb以鏈表的方式鏈接起來!完成再組織!
這樣子如果我們要CPU去調(diào)度一個優(yōu)先級最高的進(jìn)程那么流程是怎么樣的呢?
首先操作系統(tǒng)會去遍歷這個pcb鏈表!(不是遍歷可執(zhí)行程序!沒有任何的意義!)因?yàn)閜cb有進(jìn)程的所有信息!所以操作系統(tǒng)可以找到優(yōu)先級最高的進(jìn)程!然后把這個進(jìn)程對應(yīng)的代碼交到CPU里面!CPU就可以執(zhí)行這個進(jìn)程的代碼了!
進(jìn)程退出也是同理——操作系統(tǒng)遍歷鏈表,發(fā)現(xiàn)有一個pcb里面的狀態(tài)被標(biāo)記為死亡,那么操作系統(tǒng)就將這個pcb從鏈表刪除,同時釋放進(jìn)程在內(nèi)存中對應(yīng)的代碼和數(shù)據(jù)那么進(jìn)程就被退出了!
這樣對所謂的對進(jìn)程進(jìn)行管理就變成了對進(jìn)程對應(yīng)的PCB進(jìn)行管理!
對進(jìn)程的管理 ——> 轉(zhuǎn)換為了對鏈表的增刪查改!
這就是PCB存在的意義!所以PCB存在也是一個必然的!
linux內(nèi)核的源碼下的PCB
所以我們終于可以對進(jìn)程下達(dá)一個準(zhǔn)確的定義!
進(jìn)程 = 內(nèi)核數(shù)據(jù)結(jié)構(gòu)(task_struct) + 進(jìn)程對應(yīng)的磁盤代碼!
進(jìn)程在linux與Windows下的表現(xiàn)!
Windows下的進(jìn)程
linux下的進(jìn)程
這就是linux下面的進(jìn)程(右邊)首行有這個進(jìn)程的各種屬性!
PPID 該進(jìn)程的父進(jìn)程id
PID 該進(jìn)程自己的id
PGID 該進(jìn)程的主id
SID 該進(jìn)程的會話id
TTY 該進(jìn)程對應(yīng)的終端!
STAT 該進(jìn)程的狀態(tài)!
UID 用戶的id
COMMAND 對應(yīng)的是哪一個進(jìn)程
有兩個進(jìn)程一個是我們左邊執(zhí)行的mypro,一個是我們用來過濾的grep!
進(jìn)程在調(diào)度運(yùn)行的時候!進(jìn)程就具有了其動態(tài)屬性!
linux下面的進(jìn)程查看指令
ps aux / ps axj 命令
可以配合管道與其他指令一起使用!上面的右圖便是使用ajx來查看系統(tǒng)進(jìn)程!
進(jìn)程有關(guān)的系統(tǒng)調(diào)用!
我們上面的馮諾依曼體系已經(jīng)說過了!我們編程的本質(zhì)就是在調(diào)用系統(tǒng)調(diào)用接口!然后讓系統(tǒng)幫我們完成剩下工作!
我們一般同軟件層來使用系統(tǒng)調(diào)用!但是我們也可以自己去調(diào)用系統(tǒng)調(diào)用!
getpid/getppid
(2)意味著就是系統(tǒng)調(diào)用接口!
我們可以看出getpid的功能就是返回調(diào)用它的進(jìn)程的id
getppid的功能就是返回調(diào)用它的進(jìn)程的ppid
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
while(1)
{
printf("這是一個進(jìn)程! pid :%d ,ppid:%d\n",getpid(),getppid());
sleep(1);
}
return 0;
}
接下來我們可以使用這個接口看到一種現(xiàn)象
那就是每次重新將程序加載到內(nèi)存的時候!該進(jìn)程的pid都會改變!這是很正常的一個現(xiàn)象!
因?yàn)槊看渭虞d到內(nèi)存中,操作系統(tǒng)都要為這個進(jìn)程重新創(chuàng)建相應(yīng)的pcb! 重新分配pid!
而且我們也可以發(fā)現(xiàn)另一個現(xiàn)象那就是ppid都不會改變!這是因?yàn)槲覀儸F(xiàn)在所有的子進(jìn)程都是在bash這個父進(jìn)程下面運(yùn)行!所以無論子進(jìn)程如何改變都不會影響到父進(jìn)程的!
而且bash這個進(jìn)程也是shell外殼(父bash)下面的一個子進(jìn)程!這是因?yàn)閟hell是內(nèi)核和用戶進(jìn)行交互的唯一窗口如果這個窗口壞了那就無法進(jìn)行交互了!所以shell外殼都會以子進(jìn)程的方式運(yùn)行而不會本身自己去運(yùn)行!這樣子無論子進(jìn)程如何,都不會影響到shell外殼本身!
如果我們把bash殺掉了!也會shell外殼重新生成一個新的子進(jìn)程!
我們可以看到此時ppid就發(fā)生了改變!
一般來說命令行上啟動的進(jìn)程它的父進(jìn)程的都是bash!
無論子進(jìn)程如何錯誤!頂多是子進(jìn)程崩潰!父進(jìn)程不會有任何影響!
我們可以看到我們在進(jìn)程里面寫入一個 1/0最后進(jìn)程是崩潰了!
但是父進(jìn)程是沒有任何的影響
另一種查看進(jìn)程的方式
ls /proc/
/proc 是一個系統(tǒng)文件!
我們可以發(fā)現(xiàn)其實(shí)linux下面的進(jìn)程也是以文件的形式存在的!
所以我們可以用我們pid 來查找該文件下我們的進(jìn)程
我們可以從下面的這個文件里面看到這個進(jìn)程對應(yīng)的可執(zhí)行程序!
當(dāng)我們使用kill -9 殺死該進(jìn)程的時候!下面的文件就消失了!
接下來我們做個實(shí)驗(yàn)?那就是當(dāng)我們在進(jìn)程執(zhí)行的時候刪掉這個進(jìn)程指向的二進(jìn)制文件!這個進(jìn)程會怎么樣?因?yàn)槲覀兩厦婵梢钥吹竭@個進(jìn)程的文件是會指向這個進(jìn)程的二進(jìn)制文件的!
我們可以發(fā)現(xiàn)進(jìn)程仍然在執(zhí)行!雖然進(jìn)程下面的文件警告我們我們的可執(zhí)行文件已經(jīng)被刪除了!
從這里我們也可以看出來!一個進(jìn)程對應(yīng)的程序加載到內(nèi)存中之后!理論上來說已經(jīng)和這個進(jìn)程對應(yīng)的可執(zhí)行程序沒有任何關(guān)系了!
進(jìn)程的常見調(diào)用——fork
用于創(chuàng)建子進(jìn)程的系統(tǒng)調(diào)用接口!
這是一個函數(shù)函數(shù)執(zhí)行前只有一個父進(jìn)程,函數(shù)執(zhí)行后有一個父進(jìn)程一個子進(jìn)程
我們可以看到一個行代碼打印了兩次!
30047就是子進(jìn)程30038的父進(jìn)程!
那fork的實(shí)際用途是什么呢?
我們可以看看fork的返回值!
會返回給父進(jìn)程子進(jìn)程的pid
會返回給子進(jìn)程一個0!
這個意思是不是說fork有兩個返回值呢?——不是的!但是現(xiàn)在因?yàn)闋砍兜絻?nèi)存地址空間!所以無法進(jìn)行解釋!但是fork并不是有兩個返回值!
我們先來了解fork的用法!
#include<stdio.h> #include <unistd.h> int main() { pid_t id = fork(); if(id < 0 ) { perror("fork"); return 1; } else if(id == 0) { while(1) { printf("我是子進(jìn)程 ,pid = %d ,ppid = %d\n",getpid(),getppid()); sleep(1); } //child } else { //parent while(1) { printf("我是父進(jìn)程 ,pid = %d ,ppid = %d\n",getpid(),getppid()); sleep(3); } } return 0; }
我們神奇的發(fā)現(xiàn)本應(yīng)該只執(zhí)行一個的if else語句竟然兩個都開始執(zhí)行了!
這是因?yàn)閒ork之后,會有連哥哥進(jìn)程在執(zhí)行代碼!
fork后續(xù)的代碼!會被父子進(jìn)程共享!
通過返回值的不同來讓父子進(jìn)程執(zhí)行后續(xù)共享代碼的一部分!
從上面的代碼中我們可以看出操作系統(tǒng)不僅對硬件做管理!
操作系統(tǒng)也對進(jìn)程做管理!而進(jìn)程在沒有進(jìn)入內(nèi)存之前就是磁盤上的一個個的二進(jìn)制程序
然后我們把它加載到內(nèi)存中 就要先描述在組織,對應(yīng)的設(shè)計出進(jìn)程的管理結(jié)構(gòu)(就是PCB)
PCB里面就含有各種信息例如(pid,ppid這些都是進(jìn)程里面的信息)
而對進(jìn)程做管理就是對軟件做管理!文章來源:http://www.zghlxwxcb.cn/news/detail-404748.html
而無論對硬件還是軟件做管理里面的數(shù)據(jù)是要被用戶給拿到的!
);
}
}
return 0;
}文章來源地址http://www.zghlxwxcb.cn/news/detail-404748.html[外鏈圖片轉(zhuǎn)存中...(img-zyKZf7pF-1680415033352)] **我們神奇的發(fā)現(xiàn)本應(yīng)該只執(zhí)行一個的if else語句竟然兩個都開始執(zhí)行了!** **這是因?yàn)閒ork之后,會有連哥哥進(jìn)程在執(zhí)行代碼!** **fork后續(xù)的代碼!會被父子進(jìn)程共享!** **通過返回值的不同來讓父子進(jìn)程執(zhí)行后續(xù)共享代碼的一部分!** **從上面的代碼中我們可以看出操作系統(tǒng)不僅對硬件做管理!** **操作系統(tǒng)也對進(jìn)程做管理!而進(jìn)程在沒有進(jìn)入內(nèi)存之前就是磁盤上的一個個的二進(jìn)制程序** **然后我們把它加載到內(nèi)存中 就要先描述在組織,對應(yīng)的設(shè)計出進(jìn)程的管理結(jié)構(gòu)(就是PCB)** **PCB里面就含有各種信息例如(pid,ppid這些都是進(jìn)程里面的信息)** **而對進(jìn)程做管理就是對軟件做管理!** **而無論對硬件還是軟件做管理里面的數(shù)據(jù)是要被用戶給拿到的!**
到了這里,關(guān)于馮諾依曼體系和操作系統(tǒng)和進(jìn)程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!