vim編輯器,編寫一個程序模擬進程
?在vim中查看sleep函數
底行模式輸入
?寫個Makefile自動運行波奇學Linux:yum和vim-CSDN博客
運行程序
?PID和PPID
查看進程目錄信息
實際有過濾出來有兩個,一個進程本身一個是grep程序,通過 -v grep過濾走含grep的進程。
?目錄中的PID相當于進程的唯一標識符。就是給進程分配一個號碼,這個數字和進程之間是一一對應的。
PID是進程的屬性,那么PID是在 struct task_struct結構體中。
task_struct(波奇學Linux:馮諾依曼和進程-CSDN博客)
????????
?ps ajx本質是就是遍歷雙向鏈表。
?而PPID是該進程的父進程的編號
查看父進程信息,可知父進程是-bash命令行
當xhell打開時會運行bash進程,而每個命令行command都是bash的子進程?。
因此當make 時命令行會創建子進程來啟動程序。
kill 指令 關閉進程
輸入指令kill -9 PID 關閉進程
?
?getpid()和getppid()返回進程的PID和PPID,證明PID確實是進程PCB的屬性
查看函數信息可以用命令行!man查看
PID和PPID剛好吻合?
?
fork創建子進程
?
編寫程序
第二號的after line打印兩遍的原因是fork創建了一個子線程,子線程運行了一遍printf("after line\n");?
fork會返回兩次,創建子進程成功,返回子進程的PID給父進程,返回0給子進程
?
說明確實父子進程同時運行?。
初步理解fork的原理
代碼的執行流是從上往下的,遇到fork函數時一份為二。
?fork函數內部構拷貝一份父線程的task_struct,子線程指向父線程的代碼,因此子父線程共享代碼。
子父線程相對獨立,不共享數據。因此父線程寫時拷貝數據給子線程。當子線程要修改父線程的變量時,會把變量拷貝一份,開辟空間給子線程。既避免了浪費空間還避免子線程修改父線程的變量。
fork return兩次,因此一般fork下要分流,分出父子線程。
父進程和子進程誰先運行是由調度器決定的。
bash創建子進程,底層調用了fork
進程狀態:運行,阻塞,掛起
運行
運行一個進程會把進程放入一個運行隊列 runqueue?
通過控制task_struct指針來控制進程的運行先后,每個進程都有一個時間片的概念
并且有個時間片如10ms,比如這個進程一可能運行10ms。
并發執行:在一段時間內所有的在隊列中的進程都會運行。
處于運行隊列的進程為R態:隨時被調度。
把進程從cpu上拿下來或者放上去,進程切換。
阻塞:離開運行隊列,進程進入等待隊列。
某個進程(比如含有scanf的語句)必須從外設從獲取 數據輸入時,才能繼續運行,那么他就進入阻塞狀態,如果同時有其他進程也要獲得數據,他們會從運行隊列中脫離出來進入等待隊列中,知道獲取數據。阻塞就是暫停,直到某個條件達成后再繼續運行。
等待隊列的進程處于阻塞狀態,阻塞隊列有n個,運行隊列只能有一個(1個cpu)
喚醒:就是從阻塞狀態轉為R態,重新進入運行隊列。
掛起:數據暫時進入磁盤中
阻塞掛起:當操作系統內存嚴重不足時,處于等待隊列的進程會把數據從內存加載到磁盤,只留下pcb。此時進程被掛起,當進程喚醒時。又從磁盤加載數據到內存。