程序概念 狀態 優先順序

2021-08-20 09:50:05 字數 4112 閱讀 8902

一、計算機硬體知識

(1)馮·諾依曼體系

a:運算器+控制器=cpu

b:輸入裝置和輸出裝置屬於外設(除cpu和記憶體外的都是外設)

c:儲存器=記憶體(不包括硬碟等)

d:對於資料訊號,外設只能直接和儲存器打交道,

cpu也只能直接和儲存器打交道(cpu不能直接與外設聯絡)

e:以在扣扣上傳送訊息為例,步驟為:

傳送方鍵盤(傳送方輸入裝置)->傳送方記憶體->qq封裝處理訊息(cpu)->返回到傳送方記憶體->由傳送方網絡卡(傳送方輸出裝置)進行網路傳送->接         收方網絡卡(接收方輸入裝置)接收訊息->接收方記憶體->解包(cpu)->返回到接收方記憶體->接收方顯示屏(輸出裝置)顯示

二、作業系統

(1)os:管理計算機軟硬體資源的軟體。    

os是乙個基本的程式集合,籠統來說包括核心(程序管理、記憶體管理、檔案管理、驅動管理)與其他程式(庫函式、shell程式等)。

(2)     

管理者:校長                                            

中間人(執行者):輔導員(不做管理決策)

被管理者:學生

【要管理好,管理者和被管理者可以不直接打交道】

【管理者通過資料做資料決策】

管理者:作業系統

中間人(執行者):驅動程式

被管理者:硬碟

【不直接交流,通過os採集到的硬體資料,而os採集的硬碟資料由驅動程式提供】

(3)管理層次圖如下:

(4)os的定位

對下進行軟硬體資源的管理 + 對上提供良好的執行環境

(5)os對上只提供各種介面,這些介面稱為系統呼叫。

不同於庫函式呼叫,系統呼叫要求對系統理解較深,庫是基於此又開發的一層,便於降低呼叫要求。

所以系統介面和庫函式介面是上下層關係。

三、程序概念

先把每個學生

描述(用結構體存其資料)起來,再把學生的描述資訊傳給管理系統(即把學生的描述資訊

組織起來)。

(1)基本概念

程序是程式的乙個執行例項、正在執行的程式等。對於核心來說,程序是擔當分配系統資源(cpu時間、記憶體)的實體。

(2)程序描述——pcb

pcb:程序被放在乙個叫做程序控制塊的資料結構中,可以理解為程序屬性的集合。

linux系統下的pcb是:task_struct。

【每個程序都有乙個結構體,再在每乙個結構體內新增乙個結構體指標,由此形成乙個鍊錶,os通過該鍊錶管理程序】

【描述程序的結構體稱為pcb】

【管理程序其實就是管理程序的pcb】

(3)所以記憶體中有:os、一堆程序、與程序對應的一堆pcb

(4)程序與程式的區別:

在硬碟上放著的程式,一旦進入記憶體就是程序。

程式一進入記憶體,os就會給其建立pcb維護起來。

(5)task_struct 的內容分類

(6)程序的切換        

被中斷程序的資訊儲存在記憶體中,儲存在記憶體中該程序的pcb中。

(7)程序的id:

pid   唯一識別符號

(8)查詢程序:

proc   【程序的資訊可以通過 /proc 系統⽂資料夾檢視     如:要獲取pid為1的程序資訊,你需要檢視 /proc/1 這個⽂資料夾】

ps    【加引數aux將所有程序的資訊展示出來】   

ps aux | grep 『5962』 ->查詢pid為5962的程序,grep為管道

系統呼叫    【通過系統呼叫同樣可以獲取程序的pid】getpid()獲取當前程序的pid     getppid()獲得父程序的pid

(9)所有程序都是bash。

(10)終止程序

ctrl+c

kill       [kill -9 6233]  6233為要殺掉程序的pid

(11)建立程序

讓程式跑起來

fork()

(12)關於fork()

fork()可建立子程序

fork()有兩個返回值

,分別為:給父程序返回子程序的pid、給子程序返回0。   因為孩子的父親只有乙個,而父親的孩子不一定只有乙個,所以子程序給父程序返回自己的pid、給自己返回0。

