Linux中進程、線程和fork()

關於Linux中的線程,Linux採用了一種“偷懶”的方法,Linux沒有專門的線程對象,當需要建立一個線程時,實際上內核創建的是一個進程對象,也就是task_struct,只不過這個進程對象和父進程共享了大量資源,有時也稱爲輕權進程(LightWeight Process)。Linux建立進程和線程的接口也一致,比如都是fork(),而通過不同的參數來指定要建立的是進程還是線程調用fork()函數將返回兩次,一次是在父進程中,一次是在子進程中,這一定會讓大都數人疑惑。其實fork()就是把當前的進程對象task_struct複製一份,這樣在進程隊列中就多了一個進程對象,由於兩個進程相同,所以調度器調度到父進程時,返回一次,調度到子進程時,返回一次。

那麼fork()調用一次返回兩次的原理是什麼呢?這可通過do_fork()所調用的函數copy_thread()來回答。應用程序通過fork()系統調用進入內核空間,其內核態堆棧上保存着該進程的進程上下文(即該進程的各個寄存器),通過複製父進程的內核態堆棧上的進程上下文,同時將eax置爲0(如linux 1.2*childregs = *regs;  childregs->eax = 0;),而父進程通過do_fork()的返回值(return last_pid)來得到fork()的返回值。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章