操作系統時間調度基本單位是內核線程還是進程?

CPU的調度是對進程進行調度的還是對內核線程進行調度的?還是不同的操作系統的實現不同?


進程是系統許可權的集合。

線程是 CPU 調度的最小單位。


建議放棄,不要拉起這個主題。

線程和進程是兩個相對獨立的概念,線程更多是對執行序列的抽象,進程更多是運行空間的抽象,它們是交叉的,按OS實現的方便,有時可以切換執行序列而不切換運行空間(例如Linux的進程內線程切換),有時可以切換運行空間而不切換執行序列(例如QNX的快速中斷處理,這個例子不是非常好,但我們如果把切換特權級也認為是空間的變化,也算是可以類比了)

所以,在OS這個抽象空間內討論這個問題,不會有明確答案,你不如老實討論具體特定情形下遇到的困難。


依照具體實現不同而不同,就 OS X 來說,操作系統調度的是線程而非進程,OS X 內核 Mach 中是沒有 Proc 這個概念的,只有 Thread。但是 Mach 用有一個用與影射 BSD 層 Proc 的結構,叫做 Task,但 Task 只是一個邏輯上的資源容器,並非調度對象。Mach 調度的唯一對象就是線程,


取決於具體實現。比如Linux內部是任務,如果任務間共享內存就是線程,否則就是進程。


樓主應該是OS初學者,建議不要再去搬弄進程和線程的概念,太抽象,甚至在不同系統完全不是一回事,更別提內核線程了,你還沒說用戶線程呢。

想充分理解OS對任務執行的抽象和調度,建議以一種系統為主,閱讀參考書和源碼,盡量不要讀那些搬弄概念的國內教材,那都是玄學。


我只是個許久以前讀過Linux kernel scheduler源碼的仍然無知的青年…然後許久以前也曾有過跟題主類似的疑問:調度器是把進程和線程並列?還是讓線程列於進程之下?

我的動機是,當我需要考慮兩個線程是否在同一時間被CPU調度起來,以及,我會不會因為創建了更多的線程/進程 而獲得更多的CPU資源時,我需要關心題主所提的這個問題。

據Linux源碼,scheduler調度的時候是根據PID來動的。PID=process ID。我的推測是:在Kernel空間作調度的時候,只有process的概念。線程在這個時候被「偽裝」成了進程。

因為懶,沒有自己去找文獻調查,而是找lecturer 求證了一下,他說在Linux背景下,是對的。

之後我自己的多線程/進程的代碼實踐中,並沒有觀察到違背我這一猜想的現象,所以我至今認為它是對的。


不同操作系統實現不同,有的操作系統本身就支持多線程,有的操作系統不支持多線程,多線程的實現是通過一個函數庫來實現的,這樣的操作系統CPU就是對進程進行調度的


Linux的話參見:

http://stackoverflow.com/questions/15601155/does-linux-schedule-a-process-or-a-thread

下面是我自己實驗的,看看實際系統上的情況比較直觀:

syslog(pid 552)是一個多線程的進程。然後進到/proc裡邊看task目錄也可以看到他的線程

結果就是調度單位是線程(與task一個意思)。


內核線程和線程應該不是一個概念吧


時間調度單位是tick和時間片,調度演算法經過一定tick時根據當前各個線程的狀態來調度執行哪個線程。


推薦閱讀:

非同步,多線程和並行的區別?
對於單核cpu而言,開多線程的目的難倒只能是為了防止阻塞么?
linux:多線程進程比單線程進程的性能要差?
多線程無並發用到共享資源,還需要加鎖嗎?

TAG:操作系統 | 多線程 |