成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個進程最多可以創建多少個線程?

系統 其他OS
32 位系統,用戶態的虛擬空間只有 3G,默認創建線程時分配的棧空間是 8M,那么一個進程最多只能創建 380 個左右的線程。64 位系統,用戶態的虛擬空間大到有 128T,理論上不會受虛擬內存大小的限制,而會受系統的參數或性能限制。?

前言

話不多說,先來張腦圖~

linux 虛擬內存知識回顧

虛擬內存空間長啥樣

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

通過這里可以看出:

  • 32 位系統的內核空間占用 1G,位于最高處,剩下的 3G 是用戶空間;
  • 64 位系統的內核空間和用戶空間都是 128T,分別占據整個內存空間的最高和最低處,剩下的中間部分是未定義的。

32 位虛擬內存空間

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

  • 0x0000 0000 到 0x0804 8000 這段虛擬內存地址是一段不可訪問的保留區,因為在大多數操作系統中,數值比較小的地址通常被認為不是一個合法的地址,這塊小地址是不允許訪問的。比如在 C 語言中我們通常會將一些無效的指針設置為 NULL,指向這塊不允許訪問的地址。
  • 代碼段,包括二進制可執行代碼;
  • 數據段,包括已初始化的靜態常量和全局變量;
  • BSS 段,包括未初始化的靜態變量和全局變量;
  • 堆段,包括動態分配的內存,從低地址開始向上增長;
  • 堆空間的上邊是一段待分配區域,用于擴展堆空間的使用
  • 文件映射段,包括動態庫、共享內存等,從低地址開始向上增長
  • 棧段,包括局部變量和函數調用的上下文等。棧的大小是固定的,一般是 8 MB。當然系統也提供了參數,以便我們自定義大小;

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

64 位虛擬內存空間

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

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

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

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

創建一個線程需要消耗多大虛擬內存

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

現在我們來驗證一下,執行 ulimit -a 這條命令,查看進程創建線程時默認分配的棧空間大小

影響一個進程可創建多少線程的條件

  • 進程的虛擬內存空間上限,因為創建一個線程,操作系統需要為其分配一個棧空間,如果線程數量越多,所需的棧空間就要越大,那么虛擬內存就會占用的越多。
  • 系統參數限制,雖然 Linux 并沒有內核參數來控制單個進程創建的最大線程個數,但是有系統級別的參數來控制整個系統的最大線程個數。

虛擬內存空間上限

32位系統

在 32 位 Linux 系統里,一個進程的虛擬空間是 4G,內核分走了1G,用戶能用的只有 3G。

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

如果想使得進程創建上千個線程,那么我們可以調整創建線程時分配的棧空間大小,比如調整為 512k:

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

64位系統

64 位系統意味著用戶空間的虛擬內存最大值是 128T,這個數值是很大的,一個線程需占用 8M 棧空間的情況來算,那么理論上可以創建 128T/8M 個線程,也就是 1000多萬個線程,有點魔幻!

所以按 64 位系統的虛擬內存大小,理論上可以創建無數個線程。

系統參數限制

前面學習我們了解到了64 位系統的虛擬內存大小,理論上可以創建無數個線程。不過事實上,肯定創建不了那么多線程,除了虛擬內存的限制,還有系統的限制。

比如下面這三個內核參數的大小,都會影響創建線程的上限:

  • /proc/sys/kernel/threads-max,表示系統支持的最大線程數,默認值是 14553;
  • /proc/sys/kernel/pid_max,表示系統全局的 PID 號數值的限制,每一個進程或線程都有 ID,ID 的值超過這個數,進程或線程就會創建失敗,默認值是 32768;
  • /proc/sys/vm/max_map_count,表示限制一個進程可以擁有的VMA(虛擬內存區域)的數量,具體什么意思我也沒搞清楚,反正如果它的值很小,也會導致創建線程失敗,默認值是 65530。

總結

最后簡單總結下:

  • 32 位系統,用戶態的虛擬空間只有 3G,默認創建線程時分配的棧空間是 8M,那么一個進程最多只能創建 380 個左右的線程。
  • 64 位系統,用戶態的虛擬空間大到有 128T,理論上不會受虛擬內存大小的限制,而會受系統的參數或性能限制。
責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-09-26 16:44:14

光模塊

2019-12-20 09:31:23

TCPHTTP瀏覽器

2019-05-29 15:17:43

TCPHTTPSSL

2020-08-04 16:56:50

Java方法參數

2021-03-29 08:47:24

線程面試官線程池

2020-06-16 11:00:40

線程Java代碼

2022-03-08 22:21:55

網絡包隊列網卡

2021-01-04 07:22:28

Linux服務器TCP

2019-11-14 16:05:29

TCPHTTP前端

2013-04-25 09:55:21

進程線程

2018-06-05 15:41:22

進程線程協程

2018-03-09 12:14:36

Linux服務器負載

2019-07-09 06:13:09

TCPHTTP網絡協議

2020-11-11 10:10:20

調用函數參數變量

2019-09-18 15:09:50

進程線程操作系統

2025-05-27 02:10:00

2025-01-26 09:35:45

2019-01-02 16:31:33

程序員技術互聯網

2023-07-03 07:27:41

進程線程Win32

2020-11-10 07:13:44

端口號進程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美成人一区二区三区 | 国产美女黄色 | 国产久 | 久久成人精品视频 | 99久久精品国产一区二区三区 | 91精品国产一二三 | 免费精品久久久久久中文字幕 | 国产精品综合色区在线观看 | 精品国产一区二区三区成人影院 | 国产在线一区二区 | 国产亚洲精品久久久久动 | 日本涩涩网 | 中文一区二区 | 欧美日韩在线免费 | 国产精品一区二 | 日韩av在线免费 | 色综合99| 成人精品国产一区二区4080 | 99re视频在线 | 99热.com| 久久国产成人午夜av影院武则天 | 黄色网址在线播放 | 日韩视频国产 | 亚洲aⅴ| 黄网站涩免费蜜桃网站 | 自拍偷拍小视频 | 国产亚洲一级 | 久久久久久国产 | 在线国产视频观看 | 久久99精品国产99久久6男男 | 欧美一级片免费看 | 欧洲色综合 | 黄色亚洲网站 | 久久久久国产一区二区三区 | 精品1区 | 久久999| 91精品国产777在线观看 | 国产欧美精品一区二区 | 国产xxxx搡xxxxx搡麻豆 | 国产高清在线精品 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 |