内存四区图PlusPlus
虚拟地址空间
假设当前有一个可执行程序app,./app执行此程序时,得到一个
进程
,每当启动一个进程,每个进程对应一个虚拟地址空间.
- 虚拟地址空间位置:
虚拟地址空间存储位置在磁盘,不在物理内存
linux物理内存结构图:
- 内核区
1.虚拟地址空间中最上边的一个G
2.内核区的数据对于用户来说不能读也不能写
3.一个操作系统内核只有一个多个虚拟地址空间共用同一块内核区 - 用户区
对于32位机来说, 虚拟地址空间地址: 0-3G
环境变量
给操作系统使用的全局变量
如何看所有的环境变量: 在shell下执行命令: env
命令行参数
应用程序启动的时候给应用程序传参
int main(int argc, char*argv[]);
栈区(比较小)
从高地址位开始分配内存资源
共享库加载区
动态库中的函数被调用的时候, 动态库被加载
堆区(这块区域比较大)
, 从低地址位到高地址位分配内存
全局数据区
.bss: 未初始化的全局变量
.data: 已初始化的全局变量
.text段
== 代码区
0-4K
: 受保护的区域, 空指针 NULL
文件描述符表
在内核中有一个进程进程管理的模块(进程控制块
PCB
) , 在内核中就是一段代码
进程控制块中有一个对文件进行管理的表(在代码中体现为一个数组)叫做文件描述符表
- 通过这个表就可以知道在当前文件中打开了哪些文件
- 每打开一磁盘文件, 就会在文件描述符表中记录一个数字(整形)
- 这个可以找到磁盘文件的整形数叫做
文件描述符
------相当于标准c的FILE*
文件描述符表的默认大小的
1024
, 这个值是可以修改的, 表示在当前进程中最大可以打开1024个文件
- 在这个文件描述符表中默认存储了三个值, 意味着已经有三个文件被打开了
- linux中一切皆文件, 这三个文件是设备文件, 代表终端
- 当前进程是在哪一个终端上启动的, 这个进程就和哪个终端默认关联到了一起
每个终端都有标准输入, 标准输出和标准错误 标准C(FILE*): Linux中 标准输入 stdin STDIN_FILENO == 0 标准输出 stdout STDOUT_FILENO == 1 标准错误 stderr STDERR_FILENO == 2