程序設計中對內存分配管理的思考,進程內存、線程內存、共享池、棧、堆

設計一個程序,要考慮如何分配和管理內存,以下是對所有內存分配和管理類型的總結。

第一、進程級的內存資源,也叫全局靜態內存,其生命周期是伴隨整個進程的運行期間,可以用作在進程范圍內共享數據的方法。對應于C語言的全局靜態變量,如 static int buf[10];

在多線程的情況下,假如每個線程并行運行時都會使用某個全局靜態變量,而又不希望受到其它線程的干擾,于是就產生了第二種線程級的內存資源。

第二、線程級的內存資源,其生命周期是伴隨一個線程的始末,每創建一個新的線程,這種類型的內存資源就會被創建一次,線程結束時,它也被銷毀。對應于C語言的線程級全局變量,如

static __thread int buf[MAX_ERROR_LEN];

第一種和第二種內存都存在的問題是,如果它們在整個進程或者線程的生命周期中被使用的頻率很低,但是卻占用了大量的內存,在線程的創建和結束時需要消耗較大的分配和銷毀工作量,那就不是很理想,針對內存需求量較大、使用頻率又較低的情況,產生了第三種內存。

第三、共享內存池,就是在進程的范圍內或者是整個操作系統的范圍內先分配一定數量的全局內存塊,供所有的線程共享使用,線程需要的時候申請一塊來用,結束以后將它歸還共享池。這跟線程使用malloc動態申請一塊內存有什么區別呢?區別在于,malloc分配的是固定數量的內存,而我們需要的內存往往是不確定的,不知道需要多少內存,我們需要一個動態的內存管理器,這通常是我們自己設計的一個內存管理器,比如我在上篇文章中設計的MemChain,共享內存池中就是這樣的動態內存分配管理器,能滿足任意數量內存的需求,不再需要我們額外考慮內存的分配。創建和銷毀一個MemChain往往要比申請一個已有的MemChain更耗時,所以我們采用共享池,而不是在線程中頻繁創建和銷毀MemChain.

還有最后兩種,就是我們最常用的棧內存和堆內存。

第四、棧內存,棧是一種線程內函數級的內存資源,其生命周期是一個函數的一次運行的始末,它的大小受到操作系統的限制,比如Ubuntu默認的棧容量是8M,我們在函數中使用的自動變量的總和不能超過棧的容量,因此,函數中使用的自動變量都是比較少量的內存,需要大內存時就需要從堆中獲取。

第五、堆內存,堆內存是不受任何限制的,系統有多少就可以用多少,直到耗盡內存為止,第三種內存就屬于堆內存,只是我們設計了一個共享池的機制來預先加載一部分堆內存,并用MemChain方便的管理和使用它。

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

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

相關文章

C#1.0-11.0所有歷史版本主要特性總結

文章目錄 前言名詞解釋主要版本一覽表各版本主要特性一句話總結 C# 1.0 (Visual Studio 2002, .Net Framework 1.0)C# 2.0 (Visual Studio 2005, .Net Framework 2.0)C# 3.0 (Visual Studio 2008, .Net Framework 3.0)C# 4.0 (Visual Studio 2010, .Net Framework 4)C# 5.0 (V…

Bigram 分詞學習

Bigram 分詞:概念、應用與中文實踐 Bigram 分詞是一種基礎而有效的文本處理技術,特別是在自然語言處理中有著廣泛的應用。本文將詳細解釋 Bigram 分詞的概念、它在各個領域的應用,以及在中文處理中的獨特優勢和實踐。 什么是 Bigram 分詞&a…

DataWhale - 吃瓜教程學習筆記(三)

學習視頻:第3章-對數幾率回歸_嗶哩嗶哩_bilibili 西瓜書對應章節: 3.3 對數幾率回歸 sigmoid函數 極大似然估計建模 信息論 以概率論、隨機過程為基本研究工具,研究廣義通信系統的整個過程 - 信息熵 (信息期望) 度…

Windows bat 提取多個目錄下的文件,到一個目錄

批處理命令 echo off setlocalrem 設置源目錄和目標目錄 set "sourceDirE:\motrix" set "targetDirE:\新建文件夾"rem 創建目標目錄,如果不存在 if not exist "%targetDir%" mkdir "%targetDir%"rem 循環遍歷源目錄中的所…

TCP:TCP連接的建立與終止

TCP連接的建立與終止 建立連接第一次握手第二次握手第三次握手 終止連接第一次揮手第二次揮手第三次揮手第四次揮手 T C P是一個面向連接的協議。無論哪一方向另一方發送數據之前,都必須先在雙方之間建立一條連接。本文將詳細討論一個T C P連接是如何建立的以及通信…

2024年能源電力行業CRM研究報告

