x86 筆記 ep2

程式如何執行

這裡有點偏OS的部分

假設有個人在terminal中輸入了a.exe

  1. OS會先在current directory找有沒有a.exe,如果有就執行;再去PATH中的路徑找a.exe,如果還是沒有就輸出錯誤。

  2. OS會從index中拿到a.exe的基本資訊:大小、實體位置。

  3. a.exe load到memory中(segmented),OS會維護一張表(區段的位置跟大小)

  4. .code開始執行,此時process會被用數字做辨識:process id(pid)

  5. OS持續追蹤process的狀態,並回應process的要求:

    • 讀寫memory、讀寫disk、I/O
  6. 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的狀態:

  1. Registers
  2. IP (Instruction Pointer)
  3. EFLAGS
  4. Segment registers

切換task稱作:context switch,必須花時間。

preemptive 先/搶佔式

允許tasks具有較高優先權,可以中斷優先權較低的task。

例如:Windows、Linux、macOS

優點:穩定性

ex: 鍵盤處理器有較高的優先度,所以當程式當掉時可以叫taskmgr終止程式。


如果你覺得這篇文章很棒,請你不吝點讚 (゚∀゚)

推薦文章