The mind is not a vessel that needs filling , but wood that needs igniting !
1. 運轉CPU
程式計數器pc
將pc置一個初值,然后取值執行,cpu就運轉起來了

2. CPU沒有好好運轉
當遇到IO設備的時候,cpu得等待

3. 得讓CPU好好運轉
當程式1執行到一個程式需要等著別的程式執行,那么就先切到別的程式執行

怎么切換,不就是pc的跳轉,利用堆疊來做

當只有一個堆疊的時候問題就出現了,
Yield:其作用是當前執行緒“放棄”執行,讓作業系統調度另一執行緒繼續執行

所以就出現了兩個堆疊+兩個用戶TCB(執行緒控制塊)

4. 一直在用戶態那怎么行?
當前的再怎么切都是在用戶切,根本進入不了內核

引入了內核堆疊的切換

5. 實作這個idea
在螢屏上交替的打出A和B

從用戶代碼開始:

fork是怎么作業的?
- 一個行程,包括代碼、資料和分配給行程的資源,fork()函式通過系統呼叫創建一個與原來行程幾乎完全相同的行程,也就是兩個行程可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個行程也可以做不同的事,
- 一個行程呼叫fork()函式后,系統先給新的行程分配資源,例如存盤資料和代碼的空間,然后把原來的行程的所有值都復制到新的新行程中,只有少數值與原來的行程的值不同,相當于克隆了一個自己,
fork函式的特性?
fork呼叫的一個奇妙之處就是它僅僅被呼叫一次,卻能夠回傳兩次,它可能有三種不同的回傳值
- 在父行程中,fork回傳新創建子行程的行程ID;
- 在子行程中,fork回傳0;
- 如果出現錯誤,fork回傳一個負值;
在fork函式執行完畢后,如果創建新行程成功,則出現兩個行程,一個是子行程,一個是父行程,在子行程中,fork函式回傳0,在父行程中,fork回傳新創建子行程的行程ID,我們可以通過fork回傳的值來判斷當前行程是子行程還是父行程,

INT就進入了內核

然后就是執行system_call , 接下來就是sys_fork

接著開始copy_process

然后就開始回傳

現在是創建好了一個列印A的行程,現在需要回傳創建一個打B的行程

和上面類似,只是對應的tss->eip不同
然后父行程開始等待,也就是阻塞,然后呼叫schedule
總的來說:就是有一個行程,產生出兩個列印A和列印B的子行程,對應著列印A和列印B的函式,然后父行程阻塞呼叫schedule,schedule就開始選擇其中的一個行程(根據選擇演算法),這里也就是列印A的行程,選擇完了就切換過去,


也就是把當前cpu中的資訊拍到當前父行程中,然后把A的PCB中的tss扣到cpu上

這就切換過去了,而cpu一直就是取指執行,此時eip=100,而eax=0,接下來程式中A就開始不斷的執行

6. 怎么打出B
前面是行程A開始不斷的打A了,而該怎么交替的列印A和B?
要想列印B,那么必須需要B這個行程執行,也就是得切換B行程對應的PCB,而切換的程式和上面的一樣,schedule、switch_to,那么現在需要一個呼叫,也就是呼叫到schedule的入口,這個就是調度點,由于是交替列印A和B,那么這個調度點該放到什么位置合適呢?
需要中斷,時鐘中斷

也就是對于A來說,先執行一會,當前的counter=0就呼叫schedule,和上面一樣,也是通過switch_to,把對應的資料進行交換,然后B執行


何為交替?還是中斷,因為時鐘中斷已經做好了,每過一段時間就要做一次時鐘中斷

這個時候A和B就交替的出現了
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/131412.html
標籤:Linux
上一篇:#Linux學習# 權限管理命令
