2016-03-13 29 views

回答

2

當你調用fork(),並創建一個孩子,在調用fork前母公司所有打開的描述符共享父母和孩子之間。例如,在父級中的套接字,並說父級調用accept,然後調用fork。父母和孩子之間共享連接的套接字。通常,孩子讀寫連接的套接字,然後父節點關閉連接的套接字。

在傳統的UNIX模型中,當父進程需要由另一個實體執行的某些操作時,它會分叉一個子進程並讓子進程執行處理。在這一模式曾好多年也有問題,以及:

  1. 昂貴。內存從父項複製到子項,所有描述符在子項中重複,等等。最近幾天進行了一些優化,其中複製寫入,其避免了複製直到孩子需要它自己的副本。

  2. 雖然從父母到孩子傳遞信息很容易,但相反需要一些工作。並且爲了實現傳遞信息IPC(相互過程通信)是必需的。

所以LINUX引入了clone()。 clone()允許子進程與調用進程共享部分執行上下文,如內存空間,文件描述符表和信號處理程序表。

然後是線程。他們也被稱爲輕量級工藝。根據您的猜測,創建線程比創建進程快10-100倍。進程內的所有線程共享相同的全局內存。這使線程之間的信息共享變得容易,但隨之而來的是同步訪問的要求。

綜上所述,所有線程共享如下:

  • 進程信息
  • 大多數數據
  • 打開文件(如描述符)
  • 信號處理函數
  • 當前工作目錄
  • 用戶和組IDs

但是每個線程都有自己:

  • 線程ID
  • 組寄存器
  • 堆棧的局部變量和返回地址
  • 錯誤號
  • 信號屏蔽
  • 優先
相關問題