当前位置: 首页 > article >正文

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开始分配的


http://www.kler.cn/news/327212.html

相关文章:

  • 【SpringBoot详细教程】-08-MybatisPlus详细教程以及SpringBoot整合Mybatis-plus【持续更新】
  • 端点安全服务:全面的端点安全解决方案
  • 初识CyberBattleSim
  • sql语法学习 sql各种语法 sql增删改查 数据库各种操作 数据库指令
  • 自动化测试中如何精确模拟富文本编辑器中的输入与提交?
  • Pytorch-LSTM轴承故障一维信号分类(一)
  • 如何在 Amazon EMR 中运行 Flink CDC Pipeline Connector
  • 【笔记】如何将本地的.md变成不影响阅读的类pdf模式
  • COMP 6714-Info Retrieval and Web Search笔记week2
  • 解决 Android WebView 无法加载 H5 页面常见问题的实用指南
  • Another redis desktop manager使用说明
  • 在IntelliJ IDEA中设置文件自动定位
  • 劳易测ODT3CL1-2M漫反射传感器荣获 “2024 MM《现代制造》创新产品奖”
  • AWS Network Firewall - IGW方式配置只应许白名单域名出入站
  • SQL进阶技巧:影院2人相邻的座位如何预定?
  • QT将QBytearray的data()指针赋值给结构体指针变量后数据不正确的问题
  • Brave编译指南2024 MacOS篇-构建与运行(六)
  • 正则表达式的使用规则
  • Linux —— Socket编程(三)
  • 深入理解 C++11 Lambda 表达式及其捕获列表
  • Lombok同时使⽤@Data和@Builder遇到的坑
  • 0基础学习PyTorch——监控机器学习的可视化工具
  • PostgreSQL 字段使用pglz压缩测试
  • OceanBase企业级分布式关系数据库
  • TypeScript 算法手册 - 【冒泡排序】
  • 海陆钻井自动化作业机器人比例阀放大器
  • Apache Solr:深入探索与常见误区解析
  • 深度学习实战:UNet模型的训练与测试详解
  • 关于 JVM 个人 NOTE
  • ARM Assembly: 第8课 branching