<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

前言

本文引用地址:http://dyxdggzs.com/article/202312/454173.htm

640.png

linux 知識回顧

空間長(cháng)啥樣

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

640-2.png

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

32 位空間

640-3.png

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

0x0000 0000 到 0x0804 8000 這段虛擬內存地址是一段不可訪(fǎng)問(wèn)的保留區,因為在大多數操作系統中,數值比較小的地址通常被認為不是一個(gè)合法的地址,這塊小地址是不允許訪(fǎng)問(wèn)的。比如在 C 語(yǔ)言中我們通常會(huì )將一些無(wú)效的指針設置為 NULL,指向這塊不允許訪(fǎng)問(wèn)的地址。

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

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

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

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

堆空間的上邊是一段待分配區域,用于擴展堆空間的使用

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

· 棧段,包括局部變量和函數調用的上下文等。棧的大小是固定的,一般是 8 MB。當然系統也提供了參數,以便我們自定義大??;

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

64 位虛擬內存空間

我們知道在 32 位機器上,指針的尋址范圍為 2^32,所能表達的虛擬內存空間為 4 GB。

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

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

640-4.png

從上圖中我們可以看出 64 位系統中的虛擬內存布局和 32 位系統中的虛擬內存布局大體上是差不多的。

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

前面我們也介紹了棧段,包括局部變量和函數調用的上下文等。棧的大小是固定的,一般是 8 MB。當然系統也提供了參數,以便我們自定義大??;

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

640-6.jpeg

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

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

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

虛擬內存空間上限

32位系統

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

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

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

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

64 位系統

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

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

系統參數限制

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

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

· proc/sys/kernel/threads-max,表示系統支持的最大線(xiàn)程數,默認值是 14553;

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

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

總結

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

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



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>