multithreading - 多線程模式 - 超線程意思




為什麼線程甚至在搶先式多任務操作系統(Windows 7) (3)

循環調度是內核明顯的策略。 但是,這不是Windows調度程序的工作方式。 它曾經回到Windows 9x的日子,一個調度程序是非常有能力給各種虛擬機等時間。 但是不是在Dave Cutler團隊的NT分支中,調度純粹是基於優先級的

無論哪個線程具有最高的優先級,都可以獲得cpu。 Windows中還有另外一塊代碼,它可以優化線程的優先級,並可以在創建線程時從缺省優先級修改它。 該代碼知道像擁有一個窗口在前台的線程的東西。 或者是一個正在等待一個被發送信號的同步對象的線程。 或者嘗試解決優先級反轉問題的更奇怪的調度問題。 隨機給一個線程運行的機會,儘管它不是輪到它。

專注於編寫健全的代碼。 開始一百個線程是不是一個非常理智的事情要做。 您試圖消耗機器實際上沒有的資源,沒有人擁有擁有100個內核的機器。 然而。 兩個冪,首先得到128個核心的機器。

我寫了一個Win32應用程序(在使用TThread類的32位Delphi-7中)來創建100個線程。 每個線程在恢復時都會連續(在一個循環中)遞增一個與線程對象關聯的64位計數器(所以不鎖定或共享數據)。

如果讓系統運行10到15秒並在此之後停止,則應該在每個線程中看到大致相同的計數。 但是我觀察到,81個線程運行了4億次循環,剩下的循環超過了9.5億次。 最慢的線程只有2.3億美元,而最快的21.11億美元。

根據MSDN的說法,搶占式多任務處於線程級別(而不是進程級別),所以我的每個線程都應該以循環的方式獲得其時間片。 我在這裡錯過了什麼,為什麼這種差異?

編輯1:機器配置:打開超線程的Intel i7 Quad Core 3.4GHz(一次有8個活動線程)。 運行Windows-7 64位專業版(測試應用程序是32位)

Edit2(線程代碼):測試應用程序是打開優化,沒有任何調試信息。 在IDE之外運行測試應用程序。

type

  TMyThread = class(TThread)
  protected
    FCount: Int64;
  public
    constructor Create;
    procedure Execute; override;
    property Count: Int64 read FCount;
  end;


{ TMyThread }

constructor TMyThread.Create;
begin
  inherited Create(True);
  FCount := 0;
end;  

procedure TMyThread.Execute;
begin
  inherited;
  while not Terminated do
  begin
    Inc(FCount);
  end;
end;

Windows 7是為用戶登陸而設計的。 當你的第一個線程想要工作時,OS給它一個時間片。 你,用戶,畢竟是剛開始的。 當第50個線程連續(從同一個進程!)想要工作時,更高優先級的線程(由Windows 7自己控制的後台進程)就進入了。這種情況正在發生,使得一些線程更幸運

你和我真的不想要一個個人的操作系統,根據用戶登陸過程的意願來分配CPU時間。 我會很好奇,看看2008 R2服務器如何處理這個。 您也可以使用高級選項卡設置:“選擇如何分配處理器資源”。


這裡有一些很好的推理..但有一些功能需要考慮。 Windows正在嘗試使用軟件進行多任務處理。 你的硬件不是多任務,它的使用權力做一個並行處理的系統會做什麼。 在Windows下,它優先。 在許多方面...和它的困惑。

讓我這樣解釋一下。 我有一個小程序看我的核心使用。 當窗口加載時,你會認為所有的內核都會被使用。 不。 當窗口加載時,其他內核開始使用。 那麼你會認為,當窗口加載它將加速加載,因為它可以訪問核心。 它不加速。 它不使用核心是全速加載更快。 即使Windows正在加載並運行一個EACH核心程序,它也會等待完成。 如果使用所有內核來處理每個程序,則使用軟件(大約比硬件慢100倍)來組裝另一端的部件。 很久以前,英特爾想把硬件換成並行處理,而MS說'不'是他們的軟件。 現在他們正試圖將基於串行的硬件設計推向N點。 即使MS買了NT軟件。 他們最近忘記了大部分的設計。 需要進行一些硬件更改。 需要有編程語言的變化(MS創建編程語言),Windows的Core需要重新設計。 沒有改變。 它需要回頭從頭開始。 祝你好運。 告訴你這個想法的想法是多麼的... VIVA La'Amiga。





multitasking