系统编程手册 第二章 - DDL-Killer/The-road-of-Linxu-Group2024 GitHub Wiki

操作系统的核心--内核

操作系统含义

  1. 指完整的软件包,这包括用来管理计算机资源的核心层软件,以及附带的所有标准软件工具
  2. 指管理和分配计算机资源(CPU、RAM和设备)的核心层软件

内核的职责

  • 进程调度:调度中央处理单元以执行程序指令;Linux为抢占式多任务操作系统————“抢占”指的是一组规则,这组规则控制着哪些进程可以使用,使用多长时间,这两个操作都由内核进程调度控制
  • 内存管理:Linux使用虚拟内存管理机制:
    1. 进程与进程、进程与内核之间相互隔离
    2. 只需要将一部分进程保持在内存中
  • 提供了文件系统:创建、获取、更新以及删除
  • 创建和终止进程
  • 对设备的访问:为程序访问设备提供了简化的标准接口,仲裁多个进程对每一个设备的访问
  • 联网:内核以用户进程名义收发网络消息(数据包)
  • 提供系统调用应用编程接口(API):进程可利用内核入口点(系统调用)请求内核去执行任务

内核态和用户态

  • 执行硬件指令可使CPU在两种状态来回切换
  • 用户态时,CPU只能访问被标记为用户空间的内存
  • 核心态时,CPU都能访问

以进程和内核视角检视系统

shell

shell是一种具有特殊用途的程序,主要用于读取用户输入的命令,并执行相关的程序来相应命令

用户和组

用户

  • 系统的每个用户都有唯一的登录名和与之相对应的整数型ID
  • /etc/passwd(系统密码文件)为每个用户都定义一行记录,除了两项信息外,还包含以下信息
    1. 组ID:用户所属第一个组的整数型组ID
    2. 主目录:用户登录后所居于的初始目录
    3. 登录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

静态库和共享库

静态库

  • 本质上是对已经编译目标模块的一种结构化整合

共享库

进程间通信及同步

  1. 信号:用来表示事件的发生
  2. 管道(|)和FIFO:用在进程间传递数据
  3. 套接字:不同进程间传输数据
  4. 文件锁定
  5. 信号队列:进程间交换信息
  6. 信号量:同步进程动作
  7. 贡献内存:允许两个和两个以上进程共享这块内存

信号

内核、其他进程或进程自身均可向进程发送信号

线程

  • 每个进程都可执行多个线程
  • 想象为共享同一虚拟内存及一干其他属性的进程

进程组和shell任务控制

  • shell执行的每个程序都会在一个新进程内发起

会话、控制终端和控制进程

  • 会话指的是一组进程组

伪终端

  • 伪终端是一对相互连接的虚拟设备,也称为主从设备
  • 这对设备之间,有一条IPC信道,可供数据进行双向传递

日期和时间

  • 真实时间:指的是在进程的生命期内,以某个标准时间点或固定时间点为起点测量出来的时间
  • 进程时间:指的是进程自启动起来,所占用的CPU的时间量

客户端/服务器架构

  • 客户端:向服务器发送请求信息,请求服务器执行某些服务
  • 服务器:分析客户端的请求,执行相应的动作,然后向客户端发回响信息

实时性

/proc文件系统

  • 是一种虚拟文件系统,以文件系统目录和文件形式,指向一个指向内核数据结构的接口