<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 設(shè)計(jì)應(yīng)用 > 圖解|一個(gè)進(jìn)程最多可以創(chuàng)建多少個(gè)線程?

          圖解|一個(gè)進(jìn)程最多可以創(chuàng)建多少個(gè)線程?

          作者: 時(shí)間:2023-12-21 來源: 收藏

          前言

          本文引用地址:http://www.ex-cimer.com/article/202312/454173.htm

          640.png

          linux 知識(shí)回顧

          空間長啥樣

          操作系統(tǒng)中,虛擬地址空間的內(nèi)部又被分為內(nèi)核空間和用戶空間兩部分,不同位數(shù)的系統(tǒng),地址空間的范圍也不同。比如最常見的 32 位和 64 位系統(tǒng),如下所示:

          640-2.png

          通過這里可以看出:32 位系統(tǒng)的內(nèi)核空間占用 1G,位于最高處,剩下的 3G 是用戶空間;64 位系統(tǒng)的內(nèi)核空間和用戶空間都是 128T,分別占據(jù)整個(gè)內(nèi)存空間的最高和最低處,剩下的中間部分是未定義的。

          32 位空間

          640-3.png

          通過這張圖你可以看到,用戶空間內(nèi)存,從低到高分別是 6 種不同的內(nèi)存段:

          0x0000 0000 到 0x0804 8000 這段虛擬內(nèi)存地址是一段不可訪問的保留區(qū),因?yàn)樵诖蠖鄶?shù)操作系統(tǒng)中,數(shù)值比較小的地址通常被認(rèn)為不是一個(gè)合法的地址,這塊小地址是不允許訪問的。比如在 C 語言中我們通常會(huì)將一些無效的指針設(shè)置為 NULL,指向這塊不允許訪問的地址。

          · 代碼段,包括二進(jìn)制可執(zhí)行代碼;

          · 數(shù)據(jù)段,包括已初始化的靜態(tài)常量和全局變量;

          · BSS 段,包括未初始化的靜態(tài)變量和全局變量;

          · 堆段,包括動(dòng)態(tài)分配的內(nèi)存,從低地址開始向上增長;

          堆空間的上邊是一段待分配區(qū)域,用于擴(kuò)展堆空間的使用

          · 文件映射段,包括動(dòng)態(tài)庫、共享內(nèi)存等,從低地址開始向上增長;

          · 棧段,包括局部變量和函數(shù)調(diào)用的上下文等。棧的大小是固定的,一般是 8 MB。當(dāng)然系統(tǒng)也提供了參數(shù),以便我們自定義大小;

          在上面的內(nèi)存段中,堆和文件映射段的內(nèi)存是動(dòng)態(tài)分配的。比如說,使用 C 標(biāo)準(zhǔn)庫的 malloc() 或者 mmap() ,就可以分別在堆和文件映射段動(dòng)態(tài)分配內(nèi)存。

          64 位虛擬內(nèi)存空間

          我們知道在 32 位機(jī)器上,指針的尋址范圍為 2^32,所能表達(dá)的虛擬內(nèi)存空間為 4 GB。

          那么我們可能會(huì)認(rèn)為在 64 位機(jī)器上,指針的尋址范圍為 2^64,所能表達(dá)的虛擬內(nèi)存空間為 16 EB 。虛擬內(nèi)存地址范圍為:0x0000 0000 0000 0000 0000 - 0xFFFF FFFF FFFF FFFF 。

          事實(shí)上在目前的 64 位系統(tǒng)下只使用了 48 位來描述虛擬內(nèi)存空間,尋址范圍為 2^48 ,所能表達(dá)的虛擬內(nèi)存空間為 256TB。

          640-4.png

          從上圖中我們可以看出 64 位系統(tǒng)中的虛擬內(nèi)存布局和 32 位系統(tǒng)中的虛擬內(nèi)存布局大體上是差不多的。

          創(chuàng)建一個(gè)需要消耗多大虛擬內(nèi)存

          前面我們也介紹了棧段,包括局部變量和函數(shù)調(diào)用的上下文等。棧的大小是固定的,一般是 8 MB。當(dāng)然系統(tǒng)也提供了參數(shù),以便我們自定義大?。?/span>

          現(xiàn)在我們來驗(yàn)證一下,執(zhí)行 ulimit -a 這條命令,查看創(chuàng)建時(shí)默認(rèn)分配的??臻g大小

          640-6.jpeg

          影響一個(gè)可創(chuàng)建多少的條件

          的虛擬內(nèi)存空間上限,因?yàn)閯?chuàng)建一個(gè)線程,操作系統(tǒng)需要為其分配一個(gè)棧空間,如果線程數(shù)量越多,所需的??臻g就要越大,那么虛擬內(nèi)存就會(huì)占用的越多。

          系統(tǒng)參數(shù)限制,雖然 并沒有內(nèi)核參數(shù)來控制單個(gè)進(jìn)程創(chuàng)建的最大線程個(gè)數(shù),但是有系統(tǒng)級(jí)別的參數(shù)來控制整個(gè)系統(tǒng)的最大線程個(gè)數(shù)。

          虛擬內(nèi)存空間上限

          32位系統(tǒng)

          在 32 位 系統(tǒng)里,一個(gè)進(jìn)程的虛擬空間是 4G,內(nèi)核分走了1G,用戶能用的只有 3G。

          創(chuàng)建一個(gè)線程需要占用 8M 虛擬內(nèi)存,總共有 3G 虛擬內(nèi)存可以使用。于是我們可以算出,最多可以創(chuàng)建差不多 380個(gè)(3G/8M)左右的線程。

          如果想使得進(jìn)程創(chuàng)建上千個(gè)線程,那么我們可以調(diào)整創(chuàng)建線程時(shí)分配的棧空間大小,比如調(diào)整為 512k:

          [ecs-user@iZ2ze923utbhhwxwgc0pd9Z ~]$ ulimit -s 512

          64 位系統(tǒng)

          64 位系統(tǒng)意味著用戶空間的虛擬內(nèi)存最大值是 128T,這個(gè)數(shù)值是很大的,一個(gè)線程需占用 8M ??臻g的情況來算,那么理論上可以創(chuàng)建 128T/8M 個(gè)線程,也就是 1000多萬個(gè)線程,有點(diǎn)魔幻!

          所以按 64 位系統(tǒng)的虛擬內(nèi)存大小,理論上可以創(chuàng)建無數(shù)個(gè)線程。

          系統(tǒng)參數(shù)限制

          前面學(xué)習(xí)我們了解到了64 位系統(tǒng)的虛擬內(nèi)存大小,理論上可以創(chuàng)建無數(shù)個(gè)線程。不過事實(shí)上,肯定創(chuàng)建不了那么多線程,除了虛擬內(nèi)存的限制,還有系統(tǒng)的限制。

          比如下面這三個(gè)內(nèi)核參數(shù)的大小,都會(huì)影響創(chuàng)建線程的上限:

          · proc/sys/kernel/threads-max,表示系統(tǒng)支持的最大線程數(shù),默認(rèn)值是 14553;

          · /proc/sys/kernel/pid_max,表示系統(tǒng)全局的 PID 號(hào)數(shù)值的限制,每一個(gè)進(jìn)程或線程都有 ID,ID 的值超過這個(gè)數(shù),進(jìn)程或線程就會(huì)創(chuàng)建失敗,默認(rèn)值是 32768;

          · /proc/sys/vm/max_map_count,表示限制一個(gè)進(jìn)程可以擁有的VMA(虛擬內(nèi)存區(qū)域)的數(shù)量,具體什么意思我也沒搞清楚,反正如果它的值很小,也會(huì)導(dǎo)致創(chuàng)建線程失敗,默認(rèn)值是 65530。

          總結(jié)

          32 位系統(tǒng),用戶態(tài)的虛擬空間只有 3G,默認(rèn)創(chuàng)建線程時(shí)分配的??臻g是 8M,那么一個(gè)進(jìn)程最多只能創(chuàng)建 380 個(gè)左右的線程。

          64 位系統(tǒng),用戶態(tài)的虛擬空間大到有 128T,理論上不會(huì)受虛擬內(nèi)存大小的限制,而會(huì)受系統(tǒng)的參數(shù)或性能限制。



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();