2011-11-07 37 views
5

所以我知道我可以使用setrlimit和朋友增加Linux進程的線程數。根據this,線程數的理論限制是由內存決定的(大約100,000k)。對於我的用途,我正在研究使用FIFO scheduler的協作風格,所以虛假的上下文切換不是一個問題。我知道我可以將活動線程的數量限制爲內核數量。我的問題是線程數量的實際限制是什麼,之後調度器中的假設開始顯現。如果我保持一個真正的合作風格是額外的線程「免費」?任何案例研究或實例都會特別有趣。Linux協作框架中線程數量的實際限制

Apache服務器似乎是這種情況下最類似的方案。有沒有人有任何數字與他們已經看到Apache產生無用之前有多少線程?

Related,但與Windows有關,先佔代碼。

+1

你可能會發現下面的文章有趣,http://drdobbs.com/open-source/184406204。其中,關於高端機器上1M併發線程的模糊聲明。 – Kevin

+0

@凱文給了我希望。特別有趣的是,測試是爲了支持O(1)調度程序而完成的,後者已被替換。 – tgoodhart

+0

@Kevin Paper有問題:http://www.redhat.com/whitepapers/.../POSIX_Linux_Threading.pdf – tgoodhart

回答

2

相信線程的數量由可用內存的限制

  1. (每個線程需要至少幾頁,而且往往很多人,特別是對於它的堆棧和線程本地存儲)。請參閱pthread_attr_setstacksize函數來調整。線程每個兆字節的堆棧空間並不少見。

  2. 至少在Linux(NPTL即當前的Glibc)和其他系統中,其中用戶線程與內核線程相同,但是內核可以調度的任務數量。

我猜想在大多數Linux系統上,第二個限制比第一個更強。內核線程(在Linux上)通過clone(2) Linux system call創建。在舊的Unix或Linux內核中,任務的數量是硬連線的。今天它可能是可調的,但我想它是在成千上萬,而不是數百萬!

而你應該考慮編碼Go language,它的goroutines是你夢寐以求的羽毛光線。

如果你想要很多協作線程,你可以看看Chicken Scheme實現技巧。

+0

啊,去吧,這不會很好。 Lua擁有一流的協同程序,這也會使這更容易。我想要的是一個乾淨的堆棧框架,用於調試。持續傳遞或消息傳遞很好,但它們傾向於擦除事件序列,或者至少使調試序列變得困難。如果我可以使用大量的線程,比使用getcontext/makecontext和編寫一個窮人的協作線程庫要容易得多。 – tgoodhart

+0

我不明白爲什麼你想要一個乾淨的堆棧框架(爲什麼它有助於調試?清除每個本地就足夠了,Java自動完成)。 –

+0

詞語選擇不當。一個「乾淨的」堆棧框架,意思是堆棧會精確地告訴我如何得到代碼中的給定點,與工作隊列相比,它只會告訴我如何得到一段特定的代碼,因爲它是從隊列中彈出,並且可能無法指示它被推送的位置,特別是如果它可以從多個站點推送。 – tgoodhart