中國能源電力行業屬于大制造業的重要組成部分,在國民經濟中的地位舉足輕重。據統計,近十年來能源電力行業的整體投資呈現出增長趨勢,尤其是“十四五”期間增長顯著,2022年全國主要電力企業共完成投資12470億元,同比增長…

STM32中掛在APB1(低速)和APB2(高速)上的外設

在STM32中, 連接在APB1(低速外設)上的設備有: 電源接口、備份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看門狗、Timer2、Timer3、Timer4 。 連接在APB2(高速外設)上的設備有: GPIO_A-E、USART1、ADC1、ADC2、ADC3、TIM1、TIM…

【樂吾樂2D可視化組態編輯器】連線

1 連線的繪制 1.1 鋼筆繪制連線 1.1.1 曲線、線段、直線、腦圖曲線 開始:單擊左鍵 暫停:單擊右鍵 或 enter 結束:esc 樂吾樂2D可視化組態編輯器demo:https://2d.le5le.com/ 1.1.2 橫線 按下快捷鍵shift,點擊鼠標左鍵繪制…

101.6k星的后臺巨擘:一站式SaaS多租戶、商城、CRM、ERP解決方案

RuoYi-Vue Pro,一個豐富優化重構的后臺管理系統,為企業提供了一個強大、靈活、易用的解-決方案。 特點 豐富的功能支持:包括RBAC動態權限、數據權限、SaaS多租戶、工作流、三方登錄、支付、短信等。 現代化的技術棧:基于Spring Boot、MyBatis Plus、Vue & Element,支持…

在UE中創建命名管道之創建UE藍圖類

需求 在實際工作遇到了需要 UE 開發進程間通信相關的需求。 經過思考后選擇使用命名管道來實現 。 名詞概念 首先什么是進程間通信: 進程間通信( Inter-Process Communication,IPC)是指在操作系統中,不同進程之間進行數據交換…

負載均衡的部署方式有什么?

負載均衡時建立在現有的網絡結構之上,將工作內容進行平衡、分攤到多個操作單位上進行運行,能夠提高網絡的可用性和靈活性,加強了網絡數據的處理能力。那負載均衡技術都有著哪些部署方式呢? 負載均衡有著三種部署方式,分…

大廠面試官問我:Redis內存淘汰,LRU維護整個隊列嗎?【后端八股文四:Redis內存淘汰策略八股文合集】

往期內容: 大廠面試官問我:Redis處理點贊,如果瞬時涌入大量用戶點贊(千萬級),應當如何進行處理?【后端八股文一:Redis點贊八股文合集】-CSDN博客 大廠面試官問我:布隆過濾…

精選:15款頂尖Python知識圖譜(關系網絡)繪制工具,數據分析的強力助手

知識圖譜(關系網絡)可以用簡單的形狀和線條顯示復雜的系統,幫助我們理解數據之間的聯系。我們今天將介紹15個很好用的免費工具,可以幫助我們繪制網絡圖。 NetworkX NetworkX是一個用于處理網絡的Python工具。許多人在Python中處…

模型選擇、過擬合與欠擬合

一、訓練誤差與泛華誤差 1、在訓練時,我們關心的是泛化誤差,也就是對新數據的預測 2、訓練誤差:模型在訓練數據上的誤差;泛化誤差:模型在新數據上的誤差 二、驗證數據集與測試數據集 1、驗證數據集:用于…

Percona Toolkit 神器全攻略(配置類)

Percona Toolkit 神器全攻略(配置類) Percona Toolkit 神器全攻略系列共八篇,前文回顧: 前文回顧Percona Toolkit 神器全攻略Percona Toolkit 神器全攻略(實用類) 全文約定:$為命令提示符、gr…

Spring Boot集成jsoup實現html解析

1.什么是jsoup jsoup 是一款 Java 的 HTML 解析器,可直接解析某個 URL 地址、HTML 文本內容。它提供了一套非常省力的 API,可通過 DOM,CSS 以及類似于 jQuery 的操作方法來取出和操作數據,可操作 HTML 元素、屬性、文本。 JSo…

函數內部結構分層淺析(從MVC分層架構聯想)

函數內部結構分層淺析(從MVC分層架構聯想) 分層架構:一種將軟件代碼按不同功能進行劃分的架構模式。 優點包括: 可維護性:各層職責明確,易于單獨修改維護。 可擴展性:方便添加或修改某一層,不…

優化Java應用的日志記錄方法

優化Java應用的日志記錄方法 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 引言 在開發和維護Java應用程序時,良好的日志記錄是確保應用穩定性和…

優化Java中網絡通信的性能策略

優化Java中網絡通信的性能策略 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 在現代軟件開發中,優化網絡通信的性能是確保應用程序高效運行的關鍵…

Rocketmq在單節點情況下新增從節點

Rocketmq在單節點情況下新增從節點 在docker-compose部署rocketmq單節點的基礎上,新增一個從節點 一,修改docker-compose配置文件 原docker-compose文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:server-4.5.2container_name: rm…