> 作者簡(jiǎn)介:?舊言~,目前大二,現(xiàn)在學(xué)習(xí)Java,c,c++,Python等
> 座右銘:松樹千年終是朽,槿花一日自為榮。> 目標(biāo):了解馮諾依曼體系結(jié)構(gòu)與操作系統(tǒng),掌握Linux的進(jìn)程
> 毒雞湯:一花凋零荒蕪不了整個(gè)春天,一次挫折也荒廢不了整個(gè)人生。
> 望小伙伴們點(diǎn)贊??收藏?加關(guān)注喲?????
??前言
????????我們最初學(xué)習(xí)Linux指令已經(jīng)可以用戶與操作系統(tǒng)交互了,往后面我們用Xshell可以編寫一些簡(jiǎn)單的代碼,這些只能算是入門,咱們學(xué)習(xí)Linux可不是這些,如果只學(xué)習(xí)這些的話,那在C語言中這些我們已經(jīng)掌握的比較熟練了????。學(xué)習(xí)Linux掌握的是各種代碼底層是如何運(yùn)行和使用的。
?主體
我們從以下學(xué)習(xí)馮諾依曼體系結(jié)構(gòu)與操作系統(tǒng)及其進(jìn)程????。
??馮諾依曼體系結(jié)構(gòu)
????????馮·諾依曼結(jié)構(gòu)也稱普林斯頓結(jié)構(gòu),是一種將程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器合并在一起的存儲(chǔ)器結(jié)構(gòu)。程序指令存儲(chǔ)地址和數(shù)據(jù)存儲(chǔ)地址指向同一個(gè)存儲(chǔ)器的不同物理位置,因此程序指令和數(shù)據(jù)的寬度相同,如英特爾公司的8086中央處理器的程序指令和數(shù)據(jù)都是16位寬。
????????數(shù)學(xué)家馮·諾依曼提出了計(jì)算機(jī)制造的三個(gè)基本原則,即采用二進(jìn)制邏輯、程序存儲(chǔ)執(zhí)行以及計(jì)算機(jī)由五個(gè)部分組成(運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備、輸出設(shè)備),這套理論被稱為馮·諾依曼體系結(jié)構(gòu)。
截至目前,我們所認(rèn)識(shí)的計(jì)算機(jī),都是有一個(gè)個(gè)的硬件組件組成:
- 輸入單元:包括鍵盤, 鼠標(biāo),掃描儀, 寫板等
- 中央處理器(CPU):含有運(yùn)算器和控制器等
- 輸出單元:顯示器,打印機(jī)等
關(guān)于馮諾依曼,必須強(qiáng)調(diào)幾點(diǎn):
- 這里的存儲(chǔ)器指的是內(nèi)存
- 不考慮緩存情況,這里的CPU能且只能對(duì)內(nèi)存進(jìn)行讀寫,不能訪問外設(shè)(輸入或輸出設(shè)備)
- 外設(shè)(輸入或輸出設(shè)備)要輸入或者輸出數(shù)據(jù),也只能寫入內(nèi)存或者從內(nèi)存中讀取。
- 一句話,所有設(shè)備都只能直接和內(nèi)存打交道。
這里說的光用文字是很難理解馮諾依曼體系結(jié)構(gòu)的,大家可搜說相關(guān)圖片用圖來了解馮諾依曼體系結(jié)構(gòu)。
??操作系統(tǒng)原理
什么是操作系統(tǒng):
- 操作系統(tǒng)(英語:Operating System,縮寫:OS)是一組主管并控制計(jì)算機(jī)操作、運(yùn)用和運(yùn)行硬件、軟件資源和提供公共服務(wù)來組織用戶交互的相互關(guān)聯(lián)的系統(tǒng)軟件程序。 根據(jù)運(yùn)行的環(huán)境,操作系統(tǒng)可以分為桌面操作系統(tǒng),手機(jī)操作系統(tǒng),服務(wù)器操作系統(tǒng),嵌入式操作系統(tǒng)等。
為什么要有操作系統(tǒng):
- 手段:對(duì)下管理好軟硬件資源。
- 目的:對(duì)上提供一個(gè)良好的運(yùn)行環(huán)境-->(為用戶提供穩(wěn)定的、高效的、安全的、的執(zhí)行環(huán)境)
用圖解釋操作系統(tǒng):
操作系統(tǒng)本質(zhì)對(duì)數(shù)據(jù)做管理,而管理的模用一句話來概括:先描述,在組織。
總結(jié):
計(jì)算機(jī)管理硬件
- 描述起來,用struct結(jié)構(gòu)體
- 組織起來,用鏈表或其他高效的數(shù)據(jù)結(jié)構(gòu)
??系統(tǒng)調(diào)用和庫函數(shù)
系統(tǒng)調(diào)用和庫函數(shù)概念描述:
- 在開發(fā)角度,操作系統(tǒng)對(duì)外會(huì)表現(xiàn)為一個(gè)整體,但是會(huì)暴露自己的部分接口,供上層開發(fā)使用,這部分由操作系統(tǒng)提供的接口,叫做系統(tǒng)調(diào)用。
- 系統(tǒng)調(diào)用在使用上,功能比較基礎(chǔ),對(duì)用戶的要求相對(duì)也比較高,所以,有心的開發(fā)者可以對(duì)部分系統(tǒng)調(diào)用進(jìn)行適度封裝,從而形成庫,有了庫,就很有利于更上層用戶或者開發(fā)者進(jìn)行二次開發(fā)。
那在還沒有學(xué)習(xí)進(jìn)程之前,就問大家,操作系統(tǒng)是怎么管理進(jìn)行進(jìn)程管理的呢?很簡(jiǎn)單,先把進(jìn)程描述起來,再把進(jìn)程組織起來!
??進(jìn)程
??概念描述
??描述進(jìn)程-PCB
- task_struct
task_struct-PCB的一種,在Linux中描述進(jìn)程的結(jié)構(gòu)體叫做task_struct。task_struct是Linux內(nèi)核的一種數(shù)據(jù)結(jié)構(gòu),它會(huì)被裝載到RAM(內(nèi)存)里并且包含著進(jìn)程的信息 。
- task_ struct內(nèi)容分類
- 標(biāo)示符: 描述本進(jìn)程的唯一標(biāo)示符,用來區(qū)別其他進(jìn)程。
- 狀態(tài): 任務(wù)狀態(tài),退出代碼,退出信號(hào)等。
- 優(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ù)[休學(xué)例子,要加圖CPU,寄存器]。
- I/O狀態(tài)信息: 包括顯示的I/O請(qǐng)求,分配給進(jìn)程的I/O設(shè)備和被進(jìn)程使用的文件列表。
- 記賬信息: 可能包括處理器時(shí)間總和,使用的時(shí)鐘數(shù)總和,時(shí)間限制,記賬號(hào)等。
- 其他信息
??查看進(jìn)程

