一、計算機硬體知識
(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的百分比...