程式如何執行
這裡有點偏OS的部分
假設有個人在terminal中輸入了a.exe
OS會先在
current directory
找有沒有a.exe
,如果有就執行;再去PATH
中的路徑找a.exe
,如果還是沒有就輸出錯誤。OS會從index中拿到
a.exe
的基本資訊:大小、實體位置。把
a.exe
load到memory中(segmented),OS會維護一張表(區段的位置跟大小)從
.code
開始執行,此時process
會被用數字做辨識:process id
(pid)OS持續追蹤
process
的狀態,並回應process
的要求:- 讀寫memory、讀寫disk、I/O
process
結束就把memory free掉。
多工
作業系統能同時執行多任務(task)。
task 任務
process
– 行程- 擁有專屬的記憶體區域
thread
– 執行緒- 與其他
thread
share memory
- 與其他
scheduler 排程
- 因為CPU一次執行一個指令,為了要讓多個行程能『看起來』同時執行,必須把時間切成一段一段,並把每段分配給不同的程式。
Time Slice (時間切片)
將CPU時間切成一段一段。
Round-Robin scheduling 輪詢排程
task switch 任務切換
為了要達到分配time slice,必須要切換執行tasks。
在切換到新task之前,必須儲存當前task的狀態:
- Registers
- IP (Instruction Pointer)
- EFLAGS
- Segment registers
切換task稱作:context switch
,必須花時間。
preemptive 先/搶佔式
允許tasks具有較高優先權,可以中斷優先權較低的task。
例如:Windows、Linux、macOS
優點:穩定性
ex: 鍵盤處理器有較高的優先度,所以當程式當掉時可以叫taskmgr終止程式。
如果你覺得這篇文章很棒,請你不吝點讚 (゚∀゚)