- Makefile:
- myproc.c:

使用 ps ajx (a:所有,j:任務(wù),x:把所有的信息全部輸出)
一般搭配管道進(jìn)行使用,如:ps ajx | head -1 && ps ajx | grep test
,其中?ps ajx | head -1
?是把?ps ajx
?輸出的信息中的第一行信息(屬性列)輸出。
??通過系統(tǒng)調(diào)用獲取進(jìn)程標(biāo)示符
我們可以用以下查看當(dāng)前目錄下的進(jìn)程:ls /proc/
那我們?nèi)绾尾榭次覀兊倪M(jìn)程???
- 進(jìn)程id(PID)--->getpid()
- 父進(jìn)程id(PPID)--->getppid()
運(yùn)行結(jié)果:
ps ajx | head -1 && ps ajx | grep "mypro" //查看自己的進(jìn)程
??通過系統(tǒng)調(diào)用創(chuàng)建進(jìn)程-fork初識(shí)
再次修改我們的myproc.c文件
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
if(ret < 0){
perror("fork");
return 1;
}
else if(ret == 0){ //child
printf("I am child : %d!, ret: %d\n", getpid(), ret);
}else{ //father
printf("I am father : %d!, ret: %d\n", getpid(), ret);
}
sleep(1);
return 0;
}
運(yùn)行結(jié)果:
用下面指令搜索自己的進(jìn)程:ps axj | grep 1889
- 我們?cè)俅涡薷膍yproc.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("before fork: I am a prcess, pid: %d, ppid: %d\n", getpid(), getppid());
sleep(5);
printf("開始創(chuàng)建進(jìn)程啦!\n");
sleep(1);
pid_t id = fork();
if(id < 0) return 1;
else if(id == 0)
{
// 子進(jìn)程
while(1){
printf("after fork, 我是子進(jìn)程: I am a prcess, pid: %d, ppid: %d, return id: %d\n", getpid(), getppid(), id);
sleep(1);
}
}
else{
// 父進(jìn)程
while(1){
printf("after fork, 我是父進(jìn)程: I am a prcess, pid: %d, ppid: %d, return id: %d\n", getpid(), getppid(), id);
sleep(1);
}
}
sleep(2);
return 0;
}
- 運(yùn)行結(jié)果:
????????fork()之后,會(huì)有父進(jìn)程+子進(jìn)程兩個(gè)進(jìn)程在執(zhí)行后續(xù)代碼,fork()后續(xù)的代碼,被父子進(jìn)程共享,通過返回值不同,讓父子進(jìn)程執(zhí)行共享代碼的一部分,這就是并發(fā)式編程。
???結(jié)束語
? ? ? ?今天內(nèi)容就到這里啦,時(shí)間過得很快,大家沉下心來好好學(xué)習(xí),會(huì)有一定的收獲的,大家多多堅(jiān)持,嘻嘻,成功路上注定孤獨(dú),因?yàn)閳?jiān)持的人不多。那請(qǐng)大家舉起自己的小手給博主一鍵三連,有你們的支持是我最大的動(dòng)力??????,回見。文章來源:http://www.zghlxwxcb.cn/news/detail-766081.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-766081.html
到了這里,關(guān)于【Linux】馮諾依曼體系結(jié)構(gòu)與操作系統(tǒng)及其進(jìn)程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!