读书笔记(54)
系统数据文件和信息
口令文件/etc/passwd
和组文件/etc/group
经常被多个进程频繁使用。用户每次登录Linux和使用ls
命令都会访问口令文件。
除了直接访问文件之外,系统通过一些接口来对外提供信息,比如系统标识函数、时间和日期函数。
标准IO
标准I/O库由ISO C标准制定的。标准I/O库相对于系统I/O处理了很多细节,比如缓冲区分配、以优化的块大小执行I/O(这个数据存储在stat
结构体中的st_blksize
字段)等。
系统I/O是以文件描述符来作为基础展开的,而标准I/O是围绕流进行的,打开或创建文件时会将流和文件关联起来。
获取与流相关的文件描述符可以使用函数fileno()
。
流和文件相关联为文件流,流和内存关联起来为内存流。
文件和目录
本文描述了文件的属性,主要是struct stat
结构体中的相关字段,比如文件所有者ID、文件所属组ID、块大小等。
其次详细描述了文件权限的相关内容,包括文件的基本权限、进程创建、读写文件的权限验证规则以及修改文件权限的相关接口等。
最后是文件系统简介,包含inode
、目录项等,以及文件时间,创建删除以及读写目录等。
文件IO
本节主要介绍不带缓冲的I/O(unbuffered I/O),不带缓冲指的是每个read
和write
都会调用内核中的一个系统调用。
不带缓冲的I/O函数不是ISO C的标准函数,但是是符合POSIX的。
原子操作在多进程之间贡献文件变得相当重要。
主要涉及的函数有oepn, read, write, lseek, close; dup, fcntl, sync, fsync, ioctl
。
程序的交流和通信
虚拟内存
一个系统中的进程与其他进程共享CPU和主存资源的。
为了更加有效地管理内存并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存VM。
虚拟内存是硬件异常,硬件地址,主存,磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的,一致的和私有的地址空间。
虚拟内存提供了三个重要的能力:
- 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。
- 它为每个进程提供了一致的地址空间,从而简化了内存管理。
- 它保护了每个进程的地址空间不被其他进程破坏。
异常控制流
从给处理器加电开始,直到断电为止,程序计数器假设一个值的序列$a_0,a_1,…,a_{n-1}$,其中,每个$a_k$是某个相应指令$I_k$的地址。每次从$a_k$到$a_{k+1}$的过渡称为控制转移。这样的控制转移序列叫做处理器的控制流。
链接
链接是将各种代码和数据片段收集并组合成一个单一文件的过程,这个文件可被夹在到内存中运行。链接可以执行于编译时,也就是在源代码被翻译成机器代码时;也可以执行于加载时,也就是在程序被加载器加载到内存并执行时;甚至执行于运行时,也就是由应用程序来执行。
链接时由链接器程序自动执行的。链接器在软件开发中扮演这一个关键的角色,因为它们使得分离编译称为可能。
传统静态链接,加载时共享库的动态链接,以及运行时的共享库的动态链接。
存储器层次结构
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。CPU寄存器保存着最常用的数据。靠近CPU的小的、快速的高速缓存存储器(cache memory)作为一部分存储在相对慢速的主存储器中数据和指令的缓冲区域。主存缓存存储在容量较大的、慢速磁盘上的数据,而这些磁盘通常又作为存储在通过网络连接的其他机器的存盘或磁带上的数据的缓冲区域。