Linux:文件描述符介绍
文章目录速览
- 1、虚拟地址空间
- (1)What(什么是虚拟地址空间)
- (2)Why(为什么需要虚拟地址空间)
- 2、文件描述符
- (1)What(什么是文件描述符)
- (2)文件描述符表
1、虚拟地址空间
(1)What(什么是虚拟地址空间)
它是用于CPU和物理内存之间的一个中间层,每一个进程都拥有独立的虚拟地址空间,用于加载程序数据,首地址为0(起始的0地址是被虚拟出来的,不是物理内存的0地址)
32位的应用程序所对应的进程拥有的虚拟内存大小为2^32字节(4GB)
虚拟地址空间主要分为两个部分:内核区和用户区
- 内核区为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数;所有进程的虚拟地址空间的内存区都会映射到同一块物理内存上(因为系统内存只有一个)
- 用户区用于存储进程运行过程中的各种数据
用户区:虚拟地址空间的用户区范围是0-3G区间,内部分为
- 保留区:位于虚拟地址空间最底部,未映射物理地址。任何对它的引用都是非法的,程序中的空指针(NULL)指向的就是这块内存地址
- .txt区:文本区域,CPU的机器指令都存放在该区域,该区域是只读的,用于保护指令在运行期间不被修改
- .data区:也称静态存储区,用于存放已经初始化且初始值不为0的静态变量和全局变量,可以对该区域进行读和写操作
- .bss区:用于存放未被初始化的全局变量和静态变量,操作系统会将这些未被初始化的全局变量和静态变量初始化为0
- 堆区:用于存放程序运行时动态分配的数据,堆中的数据是匿名性质的,只能通过指针间接访问
- 内存映射区:用于加载磁盘文件,也用于加载运行时调用的动态库
- 栈区:存储函数内部声明的非静态局部变量,函数参数,函数返回地址等信息,分配的内存是连续的,栈和堆地址是”方向相反“的方向生长的
- 环境变量:存储和进行相关的信息,如进程工作路径、进程所有者
- 命令行参数:存储进程执行时传递给进程的参数
(2)Why(为什么需要虚拟地址空间)
虚拟地址空间的作用很多,如隐藏真实的物理内存空间,防止恶意程序随意修改其他进程的内存数据;还能提高内存的使用效率,虚拟内存地址空间对应的内存空间不一定要连续,操作系统将虚拟地址映射到适当的物理内存上,这样,只要操作系统处理好虚拟地址到物理内存地址的映射,就可以保证不同的程序最终访问的内存地址位于不同的区域,彼此没有重叠,就可以达到内存地址空间隔离的效果。
2、文件描述符
(1)What(什么是文件描述符)
在Linux操作系统中,一切都被抽象成文件,并使用文件描述符来管理抽象文件。文件描述符的本质是一个非负整数,操作系统内部维护了一个和进行相对应的文件描述符表
int open(const char *strPth, int flags);
(2)文件描述符表
本质是非负整数和文件(包括硬件设备)的映射关系表,每一个进程都有一个文件描述符表,用于访问文件
文件最大数:每一个进程的文件描述符表打开的文件数量是有限制的(取决于操作系统的硬件配置),默认的数量是1024
默认分配的文件描述符:当进程被启动之后,内核PCB的文件描述符表中就已经分配了三个文件描述符,这三个文件描述符对应的都是当前启动这个进程的终端文件,它们分别是:标准输入(STDIN_FILENO,0)、标准输出(STDOUT_FILENO,1)、标准错误(STDERR_FILENO,2);故进程分配文件描述符是从3开始分配的