菜鸟笔记
提升您的技术认知

操作系统笔记

进程,线程,协程与并行,并发进程线程协程的区别死锁进程,线程,多线程i++的线程安全性同步和异步孤儿进程和僵尸进程/proc进程信息linux中的分段和分页互斥量 mutex线程进程间通信进程创建进程优先级进程的基础知识进程与线程的区别(面试题)线程的控制(创建,终止,等待,分离)可重入 VS 线程安全死锁的概念一级缓存和二级缓存的理解一句话解说内存屏障 Memory barrierbrk(), sbrk() 用法详解malloc/free函数的简单实现一文讲透 “进程、线程、协程”Linux进程状态线程池的陷阱linux内核学习之进程和线程进程与线程的区别和联系内存寻址linux IO子系统和文件系统读写流程Page cache和buffer cache的区别与联系漫谈linux文件IO多线程和多进程的区别内存泄漏字节、字、位、比特的概念和关系如何避免死锁ANSI是什么编码?CPU寻址范围(寻址空间)CPU 使用率低高负载的原因创建多少个线程合适操作系统下spinlock锁解析、模拟及损耗分析线程堆栈堆和栈的内存分配堆和栈的概念和区别堆和栈的区别,申请方式,程序的内存分配什么是 POD 数据类型Linux内存分配小结--malloc、brk、mmap系统调用与内存管理(sbrk、brk、mmap、munmap)进程描述和控制CPU执行程序的原理编译的基本概念Linux虚拟地址空间布局一个程序从源代码到可执行程序的过程程序的运行机制——CPU、内存、指令的那些事分页内存管理——虚拟地址到物理地址的转换深刻理解Linux进程间通信fork之后父子进程的内存关系fork之后,子进程继承了父进程哪些内容关于协程及其锁的一些认识对协程的一点理解std::thread join和detach区别CAS和ABA问题CAS算法锁和无锁无锁队列的实现Lock-Free 编程锁开销优化以及CAS

堆和栈的区别,申请方式,程序的内存分配

阅读 : 243

1.写在前面

注意,这里说的堆栈,和数据结构中的堆栈,不是一回事。这里的堆栈是存放程序部分数据的区域,不是在程序中由程序猿定义的数据结构。

2.C++程序内存占用分几个部分?

1.堆区:程序猿分配和释放,如果程序猿不释放,程序结束时,os自动回收。操作方式,类似于数据结构中的链表。

2.栈区:编辑器自动分配和释放。操作方式,类似于数据结构中的栈。

3.全局区(也叫静态区):声明全局变量时分配,程序结束自动释放。

4.文字常量区:声明常量时分配,程序结束自动释放。

5.程序代码区

3.这几部分都存储神马东西?

1.堆区:函数参数值、局部变量值

2.栈区:部分变量本身,而不是它们的值。//注意是部分,不是全部,这一点参考的他人博客

3.全局区:全局变量和静态变量。
其中初始化的全局变量和静态变量,放在一个区域。未初始化的全局变量和静态变量放在相邻的一个区域。

4.文字常量区:常量字符串

5.程序代码区:函数体的二进制代码

4.举例(别人写的例子)

#include<iostream>//引入c++的标准输入输出头文件
#include<stdlib.h>//malloc()的头文件
#include<cstring>//strcpy()的头文件
using namespace std;//使用标准命名空间

/*全局变量*/
int a=0;//全局,初始化区
char *p1;//全局,未初始化区

/*主函数*/
int main()
{
  
	int b;//栈,变量本身
	char arr[]="abc";//栈,
	char *p2;//栈,变量本身
	char *p3="123456";/*p3变量本身,栈
	                    123456\0,文字常量区*/
	static int c=0;//全局,初始化区。静态变量。
	p1=(char*)malloc(10);/*堆,malloc()从堆区分空间
				这也符合堆区要程序猿申请和释放的特点
				申请的空间为10字节*/
	strcpy(p1,"123456");/*让p1指向常量区,因为123456\0在常量区
			      p1本身在全局区*/
}

5.堆和栈的申请方式

5.1.堆的申请方式

程序猿手动申请

C语言,用malloc()

char *p1;
p=(char*)malloc(10);/*申请10个字节空间
		      在Windows中一个char占1个字节,即8位*/

C++语言,用new

int *p2=new int(10);/*申请10个int类型的空间
		     在Windows中一个int占4个字节,即32位*/

注意,p1和p2本身在栈中

5.2.栈的申请方式

系统或者说编辑器自动申请
int a;
自动在栈为变量a分配空间

6.申请后的响应

6.1.堆

操作系统有一个记录空闲内存地址的链表,
当系统收到程序猿的申请时,
遍历列表,
找到第一个空间大于“申请空间”的节点,
将这个节点从空闲链表里删除,
将该节点分配给程序,
在这块内存空间首地址处记录分配的大小,
如此,之后的delete()才能正确释放内存空间。

注意,这个节点的空间只要大于“申请空间”就行,不是等于申请空间。
多余的部分,系统自动放回空闲链表。

6.2.栈

只要栈的“剩余空间”大于“申请空间”,系统就能自动分配内存给相应的程序。
当“剩余空间”不够时,报错,提示栈溢出。

7.效率

系统自动分配效率高,程序猿申请效率低。