內存堆棧管理(Linux)

以問題形式講解

1.每一個進程都有一個堆空間嗎?還是多個進程共用一個堆空間?

在操作系統中,??每個進程都有自己獨立的虛擬地址空間,其中包括自己獨占的堆空間。堆空間是進程私有的,不與其他進程共享。

進程之間的內存在默認情況下不是共享的。

  • 堆是每個進程私有的??。進程A在堆上分配的內存,進程B無法直接訪問。
  • 如果進程A崩潰,不會影響進程B的堆內存(穩定性保障)。

但是可以有一種例外情況:共享內存。

若需要多個進程共享內存,必須通過??顯式創建的共享內存區域??實現,例如:

  1. ??System V共享內存(shmget)??
  2. ??POSIX共享內存(shm_open?+?mmap)??
  3. ??內存映射文件(mmap?+ 文件)??

這類共享內存??獨立于進程的私有堆空間??,是專門申請的區域。

補充一點:

內核空間部分??(例如Linux中高地址的0xC0000000以上區域)
??所有進程的虛擬內存映射指向同一物理內核區域??,內容完全相同。

但當進程進入內核態時(如系統調用、中斷):

  • ??每個進程有自己獨立的內核棧??(kernel stack)
  • 用于保存該進程在內核態執行的:
    • 函數調用鏈
    • 臨時變量
    • 系統調用參數

例如Linux中每個進程的task_struct都包含一個void *stack指針指向其獨有的內核棧(通常8KB大小)。

2.linux給每個進程分配8MB的棧空間大小。那如果有多個進程并發運行,但每個進程又沒有用到太多的棧空間,不會浪費內存嗎?

必須要明確的是這8MB的空間是虛擬內存不是物理內存。有虛擬內存和MMU存在就確保了即使有數百個進程并行運行,也不會造成顯著的物理內存浪費。

在 Linux 系統中,每個進程的??用戶棧空間默認被分配 8MB 的虛擬地址空間??,但這??并不等價于物理內存的實際占用??。設計上的關鍵點在于??按需分配的物理內存管理機制??,它確保了即使有數百個進程并行運行,也不會造成顯著的物理內存浪費。以下是詳細分析:


棧空間的本質:虛擬內存 vs 物理內存??

  • ??虛擬地址空間??:
    Linux 為每個進程預留 ??8MB 的虛擬地址范圍??(默認值,可通過?ulimit -s?調整)。這部分地址空間是??邏輯上預留的區間??,并不是實際內存。

  • ??物理內存分配??:
    操作系統通過??按需分頁(Demand Paging)?? 機制管理物理內存:

    • 只有當進程真正??訪問棧地址??時(例如壓入函數參數或局部變量),內核才會分配物理內存頁(通常每頁 4KB)。

    • 未使用的虛擬地址空間僅消耗??頁表條目??(約幾十字節),不占物理內存。

舉個例子:

假設系統運行 100 個并發進程,每個進程用戶棧虛擬大小為 8MB:

  • ??虛擬地址空間總量??:100 × 8MB = ??800 MB??(看似很大,但這是虛擬內存)。
  • ??物理內存實際占用??:
    • 若每個進程平均只使用 200 KB 棧空間(常見場景),物理內存占用為 100 × 200 KB = ??20 MB??。
    • 若進程棧使用更少(如 10 KB),則占用可低至 ??1 MB??。

只有 ??2.5% 的虛擬地址空間??(200 KB / 8MB)真正映射到物理內存。其余 97.5% 只是預留地址,不消耗物理資源。

3.一個進程中的函數A調用的函數B,執行函數B時會給函數B中的局部變量在棧中分配內存空間,那么當函數B執行完成后,這個棧空間會被回收嗎?

? ??邏輯回收是立即的??:函數返回時棧指針復位,空間可被后續函數重用
? ??物理回收是惰性的??:

  • 正常情況 → 由??后續函數調用覆蓋重用??
  • 無后續調用 → ??內核在內存壓力時回收??(可能延遲數十秒)
  • 極限情況 → ??進程退出時100%回收?

4.linux嵌入式在啟動時要初始化棧。這里的棧指的是內核進程的棧還是init進程的棧又或者是shell進程的棧?

在嵌入式 Linux 系統啟動過程中,棧的初始化是多層次的,??貫穿從硬件初始化到用戶空間的全過程??。

