文章目錄
- 1. 行程
- 1.2 PCB
- 1.2.1背景關系資料
- 1.2.2 記憶體指標
- 1.2.3狀態
- pid和ppid與fork(創建行程)與識別符號
- 1.2.4優先級
- 1.2.6 程式計數器
1. 行程
大家應該對任務管理并不陌生吧,有時候app卡死了我們就需要手動去吧這個app殺死,但仔細看會發現他上面寫的是行程
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Bi2Qrsij-1639743084209)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211204155353580.png)]](https://img.uj5u.com/2021/12/19/289589190914062.png)
簡單來說,一般點開app就是把軟體的代碼和資料加載到記憶體中,這樣算是一個行程了,但是其實內部還進行了更多的操作,他還會為這個代碼創建一個PCB(sask_struct)
1.2 PCB
什么是PCB?
行程控制塊,用來描述行程屬性的集合
為什么需要PCB?
一般情況下行程是不止一個的,所以CPU需要對行程管理,切上述說過一個概念管理者與于被管理者,而CPU就是管理者,行程就是背管理者,一般管理者是不直接管理被管理者,一般通過資料管理的
PCB中包含的資訊(部分)
- 背景關系資料
- 記憶體指標
- 狀態
- 優先級
- 識別符號
- 程式計數器
- IO狀態
- 記賬資訊
1.2.1背景關系資料
CPU一直奉行一個概念:公平至上,效率為優,就是CPU不會偏心他每一個行程都會雨露均沾,所以這里就有一個概念叫做時間片
時間片:
微觀是就是分配給每個行程在CPU上的運行時間
當一個行程的時間片到了,或者來了一個優先級更高的行程,那么CPU就要把他剝離下來,而剝離下來的時候會將CPU暫存器中的資訊(運行資訊),程式計數器(pc指標,存的是下個代碼的地址),程式狀態,保存至PCB中,整個就是背景關系資料的簡單概念
并發
老話說眼見為實,耳聽為虛,其實作在我告訴你,眼見也不一定為實,我們平時在電腦上打開多個app,在上述操作中可以理解CPU是同時在運行多個行程,這就是眼睛欺騙了你,他只讓你看到了他的表面,底層其實是cpu在瘋狂的切換(每個行程都有對應的時間片),讓你覺得其實CPU在執行多個行程
并行
本質就是有錢,一臺機子倆CPU,那么CPU就可以在同一時間運行倆個行程,只要錢夠多,同時跑百八十個行程都沒事
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WuzUnMLu-1639743084211)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211212165632154.png)]](https://img.uj5u.com/2021/12/19/289589190914063.png)
途中可以清晰的看出在一段時間內并發與并行的運行原理,且他們剝離后會放到運行佇列中等待
并發:一段時間內運行多個行程
并行:同一時間可以運行多個行程(取決于cpu個數)
運行佇列等待:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PGNZyNEY-1639743084211)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211217200025216.png)]](https://img.uj5u.com/2021/12/19/289589190914064.png)
1.2.2 記憶體指標
1.2.3狀態
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1O6iyDRU-1639743084212)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211205163054711.png)]](https://img.uj5u.com/2021/12/19/289589190914065.png)
上面的是宏觀的行程狀態圖,且每個作業系統可能對應的狀態有所不同,我們講的linux下的狀態
- R 運行狀態
- S 睡眠狀態
- D 深度睡眠(磁盤休眠)
- T 停止狀態
- Z 僵尸狀態
- X 死亡狀態
R狀態
R既然是運行狀態,那么他是CPU在運行的嗎?
當然不是,上面說過,每個行程都有一個時間片,運行完就剝離下來,還需要運行就放到運行佇列中,那么其實在運行佇列中的行程也是R狀態
D狀態 VS S狀態
S和D都是睡眠狀態
S,D都意味著行程在等待事件完成,但是S是可以被中斷喚醒了(外部給一個指令),D是只能等著行程自動醒來
不知道你有沒有遇到過這樣的場景就是你想關機卻卡死了,其實就是有行程在深度睡眠(D),阻止你關機,現在是不是多年的謎團就解破了,D狀態一般是行程在進行重要的操作,如往磁盤中塞資料……
T狀態
該狀態可以理解為在除錯,啟動除錯不就停在了短點出嗎,他也是類似,行程直接停止,需要發送SIGSTOP才可以繼續,這就和我們按下n,s(Linux中gdb下一步與進入函式指令)他就又開始跑,
Z狀態
父行程還在,可是子行程突然啥原因退出了,那么這個時候子行程就是僵尸狀態,但他是僵尸狀態的時候他會把自己行程的基本資訊放入他的PCB中
為啥叫僵尸狀態呢?
當一個行程意外退出的時候是不會馬上被釋放的,就和背景關系資料類似,我創建行程本質是想干什么,當然是完成任務了,如果他突然掛了,那么我需要知道他是否完成了任務,如果沒有完成我需要派新行程再去執行,所以僵尸狀態本質:就是行程退出時候的行程狀態
不處理僵尸狀態會怎么樣?
C和C++你動態開辟出來的資料不釋放會怎么樣?記憶體泄漏咯,那么Z狀態也一樣,Linux是由C語言撰寫(其實作業系統基本都是由C撰寫的),那么上述說過一個行程是由代碼資料,還有對應PBC結構體,這個PCB很大很大…………
X狀態
該狀態一般你在任務串列是看不到的,因為一閃而過,直接被作業系統回收,
拓展介紹一個行程(孤兒行程):
人如其名,就是當子行程還在運行的時候,這時候我父行程突然也應為某種原因線子行程退出,這就是孤兒行程的概念?
你說過子行程的資料是父行程回收的那現在怎么?那么你想一想現在誰可以幫助子行程不變僵尸呢?當然是作業系統,沒錯當一個行程變成孤兒行程的時候,他們會去認作業系統做父親(作業系統本質也是一個行程(1號行程))
如果我看這個行程不爽老是優先占用CPU資源那么什么辦法呢?
- kill + pid
那么現在有個問題就是僵尸行程可以被殺死嗎?
現在已經是邏輯題了,你說你向他心臟開了一槍后且確認已經死了,臨走的時候又補了幾槍算是在殺了次嗎?他又不是死侍(漫威超級英雄),你那只能算鞭尸
除了僵尸且D狀態也是不可以被殺死的,你關機都可以給阻攔住讓你死機,你覺得一條指令可以殺死他們不要開玩笑了好嗎
如何查看呢?
- 需要一條指令: ps axj |grep [行程]
- top
- ps l
建議使用第一個,因為第一個搭配grep直接篩選出你想要看的行程
那么怎么樣才會看到這些狀態呢?
R狀態:
當你載用ps指令的時候怒有沒有發現其實ps他的狀態就是R
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RHHoHSa2-1639743084213)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211212171559745.png)]](https://img.uj5u.com/2021/12/19/289589190914068.png)
本質我們輸入這個指令也創建了一個行程
t狀態
當我按下回車得的時候,那么查看行程狀態的時候,main.g這個行程的就變成了t
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ulc001fA-1639743084214)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211212171335935.png)]](https://img.uj5u.com/2021/12/19/289589190914069.png)
Z狀態:
代碼:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-r7MFglLv-1639743084214)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211212164212018.png)]](https://img.uj5u.com/2021/12/19/2895891909140610.png)
行程的狀態:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OcYtrprt-1639743084215)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211212163747563.png)]](https://img.uj5u.com/2021/12/19/2895891909140611.png)
S狀態
這反而是最好看到的,只需要在代碼中加一個sleep函式,或者不加行程都處于S狀態(因為本質上這個行程又大一那一下在運行,大部分時間都是在睡眠所以)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-69Hu3708-1639743084215)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211213144904833.png)]](https://img.uj5u.com/2021/12/19/2895891909140612.png)
孤兒行程:

當被1號行程領養后,你不發ctrl+C終止行程,你可以理解為翅膀硬了,普通的招對他沒用了,這個時候需要用kill 指令進行殺除
pid和ppid與fork(創建行程)與識別符號
在上面你看到右pid與ppid,這倆個是什么東西呢?
在現實生活中,你是如何被人標識的呢?
名字,外號???
這只是一部分,那么當要過年買車票回家時候你你不會和售票員說我叫xxx,給我張票我要回家,這個除非你是總統一般情況售票員小姐姐會認為你🧠有點毛病,你當然是遞上你的生份證,因為上面的生份證號就代表了你,你的一切資訊都可以通過他得知,而不是xxx的名字
那么pid就是你的生份證號,也就是當前行程的生份證號(識別符號)
ppid為則為你的父行程的生份證號(多出的p理解為parent)
且你看到我運行的時候為啥開if 與else同時運行,這就要歸功于fork()
linux中的分叉函式(其實就是創建子行程函式)
- 創建成功后,子行程回傳0,父行程回傳子行程的 pid,如果失敗回傳 -1(回傳型別是pid_t 其實就是 unsigend long long的typedef)
- 創建出來的子行程的資料與代碼與父行程一致(子行程創建的時和父行程共同指向一份代碼,但是資料是各自私有一份的 )
- 且在運行父子行程的時候誰優先取決于作業系統
圖解forke創建后,行程運行狀態:
為啥需要回傳子行程的pid給父行程?
你想當子行程退出后他的資源由誰回收呢?那你想你在學習里面犯事了那是誰給你擦屁股的,當然是你老爹啊,那么道理都一樣當子行程退出后當然是由他的夫行程取釋放嘍
這個時候可能有人會問,那么父行程由誰釋放?
快動用你的小腦袋瓜子想想,你父親是那里來的,不要和我說你父親是孫悟空,或者耶穌,當然是你爺爺奶奶生下來的呀,那么‘’爺爺‘’ 行程是啥呢?
bash其實就是命令列解釋器
現在介紹完linux中的狀態后我們來對應一下開始的行程狀態圖:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9Gs4lAeo-1639743084217)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211213154100906.png)]](https://img.uj5u.com/2021/12/19/2895891909140616.png)
1.2.4優先級
在醫院繳費的時候是否留心看到過一個一張紙條,上面寫著 “軍人依法優先”,雖然我沒有現實中去醫院沒有碰到過兵哥哥,那為啥要優先,本質就是他啥都優先,抗洪救災,保家衛國……,且繳費的視窗太少了,本質就是僧多粥少
而在計算機中也是如此,一般情況下,計算機中只搭載了一顆CPU,那么行程那么多,不也是一個僧多粥少的局面嗎
優先級 vs 權限
你覺得他們的一樣嗎?
其實是不一樣的,優先級是優先獲得資源,說白了,不管怎么樣最終你都會獲得資源(好像看過一部電影還是電視,男主獨苗叛逆,家里有錢,他爸不給他錢,最終他老爹死了,因為是獨苗所以他還是獲得了遺產),權限是有沒有資格獲得,如上面的故事,我是你家的庸人,老板死了他為啥不把錢給我,本質就是我沒有這個權限
如何修改優先級
在Linux中優先級由PRI 與 NI 值控制,PRI為初始值而NI是可以影響他的優先級
NI的范圍[-20,19],越小優先級就越高,優先獲得資源
如圖所示
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CmChVcrK-1639743084217)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211208154820706.png)]](https://img.uj5u.com/2021/12/19/289589190914061.png)
需要用到的指令是top->r-> 輸入pid與nice值,且每次修改都是在PRI的初始值上修改入上圖所示(80)
為什么要限制NI的范圍?
上述說過一個概念就是,OS的調度器的第一原則就是“公平之上,效率擇優”,如果你將一個行程的優先級設為-10000000……那么這時候CPU大部分時間都在運行這個行程,那么就導致其他行程調度不到,導致饑餓問題,就如古代一些皇帝一樣,自己胡吃海喝,底下民不聊生,這難道不出問題?
1.2.6 程式計數器
這個在上述提到過,學名是PC,不是電腦端的意思,他的作用指向程式下一條需要執行的代碼存到暫存器中,這個程序就叫做取指令,并且在如何時刻,PC指標都指向主存的某潭訓器指令,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/385592.html
標籤:其他
上一篇:【LFS7.7】一步步教你從 〇 開始擼個 Linux 系統 | 文末送書
下一篇:CSP-J 2021解題報告


![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nS2ApRbl-1639743084212)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211209171833537.png)]](https://img.uj5u.com/2021/12/19/289589190914067.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zb3tKJBB-1639743084216)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211213150420299.png)]](https://img.uj5u.com/2021/12/19/2895891909140614.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nx12r4FJ-1639743084216)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211213155338547.png)]](https://img.uj5u.com/2021/12/19/2895891909140615.png)