行程基本概念
- 馮諾依曼體系系統
- 作業系統
- 總結
- 系統呼叫和庫函式概念
- 行程
- 基本概念
- 描述行程 PCB
- task_struct
- task_struct內容分類
- 前臺行程
- 刪掉后臺行程
- 組織行程
- 查看行程
- 通過系統呼叫獲取行程識別符號
- 通過系統呼叫創建行程-fork初識
- 行程狀態
- 行程狀態查看
- Z(zombie):僵尸行程
- echo $?
- 僵尸行程的危害
- 孤兒行程
- 行程優先級
- 查看系統行程
- PRI和NI
- 查看行程優先級的命令
- 其他概念
馮諾依曼體系系統
我們常見的計算機,服務器大部分都遵循馮諾依曼體系
目前為止,計算機都是由一個個硬體組成
- 輸入單元:鍵盤,滑鼠,掃描儀,話筒,攝像頭,網卡,硬碟等
- 中央處理器(CPU):運算器,控制器等
- 輸出單元:顯示幕,列印機,音響,網卡,硬碟等

總結:
1、站在硬體角度&&在資料層面上,CPU只和記憶體打交道,外設只和記憶體打交道
2、資料要處理,必須預裝載到記憶體中,區域性原理,由作業系統完成預裝
程式要運行之前必須得先加載到記憶體中,為什么?
答:可執行程式 (檔案)是在硬碟上(外設)
作業系統
概念:任何計算機系統都包含一個基本的程式集合,稱為作業系統(OS),籠統的理解,作業系統包括:
-
內核(行程管理,記憶體管理,檔案管理,驅動管理)
-
其它程式(函式庫,shell程式等)
設計OS的目的 -
與硬體互動,管理所有的軟硬體資源
-
為用戶程式(應用程式)提供一個良好的執行環境



總結
計算機管理軟體
- 1、描述,用struct 結構體
- 2、組織,用鏈表或其他高效的資料結構
系統呼叫和庫函式概念
- 在開發角度,作業系統對外會表現為一個整體,但是會暴露自己的部分介面,供上層開發使用,這部分由作業系統提供的介面,叫做系統呼叫
- 系統呼叫在使用上,功能比較基礎,對用戶的要求相對也比較高,所以開發者對部分系統呼叫進行封裝,從而形成庫,有了庫,就更有利于開發者進行二次開發
行程
基本概念
- 概念:程式的一個執行實體,正在執行的程式等
- 內核觀點:擔當分配系統資源(CPU時間,記憶體)的物體

描述行程 PCB
- 行程資訊被放在一個叫做行程控制塊的資料結構中,可以理解為行程屬性的集合
- PCB(process control block),Linux下task_struct是PCB的一種

task_struct
- 在Linux中描述的行程結構體叫 task_struct
- task_struct是Linux內核的一種資料結構,它會被裝載到RAM(記憶體)里并且包含著行程資訊
task_struct內容分類
- 標示符:描述本行程唯一的標示符,用來區別其他行程 pid ppid
- 狀態:任務狀態,退出代碼,推出信號等 STAT:S+:休眠 R+:運行 R:后臺運行
- 優先級:相對于其他行程的優先級
- 程式計數器:程式中即將被執行的下一條指令的地址PC/EIP
- 記憶體指標:包括程式代碼和行程相關資料的指標,還有其他行程共享的記憶體塊指標
- 背景關系資料:行程執行時處理器的暫存器中的資料
- I/O狀態資訊:包括顯示的I/O請求,分配給行程的I/O設備和被行程使用的檔案串列
- 記賬資訊:可能包括處理時間的總和,使用的時鐘數的總和,時間限制,記賬號等

問什么要有優先級?
答:CPU資源是有限的,行程可以有多個,行程需要進行優先級設定
如何理解行程排隊?
答:PCB結構體排隊

PCB以雙鏈表的形式鏈接,所謂管理行程-》對鏈表的增刪查改
前臺行程
在Linux命令列中,只能有一個前臺行程,
想要把前臺行程變成后臺行程:程式+&
刪掉后臺行程
$ kill -9 +pid的值
組織行程
可以在內核源代碼里找到它,所有運行在系統里的行程都以task_struct鏈表的形式存在內核里
查看行程
行程的資訊可以通過/proc系統檔案夾查看

大多數行程資訊同樣可以使用top和ps這些用戶級工具來獲取

1、找所有行程串列
$ ps aux

2、找指定檔案的行程
$ ps aux | grep '檔案名'

3、找出某個檔案的n行行程
$ ps aux | head -n && ps aux | grep '檔案名'

通過系統呼叫獲取行程識別符號
- 行程id(PID)
- 父行程id(PPID)



