2017-08-11 22 views
0

在任何給定的時間段內是否有保證由線程執行的最小指令數量。 Execution Model的維基百科頁面說:「加法操作是許多語言中不可分割的工作單元」在給定的時隙內是否有線程執行的最小指令數量?

我想了解更多關於用於C/C++的POSIX線程的執行模型和最少數量的不可分割指令或語句保證在一個時隙內執行。有人可以給我一個指針,我可以從這裏瞭解更多。謝謝提前

+1

什麼問題是你想解決的,你認爲你的問題的答案會使你更接近解決方案? C++標準唯一保證的是「** [intro.multithread]/3 **實現應該確保所有未被阻止的線程最終取得進展。」 –

+0

不是你的問題的答案,而是:另外可能是一些機器上的某些情況下的一條指令,另外一條機器上可能有一條以上的指令。如果要添加兩個相同大小的寄存器並將結果放回到一個相同大小的寄存器中,那麼它可能只是一條指令,而在沒有指令流水線的機器上,它可能會是一個週期。但是如果你需要讀取內存中的值 - 幾乎總是需要一個以上的週期。如果寄存器的大小不一樣,那麼處理器可能必須執行讀 - 修改 - 寫,這絕對是不可分的。 –

+0

我從來沒有考慮過寫多線程應用程序,因爲它似乎大多不相關,但我想答案是'一個機器指令'。將一個線程設置爲在內核上運行並且幾乎立即被中斷,並被一個在某些I/O中斷或線程間信號上已準備就緒的高優先級線程搶佔並非不合理。 –

回答

3

不,每次都沒有關於指令數量的保證。無論如何,執行工作的方式比執行一系列指令要複雜得多。

執行指令更多取決於處理器架構而非語言。在許多入門設計課程中教授的「傳統」MIPS架構將在每個時鐘週期執行一條指令;一個以1MHz運行的處理器將每秒執行一百萬次操作。真實世界的處理器使用諸如流水線,分支預測,「超線程」等技術,並且在每個時鐘週期內沒有設定數量的操作。

除此之外,真實世界的處理器通常會在具有多任務功能的操作系統下運行。這意味着一個線程可以被內核在未知點中斷,並且根本不執行任何代碼,因爲其他線程被給予處理器時間。有「實時」操作系統,旨在爲執行處理器上運行的代碼需要多長時間提供更多保證。

您已經對維基百科進行了一些研究;上面的一些關鍵詞應該有助於追蹤更多關於這個主題的文章,並且從那裏你應該能夠找到大量的主要來源來了解更多關於這個主題的內容。

+0

在沒有最小指令數的情況下,如果兩個線程調用pthread_lock()如何保證特定線程在另一個線程之前成功鎖定。這個機制如何運作? – Dinesh

+0

有像TSL(測試集鎖)那樣的「原子」處理器指令。這些指令執行比較並將結果存儲在單個指令中,並用於通過操作系統實現鎖定。舉個例子,兩個線程每個都試圖獲得鎖,並且作爲該操作的一部分使用TSL指令。 TSL指令成功執行的第一個線程獲取該鎖;執行該指令的第二個線程將會失敗並進入鎖的等待狀態。 – wmorrell

1

在POSIX線程中,有兩個主要調度策略(FIFO和循環)。 Round Robin是默認的調度程序,因爲它更公平。當使用RR調度程序時,每個線程都有一定的時間(AKA量程)運行,所以不能保證執行X個指令 - 除非我們知道每條指令需要多少時間。

你可以找到更多有關的調度算法的並行線程在這裏:http://maxim.int.ru/bookshelf/PthreadsProgram/htm/r_37.html

只給在Linux上如何定義的一輪又一輪的量子一個想法:

/* 
* default timeslice is 100 msecs (used only for SCHED_RR tasks). 
* Timeslices get refilled after they expire. 
*/ 
#define RR_TIMESLICE  (100 * HZ/1000) 

#endif /* _LINUX_SCHED_RT_H */ 
相關問題