【關於為什麼會有兩個返回值:因為當乙個程式要返回時說明已經執行完成,子程序已經存在,此時執行返回語句,會因為子程序和父程序的**共用性而執行兩次。返回值的接收會觸發寫時拷貝(見(13))】

fork()之後,子程序和父程序共享**   (乙個執行另乙個也執行),效果見下圖;但兩者的資料私有,即資料各自儲存

eg:   

對於下面的程式,    

#include

#include

#include

int main()

執行結果為:

[root@localhost 1_class]# ./test_static

hello world!,pid:6367,ppid:5962

hello world!,pid:6368,ppid:6367    

【顯然,下面的顯示結果為子程序的顯示結果,fork()得到的子程序的pid為:6368。其建立步驟為:bash建立pid為6367的父程序,父程序建立pid為6368的子程序。】

(13)寫時拷貝

父子有任何乙個程序嘗試寫入某程式時,os會為其重新開闢乙個空間讓其寫入。  只有寫入時才會單獨拷貝,平時共用,可節約空間。

(14)雖然父程序與子程序共享**,但通常會為父程序和子程序分配不同的**塊。即將程式分流後讓父程序和子程序各執行不同的**塊。 如:

#include

#include

#include

int main()

} else if(id>0)    //父程序

} else

return 0; }

//將子程序與父程序的任務利用if語句分割開來

(15)fork()之後子程序和父程序誰先執行並不確定,完全由排程器決定。

四、程序狀態

1、狀態有哪些?

static const char * const task_state_array = ;

【暫停和睡眠的區別:sleep做事情了,stop沒有做事情,什麼都沒做。】

【sleep為淺度睡眠,可喚醒;d狀態為深度睡眠狀態,不可強制喚醒。s狀態的程序可以被殺死,d狀態不能被殺死】

【程序狀態資訊後面的+號表示是前台執行,沒有+說明是後台執行】

【r狀態不一定佔cpu,但佔cpu的一定是r狀態】

2、程序狀態切換圖:

3、殭屍程序

僵⼫屍程序危害:

4、孤兒程序

父程序如果提前退出,那麼子程序就稱之為「孤兒程序」

孤兒程序會被1號init程序領養,也就是說會由1號程序進行**。

父程序退出後為什麼沒有成為殭屍程序?因為父程序的父程序bash會立刻對死掉的父程序進行**。

五、程序的優先順序

1、重要的身份

2、關於程序優先順序pri

cpu資源分配的先後順序,就是指程序的優先權(priority)。

優先權高的程序有優先執行權利。

配置程序優先權對多工環境的linux很有用,可以改善系統效能。還可以把程序執行到指定的cpu上,這樣一來,把不重要的程序安排到某個cpu,可以大大改善系統整體效能。 3、

ni代表nice值,表示程序可被執行的優先順序的修正數值。

預設優先順序的值為80,預設nice值為0

優先順序越低越晚執行   

修改程序優先順序的命令:

nice

renice

【開始執⾏行程式就指定nice值:

nice -n -5 ./test】

【 renice -5 -p 5200 //pid為5200的程序nice設為-5】

用top命令更改已存在程序的nice:進入top後按「r」–>輸入程序pid–>輸入nice值

4、其他概念

程序狀態及優先順序

一 程序的各種狀態 1 r執行狀態 runing 並不意味著程序一定在執行中,它表明程序要麼在執行要麼在執行佇列裡 2 s睡眠狀態 sleeping 意味著程序在等待著事件完成 3 d磁碟休眠狀態 disk sleep 有時候也叫不可中斷睡眠狀態,在這個狀態的程序通常會等待i o的結束 4 t停止狀...

程序優先順序

程序的優先順序可以通過setpriority nice修改優先順序。程序分為普通程序和實時程序。實時程序的優先順序比普通程序的優先順序高。nice的值 20 19值越小優先順序越高。預設為0 不同程序的執行緒優先順序?執行緒會繼承程序的優先順序,核心的排程是執行緒。所以先看程序是普通程序還是實時程序...

程序優先順序

用top或者ps命令會輸出pri pr ni ni nice這三種指標值,這些到底是什麼東西?先給出大概的解釋如下 pri 程序優先權,代表這個程序可被執行的優先順序,其值越小,優先順序就越高,越早被執行 ni 程序nice值,代表這個程序的優先值 nice 改變過優先順序的程序的占用cpu的百分比...