2011-06-18 62 views
2

我正在研究編寫userland threading library,因爲在這個區域似乎沒有活動的工作,我相信C++ 0x promises and futures可能會給這個模型一些權力。不幸的是,爲了使這個模型起作用,確保上下文切換阻塞調用是非常重要的。因此,我想攔截每個系統調用,以便用異步版本替換它。有一些注意事項:在Linux 2.6+中替換系統調用(syscalls)

  • 我知道幾乎每個常規系統調用都有異步系統調用,但出於向後兼容性的原因,這不是一個可行的解決方案。
  • 我知道,在Linux 2.4或更早版本中,可以直接更改sys_call_table,但這已經消失。
  • 正如我希望我的庫是靜態鏈接,如果需要,LD_PRELOAD技巧是不可行的。
  • 同樣,內核模塊不是一個選項,因爲這應該是一個用戶級庫。
  • 最後,由於類似的原因,ptrace()也不是一個選項。我不能讓我的圖書館爲了使用而創建新的流程。

這可能嗎?

+0

在我看來,這似乎與系統調用沒多大關係,但通常是鏈接機制。正如通常沒有人在彙編代碼中調用系統調用一樣,您只是想在鏈接時用自己的代替一些常規函數。 –

+0

你知道嗎,我想知道一個過程是否有可能爲了做到這一點而「自行追蹤」?即使不是這樣,你也可以考慮如何攔截系統調用。 – Omnifarious

回答

1

我期待到寫用戶級線程庫,因爲似乎在這方面沒有積極的工作

你可能想看看線程庫Marcel(及其publications )和MPC,它們實現了混合(內核用戶級別)線程,主要用於高性能計算的目的,所以他們不得不爲這個阻塞系統調用找到一些解決方案。

從而避免內核線程阻塞時,應用 使得攔截系統調用,馬塞爾使用調度的激活時 它們可用,或者只是在攔截動態 符號級這樣的阻塞調用。

+0

我已經看過馬塞爾了,但不幸的是,它的許可證與我正在做的事情不兼容。此外,你發佈的內容表明他們正在使用LD_PRELOAD技巧和/或使用共享庫。儘管如此,馬塞爾看起來很甜蜜,所以希望其他人對我的要求不會那麼嚴格。 – tgoodhart