Linux内存细分

内存四区图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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值