2013-03-30 27 views
1

我一直在試圖理解實現用戶空間線程的機制。我無法理解堆棧和幀的機制。我是來跨兩個解釋線程真正偉大的資源(herehere)以及它是如何實現的,但我還是不明白以下細節:瞭解線程是如何實現的

  1. 在線程的執行如何使用的機器上下文?我知道它包含一個堆棧指針和一堆寄存器值。但是操作系統如何使用它來執行線程?
  2. 爲什麼我們需要一個蹦牀功能(mctx_create_trampoline)?在鏈接#2中,他們設置了一個函數作爲信號處理程序來保存機器上下文並啓動線程函數(mctx_create_boot)。
  3. 基於這些函數如何實現線程可以調用的「yield」函數?另外,我們如何中斷正在運行的線程?我假設你有一個計時器和SIGALRM,當它關閉時調用一個信號處理程序。但是,如果yield函數切換上下文,那麼信號處理程序將不會返回,這將阻止進一步傳遞信號。

回答

0
  1. 一旦一個線程已被掀起的物理CPU的OS不再參與直到該時間片期滿或者一些其它重新調度需要發生上執行。所以關鍵的問題是:線程如何調度到物理CPU?那麼,操作系統將物理CPU寄存器設置爲適當的值並跳轉到線程最後被中斷的位置(這實際上設置了指令指針)。此時操作系統失去控制,不再參與其中。它只能在發生硬件中斷或某些其他物理CPU內核決定控制CPU時重新獲得控制權。
  2. 現在無法打開該文檔。
  3. 「yield」不能在用戶空間中實現。它通常是一個內核API,它選擇一些其他線程來調度並將其安排到當前CPU。