通過系統呼叫創建行程-fork初識
fork創建子行程,fork之前的代碼被父行程執行,fork之后的代碼默認被父子都可以執行
- 運行 man fork 認識 fork
- fork 有兩個回傳值 給父行程回傳子行程的pid,給子行程回傳0


- 父子行程代碼共享,資料各自開辟空間,私有一份(采用寫時拷貝)
- fork之后通常要用if 進行分流
父子行程分流,“同時進行”


行程狀態
一個行程可以有幾個狀態(在Linux內核里,行程有時候也叫任務)

-
R 運行狀態(Running):行程不一定在運行中,它表明行程要么是在運行中要么在運行佇列里

-
S 睡眠狀態(Sleeping):行程在等待事件完成(睡眠有時候也叫可中斷睡眠),隨時可以被喚醒/殺掉
-
D 磁盤休眠狀態(Disk Sleep):有時候也叫不可中斷睡眠,在這個狀態的行程通常會等到IO的結束,不會被殺掉,即使是作業系統;自動喚醒,才可以恢復
-
T 停止狀態(stopped):可以通過發送 SIGSTOP信號給行程來停止(T)行程,這個被暫停的行程可以通過發送SIGCONT讓行程繼續運行

-
X 死亡狀態(dead):這個狀態只是一個回傳狀態,不會在任務串列里看到
行程狀態查看
$ ps aux /ps axj

Z(zombie):僵尸行程
- 僵死狀態(zombie):當行程退出并且父行程(使用wait()系統呼叫)沒有讀取到子行程退出的回傳代碼時就會產生僵死行程
- 僵死行程會以終止狀態保持在行程表中,并且會一直在等待父行程讀取退出狀態代碼
只要子行程退出,父行程還在運行,但父行程沒有讀取子行程狀態,子行程進入Z狀態
行程退出,在系統層面,曾經申請的資源并不是被立即釋放,而是要暫存一段時間,供OS(父行程)進行讀取
echo $?
- 命令列中,最近一次行程退出時候的退出碼

行程退出的資訊(退出碼),會暫時保存(task_struct),如果沒人讀取,此時,該task_struct相關資料不會被釋放
$ while :; do ps aux | head -1 && ps aux | grep myproc;echo"##############"; sleep 1 ; done
僵尸行程的危害
- 行程的退出狀態必須被維持下去,因為需要告訴父行程狀態,如果父行程一直不讀取,那子行程一直處于Z狀態
- 維護退出狀態本身就是要用資料維護,也屬于行程基本資訊,所以保存在task_sturct(PCB)中,Z狀態一直不退出,PCB一直需要維護
- 父行程創建子行程,不回收就會造成記憶體資源的浪費,因為資料結構物件本身就要占用記憶體
- 會造成記憶體泄漏
孤兒行程
- 父行程如果提前退出,子行程就稱為"孤兒行程"

行程優先級
- CPU資源分配的先后順序,就是指行程的優先權
- 優先權高的行程有優先執行的權力,配置行程優先權對多任務環境的Linux很有用,可以改善系統性能
- 可以把行程運行到指定的CPU上,這樣可把不重要的行程安排到某個CPU,可以改善系統整體性能
查看系統行程
在Linux和Unix系統中,用 ps -l 命令(只能查看當前Xshell登錄的行程)


- UID:代表執行者的身份
- PID:代表這個行程的代號
- PPID:代表這個行程的父行程的代號
- PRI:代表這個行程可被執行的優先級,其值越小越早被執行
- NI:代表行程的nice值
PRI和NI
- PRI是行程的優先級,或是程式被CPU執行的先后順序,值越小,優先級越高
- NI:nice值,表示行程可被執行的優先級的修正數
- PRI越小越先執行,加入nice值后,PRI(new)=PRI(old)+nice
- nice 為負時,優先級值變小,優先級變高,會被越快執行
- nice取值范圍是 -20~19
Linux下,調整行程優先級,就是調整nice值
查看行程優先級的命令
用top命令更改已存在的行程

- top
- 按r->輸入行程PID->輸入nice值



其他概念
- 競爭性:系統行程數目眾多,而CPU資源只有少量,甚至1個,所以行程之間是具有競爭性的,為了高效完成任務,更合理競爭相關資源,便有了優先級
- 獨立性:多個行程運行,需要獨享各種資源,多行程運行期間互不干擾
- 并行:多個行程在多個CPU下分別,同時運行,這稱之為并行
- 并發:多個行程在一個CPU下采用行程切換的方式,在一段時間內,讓多個行程得以推進,稱之為并發
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301136.html
標籤:其他
下一篇:GitLab拉取專案到本地