必然然初始化??:

  • Bootloader 棧:用于 U-Boot/CFE 等 bootloader 初始化硬件、加載內核
  • 內核臨時棧:內核解壓、早期內存管理初始化
  • 0 號進程(idle)內核棧:每個 CPU 核心一個,用于系統空閑時運行
  • 1 號進程(init)內核棧:承載 init 進程在內核態的操作
  • init 進程用戶棧:內核切換到用戶空間前,通過?execve()?系統調用加載 init 程序時創建

按需初始化??:

  • Shell 進程用戶棧(僅在啟用交互式 shell 時創建

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89517.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89517.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ThreatLabz 2025 年人工智能安全報告

AI 應用趨勢:爆發式增長與風險并存 2024 年,全球企業的 AI/ML 工具使用量呈指數級增長。Zscaler 云平臺數據顯示,2024 年 2 月至 12 月期間,AI/ML 交易總量達 5365 億次,同比激增 3464.6%,涉及 800 多個應…

【Oracle學習筆記】7.存儲過程(Stored Procedure)

Oracle中的存儲過程是一組為了完成特定功能而預先編譯并存儲在數據庫中的SQL語句和PL/SQL代碼塊。它可以接受參數、執行操作(如查詢、插入、更新、刪除數據等),并返回結果。以下從多個方面詳細講解: 1. 存儲過程的創建 創建存儲過…

tc工具-corrupt 比 delay/loss 更影響性能

1. netem corrupt 5% 的作用 功能說明 corrupt 5% 表示 隨機修改 5% 的數據包內容(如翻轉比特位),模擬數據損壞。它本身不會直接丟棄或延遲數據包,而是讓接收端收到錯誤的數據(可能觸發校驗和失敗、協議層重傳等&…

Flask YAML管理工具

項目概述 項目地址:https://github.com/KaiqiZing/Flask_Yaml_Demo 這是一個基于Flask開發的YAML文件管理工具,提供了完整的YAML文件查看、編輯、管理功能,具有現代化的Web界面和強大的編輯能力。 核心功能 1. 文件管理功能 目錄掃描&am…

Embedding模型微調實戰(ms-swift框架)

目錄 簡介 1. 創建虛擬環境 2 安裝ms-swift 3安裝其他依賴庫 4. 下載數據集 5.開始embedding模型訓練 6. 自定義數據格式和對應的Loss類型 (1) infoNCE損失 (2)余弦相似度損失 (3)對比學習損失 (4).在線對比學習損失 &#…

從性能優化賽到社區Committer,走進趙宇捷在Apache Fory的成長之路

Apache Fory 是一個基于JIT和零拷貝的高性能多語言序列化框架,實現了高效緊湊的序列化協議,提供極致的性能、壓縮率和易用性。在多語言序列化框架技術領域取得了重大突破,推動序列化技術步入高性能易用新篇章!這一切,都…

Python實例題:基于 Flask 的任務管理系統

目錄 Python實例題 題目 要求: 解題思路: 代碼實現: Python實例題 題目 基于 Flask 的任務管理系統 要求: 使用 Flask 框架構建一個任務管理系統,支持以下功能: 用戶認證(注冊、登錄、…

利用GPU加速TensorFlow

一、寫在前面 我們已經依靠keras和TensorFlow給大家做了一些機器學習在圖像處理中的應用(影像組學學習手冊,基于深度學習的圖像分類任務),此前的教程中我們沒有用GPU進行加速,但是相較于CPU而言,GPU是設計用于處理大規模并行計算任務的硬件&…

模型預測專題:強魯棒性DPCC

0 1 前言 在進行DPCC的學習過程中,于下面鏈接看到了一篇強魯棒性算法;感覺挺有意思的,學習一下。 永磁同步電機高性能控制算法(12)——基于預測電流誤差補償的強魯棒預測控制/參數辨識&有限集預測控制與連續集預…

修復opensuse 風滾草rabbitmq的Error: :plugins_dir_does_not_exist問題

https://wiki.archlinux.org/title/Talk:RabbitMQ 報錯 yqh192 /u/l/r/l/r/plugins> sudo rabbitmq-plugins enable rabbitmq_management Error: :plugins_dir_does_not_exist Arguments given:enable rabbitmq_managementUsagerabbitmq-plugins [--node <node>] [--…

前端做gis地圖有哪些庫

以下是前端開發GIS地圖常用的庫&#xff1a; Leaflet&#xff1a;輕量級、易于使用的開源JavaScript庫&#xff0c;具有豐富的地圖功能和插件生態系統&#xff0c;支持多種地圖數據源&#xff0c;適合初學者和專業開發者。其優勢在于簡潔性和易用性&#xff0c;代碼結構清晰&am…

賦能城市安全韌性|眾智鴻圖總裁扈震受邀出席智慧城市大會發表主題報告

——“眾智鴻圖作為城市基礎設施智能化綜合服務提供商&#xff0c;以地理信息科學、時空大數據、人工智能為核心能力&#xff0c;長期深耕于燃氣、供水、排水等城市基礎設施生命線領域及港口、園區等工業領域&#xff0c;致力于為城市穩定運行與高效發展提供堅實保障。” 2025年…

【大語言模型入門】—— 淺析LLM基座—Transformer原理

【大語言模型入門】—— 淺析LLM基座—Transformer原理 解密GPT核心技術&#xff1a;Transformer架構深度解析被反復強調的核心概念意味著什么&#xff1f; GPT預測機制解析&#xff1a;從Next Token Prediction到任務推理核心機制的本質案例驅動的機制解析解構策略&#xff1a…

Django打造智能Web機器人控制平臺

Django 實現 Web 機器人控制 以下是關于 Django 實現 Web 機器人控制管理的實例思路和關鍵代碼片段,涵蓋多個常見場景。由于篇幅限制,剩余的可通過類似模式擴展。 基礎機器人模型定義 # models.py from django.db import modelsclass Robot(models.Model):name = models.C…

周賽98補題

題目意思&#xff1a; 給定一個數字判斷加上自身任意因子數&#xff0c;是否能成為一個奇數。 思路&#xff1a; 我們想一個最簡單的判斷方法&#xff0c; 任意的數字的因子數都有1&#xff0c;故&#xff0c;最簡單的方法就是判斷奇偶。 奇數1成偶數&#xff0c;偶數1成奇…

【STM32】 STM32低功耗模式詳解:睡眠模式與喚醒機制【待測試】

本篇知識點基于F0講解 一、STM32三種低功耗模式參考表格 模式功耗喚醒時間保持狀態典型應用場景睡眠模式中等 (mA級)最短 (μs級)CPU停止&#xff0c;外設保持短暫待機&#xff0c;快速響應停止模式低 (μA級)中等 (ms級)RAM保持&#xff0c;時鐘停止長時間待機&#xff0c;電…

【Vue入門學習筆記】Vue核心語法

目錄 準備工作刪除不需要的代碼 模版語法文本插值使用JavaScript表達式無效寫法原始HTML 屬性綁定簡寫布爾型Attribute動態綁定多個值 準備工作 刪除不需要的代碼 刪除components下的文件 進入App.vue 刪掉代碼&#xff0c;只保留如下內容 <template></template&g…

ClickHouse 窗口分析 argMax() / argMin()

argMin() 是 ClickHouse 中一個非常有用的聚合函數&#xff0c;它可以找出某個列的最小值&#xff0c;并返回該最小值對應的另一個列的值 函數語法 argMin(arg, val) arg&#xff1a;要返回的列&#xff08;當找到最小值時返回該列的值&#xff09; val&#xff1a;用于比較的…

k8s client 通過KubeConfig和證書方式連接api server

一、背景 本文以kubePi這樣一個k8s客戶端為示例,使用證書方式,怎么連接k8s集群。 然后告訴你證書是如何生成的, 最后通過一個Python編程示例,在程序里如何使用。 api server地址:比如https://110.206.56.308:6443 Certificate:證書內容 Certificate Key:證書的私鑰 先…

(2025.07)解決——ubuntu20.04系統開機黑屏,左上角光標閃爍

前面一些碎碎念&#xff1a; 電腦裝的雙系統&#xff0c;之前都還好著&#xff0c;今天突然ubuntu開機的時候黑屏了&#xff0c;左上角有光標在閃爍&#xff0c;也查了一些資料&#xff0c;基本上大家的都是驅動有問題&#xff0c;還有內存問題。&#xff08;個人建議&#xff…