3 回答

TA貢獻1875條經驗 獲得超3個贊
Linux使用1-1線程模型,(對內核)沒有進程和線程之間的區別 - 一切都只是一個可運行的任務。*
在Linux上,系統調用clone
克隆任務,具有可配置的共享級別,其中包括:
CLONE_FILES
:共享相同的文件描述符表(而不是創建副本)CLONE_PARENT
:不要在新任務和舊任務之間建立父子關系(否則,孩子的getppid()
=父母的getpid()
)CLONE_VM
:共享相同的內存空間(而不是創建COW副本)
fork()
呼叫clone(
最少共享)
和pthread_create()
呼叫clone(
大多數共享)
。**
fork
pthread_create
由于復制表和為內存創建COW映射,成本只是一點點,但Linux內核開發人員已經嘗試(并成功)降低了這些成本。
如果任務共享相同的內存空間和各種表,則在任務之間切換比不共享任務要便宜一點,因為數據可能已經加載到緩存中。但是,即使沒有共享任何內容,切換任務仍然非???- 這是Linux內核開發人員試圖確保(并成功確保)的其他內容。
實際上,如果您使用的是多處理器系統,則不共享可能實際上對性能有益:如果每個任務在不同的處理器上運行,則同步共享內存非常昂貴。
*簡化。 CLONE_THREAD
導致信號傳遞被共享(需要CLONE_SIGHAND
,共享信號處理程序表)。
**簡化。存在兩個SYS_fork
和SYS_clone
系統調用,但在內核中,sys_fork
并且sys_clone
它們都是圍繞同一do_fork
函數的非常薄的包裝器,它本身就是一個薄的包裝器copy_process
。是的,術語process
,thread
以及task
相當互換使用Linux內核...
- 3 回答
- 0 關注
- 658 瀏覽
添加回答
舉報