系统编程手册 第二章 - DDL-Killer/The-road-of-Linxu-Group2024 GitHub Wiki
操作系统的核心--内核
操作系统含义
- 指完整的软件包,这包括用来管理计算机资源的核心层软件,以及附带的所有标准软件工具
- 指管理和分配计算机资源(CPU、RAM和设备)的核心层软件
内核的职责
- 进程调度:调度中央处理单元以执行程序指令;Linux为抢占式多任务操作系统————“抢占”指的是一组规则,这组规则控制着哪些进程可以使用,使用多长时间,这两个操作都由内核进程调度控制
- 内存管理:Linux使用虚拟内存管理机制:
- 进程与进程、进程与内核之间相互隔离
- 只需要将一部分进程保持在内存中
- 提供了文件系统:创建、获取、更新以及删除
- 创建和终止进程
- 对设备的访问:为程序访问设备提供了简化的标准接口,仲裁多个进程对每一个设备的访问
- 联网:内核以用户进程名义收发网络消息(数据包)
- 提供系统调用应用编程接口(API):进程可利用内核入口点(系统调用)请求内核去执行任务
内核态和用户态
- 执行硬件指令可使CPU在两种状态来回切换
- 用户态时,CPU只能访问被标记为用户空间的内存
- 核心态时,CPU都能访问
以进程和内核视角检视系统
shell
shell是一种具有特殊用途的程序,主要用于读取用户输入的命令,并执行相关的程序来相应命令
用户和组
用户
- 系统的每个用户都有唯一的登录名和与之相对应的整数型ID
- /etc/passwd(系统密码文件)为每个用户都定义一行记录,除了两项信息外,还包含以下信息
- 组ID:用户所属第一个组的整数型组ID
- 主目录:用户登录后所居于的初始目录
- 登录shell:执行以解释用户命令的程序名称
组
- /etc/group
- 组名、组ID、用户列表
超级用户
- ID:0
- 登录名:root
单根目录层级、目录、链接和文件
内核维护着一套单根目录结构,以存放系统的所有文件
- 这一目录层级的根基就是**“/”**的根目录
- 所有的文件和目录都是根目录的“子孙”
文件类型
路径和链接
- 每条目录至少包含.和..
- 前者指向目录自身的链接
- 后者指向上一级的链接
- 对于根目录而言,..是指向根目录本身的链接
符号链接
- 空链接和软链接
文件名
- 最长255个字符
路径名
- 绝对路径:以“/”开始
- 相对路径:相对于进程当前工作目录的文件位置
文件I/O模型
程序
过滤器
从stdin输入,加以转换,输出到stdout
命令行参数
- 要访问命令行参数,程序的main函数需要:
int main(int argc,char *argv[])
- argc变量包含命令行参数的总个数,argv指针数组的成员指针逐一指向每个命令行串
- 首个字符串argv[0],标识程序名本身
进程
进程是正在执行的程序实例,执行程序时,内核会将程序代码载入虚拟内存,为程序变量分配空间,建立内核记账数据结构,以记录与进程相关的各种信息
进程的内存布局
逻辑上将一个进程划分为以下几部分
- 文本:程序的指令
- 数据:程序使用的静态分布
- 堆:程序可从该区域动态分配额外内存
- 栈:随函数调用、返回而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间
创建进程和执行程序
- 进程可使用系统调用fork()来创建一个新进程
- 调用fork()进程称为父进程,新创建的进程则被称为子进程
- 内核通过对父进程的复制来影响子进程
init进程
- /sbin/init————“所有进程之父”
- 系统的所有进程不是由init创建就是由其后代创建
- 进程号总是1
环境列表
- 每个进程都有一份环境列表,即在进程用户空间内存中维护的一组环境变量
- 其中包括:HOME(明确定义了用户登录目录的路径名),PATH(指明了用户输入命令后,shell查找与之对应程序时所搜索的目录列表)
资源限制
- 每个进程都会消耗诸如打开文件、内存以及CPU时间之类的资源
- 使用系统调用setrlimit()进程可以为自己消耗的各类资源设定一个上限
- 两个相关值:软限制、硬限制
内存映射
调用系统函数mmap()的进程,会在其虚拟地址空间中创建一个新的内存映射
- 文件映射:文件的部分区域映射入调用进程的虚拟内存
- 如果无对应的匿名映射,其映射页面的内容会被初始化为0
静态库和共享库
静态库
- 本质上是对已经编译目标模块的一种结构化整合
共享库
进程间通信及同步
- 信号:用来表示事件的发生
- 管道(|)和FIFO:用在进程间传递数据
- 套接字:不同进程间传输数据
- 文件锁定
- 信号队列:进程间交换信息
- 信号量:同步进程动作
- 贡献内存:允许两个和两个以上进程共享这块内存
信号
内核、其他进程或进程自身均可向进程发送信号
线程
- 每个进程都可执行多个线程
- 想象为共享同一虚拟内存及一干其他属性的进程
进程组和shell任务控制
- shell执行的每个程序都会在一个新进程内发起
会话、控制终端和控制进程
- 会话指的是一组进程组
伪终端
- 伪终端是一对相互连接的虚拟设备,也称为主从设备
- 这对设备之间,有一条IPC信道,可供数据进行双向传递
日期和时间
- 真实时间:指的是在进程的生命期内,以某个标准时间点或固定时间点为起点测量出来的时间
- 进程时间:指的是进程自启动起来,所占用的CPU的时间量
客户端/服务器架构
- 客户端:向服务器发送请求信息,请求服务器执行某些服务
- 服务器:分析客户端的请求,执行相应的动作,然后向客户端发回响信息
实时性
/proc文件系统
- 是一种虚拟文件系统,以文件系统目录和文件形式,指向一个指向内核数据结构的接口