簡體   English   中英

windows OS 上的多個程序同時使用寄存器而不中斷其他程序的情況如何?

[英]How more than a one program uses the registers simultaneously without interrupting other programs on the windows OS?

我一直想知道同時運行的多個程序如何使用 CPU 寄存器而不會導致 Windows 操作系統上的程序之間發生沖突。

Windows 操作系統是否使用“虛擬寄存器”來避免這種情況(多個程序同時使用相同的寄存器)?

因此,例如,如果兩個程序使用eax寄存器,操作系統真的會改變物理eax寄存器嗎?

還是像我上面提到的那樣使用一些“虛擬寄存器”?

操作系統不使用虛擬寄存器,改變了物理寄存器。

在過去,機器只有一個 CPU 內核,並且在任何時間點實際上只有一個線程在運行。 每次在不同的線程可以開始運行操作系統之前,kernel 將保存舊線程的 state(寄存器)並在新線程繼續之前恢復新線程的 state。 這稱為上下文切換。 切換發生在 kernel 模式下,如果它切換到的線程位於不同的進程中,它還必須更改虛擬 memory 映射。

在具有多個內核的系統上,多個線程可以同時運行,並且每個內核都有自己的一組寄存器。

MSDN 粗略概述了上下文切換在 Windows 上的工作原理:

調度程序為每個優先級維護一個可執行線程隊列。 這些被稱為就緒線程。 當處理器可用時,系統會執行上下文切換。 上下文切換的步驟是:

  • 保存剛剛完成執行的線程的上下文。
  • 將剛剛執行完畢的線程放在隊列的末尾,以獲得它的優先級。
  • 找到包含就緒線程的最高優先級隊列。
  • 移除隊列頭部的線程,加載它的上下文,然后執行它。

...

上下文切換的最常見原因是:

  • 時間片已過。
  • 具有更高優先級的線程已准備好運行。
  • 正在運行的線程需要等待。

如果您的程序在搶占式多任務操作系統上運行,那么您不必考慮上下文切換的發生方式和原因,您可以假裝始終控制寄存器並且您的程序是唯一運行的程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM