架构
用户代码——》C库函数(man 3 name
)——》Linux文件IO系统函数(man 2 name
)——》磁盘等硬件
C库函数
效率高,其包含IO缓冲区,缓冲区默认8192Bytes,也就是8K字节,当缓冲区满了后再操作磁盘等硬件,这样就减少了对硬件的操作,所以其效率高。
当使用fopen打开文件时,会返回一个类型为FILE的结构体指针,该结构体包含:
》文件描述符(整型值)
》文件读、写指针
》IO缓冲区
》……
虚拟地址空间(虚拟内存)
对于32位的机器,其虚拟地址空间大小为:2^32=4,294,967,296Bytes=4GB
对于64位的机器,其虚拟地址空间大小并不是2^ 64,而是2^48=256TB
其虚拟地址空间被分为内核区和用户区两个部分。
其中在用户区中:
栈空间:从高地址向低地址存,由系统自动分配/释放,速度较快,调用函数时存储函数的返回地址、参数、局部变量、返回值。
堆空间:从低地址向高地址存,用户手动分配/释放,速度慢,容易产生内存碎片。
bss段:存放未初始化和初始化为0的全局变量和静态变量(全局+局部)
数据段:存放已经初始化的 全局变量和静态变量。
代码段:包括只读存储区和文本区,其中只读存储区存储字符串常量,文本去存程序的机器码
文件描述符
Linux下叫做文件描述符,在Win下叫做文件句柄。
内核-》内存管理-》PCB进程控制块-》文件描述符表。
内核就是一段程序,PCB就是一结构体;
文件描述符表是一个数组,每个进程会产生一个文件描述符表,其默认大小为1024个(0-1023)。
文件描述符表的前三个文件描述符默认是被占用的,分别为:标准输入、标准输出、标准错误,默认是打开状态,其实其对应的就是当前终端(/dev/tty)(Linux下一切皆文件)。
一个文件可以被多个文件描述符打开,打开新文件时候选择最小的空闲文件描述符(由内核控制)。