linux--关于Linux的文件IO、虚拟地址空间概念、文件描述符

标准C库IO函数

linux--关于Linux的文件IO、虚拟地址空间概念、文件描述符_第1张图片
C库的IO函数时跨平台的,它是先通过例如fopen、fread这样的函数去调用对应系统内核例如windows、linux的write或者是read函数进而实现跨平台读写文件。
那么一般都是要获取一个FILE *fp的内存地址,这个实际上是一个结构体,包含三个部分。

在Linux中,IO是针对内存来说的。
在FILE *fp来说,文件描述符其实是由linux内核给出的

C库IO的优点:存储效率很快,因为有一个缓冲区,读写都是先到缓冲区,然后再和物理内存进行交换数据(适用于普通读写)
linux内核IO的优点:每一次读写都是直接和硬件进行交换,适用于网络通信这样的比较快接收到交换信息的方式。

虚拟地址空间

是程序员构想出来的一个空间,是不存在的,程序运行结束了,虚拟空间就不存在了。他是为进程分配的一个资源,进程就是正在运行中的程序,占用的是内存的空间。与程序不同,程序占用的是硬盘的空间。
linux--关于Linux的文件IO、虚拟地址空间概念、文件描述符_第2张图片
虚拟地址空间如果是32位机器一般会分配232也就是4G的内存,64位分配248内存,通常不一定真的占到物理内存4G.
分为两个区域,用户区是用户可以进行操作的部分,受保护低地址就类似nullptr这样的地址存放,堆空间的存放是按照内存从小到大存放的,但栈空间就是按照内存地址从大到小存放的,然后用户区也会存放共享库也就是之前的那个动态库这样的内容,剩下再放一些命令行参数和环境变量什么的。
内核区普通用户是不能进行读写的,存放着一些管理任务之类的,用户可以通过内核函数实现对硬件的数据进行读写什么的。

文件描述符

当内存中有一个进程的时候,linux内核中有一个PCB进程控制块,它是一个很复杂的结构体。PCB中有一个文件描述符表是一个array数组,用于存放文件描述符,最多能够同时操作1024个文件,其中前三个文件描述符默认占用为标准输入、输出、错误,并且他们指向的文件都是终端。(是因为在linux中万物皆可文件,因此这几个文件描述符的操作在同一个进程中对应的文件就是同一个终端,如果又打开了一个新的终端这个就不算)
linux--关于Linux的文件IO、虚拟地址空间概念、文件描述符_第3张图片
如果两次打开同一个文件,形成的文件描述符是不一样的,如图所示两次打开a.txt,文件描述符分别存放在3和5。当例如close3的那个a.txt后,3的位置就会释放,下一次对文件操作就会放在3的位置,因此这个就是占用顺序是按空闲的最小的一个文件描述符来的

你可能感兴趣的:(linux,linux,服务器)