一. 基础知识
1.1 体系结构
系统调用:内核的接口
应用程序既可以使用共用函数库,也可以使用系统调用
1.2 登录
登录项的组成:登录名、加密口令、数字用户 ID(UID)、数字组 ID(GID)、注释字段、起始目录、shell 程序
1.3 目录
每个进程都有一个工作目录(当前工作目录),相对路径都从工作目录开始解析
进程可以使用 chdir 函数更改工作目录
1.4 输入输出
1.4.1 文件描述符
文件描述符是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表
取值范围为 0 到 OPEN_MAX(每个进程最多可以打开 的文件数-1,63)
1.4.2 标准输入、标准输出和标准错误
标准输入、标准输出和标准错误是在运行新程序时,shell 为程序默认打开的 3 个文件描述符
1.5 程序和进程
内核使用 exec 函数将程序读入内存并执行程序
fork 函数创建一个新进程,该进程(子进程)是调用进程(父进程)的一个副本
在创建时,对父进程返回子进程 ID,对子进程返回 0
1.6 线程
一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性
1.7 出错处理
errno:Unix 系统函数出错时返回的负值
关于 errno:
- 如果没有出错,其值都不会被例程清除
- 任何函数都不会将 errno 设置为 0
关于错误:
- 出错分为致命性的和非致命性的
- 对于致命性错误,可打印出错消息或者写入日志
- 对于非致命错误,可以尝试重试(延时、指数补偿算法)
1.8 用户标识
1. 用户 ID
用户不可更改其用户 ID
用户 ID 为 0 的用户为 root 用户或超级用户
2. 组 ID
组文件将组名映射为数字的组 ID,位于/etc/group
3. 附属组 ID
系统允许用户属于另外一些组,一个用户属于多至 16 个其他的组
1.9 信号
信号用于通知进程发生了某种状况
处理信号的方式:
- 忽略
- 系统默认方式处理
- 提供函数,信号发生时调用,即捕捉信号
1.10 时间
日历时间:自 UTC 时间的秒数累计值
进程时间:也叫做 CPU 时间,用来度量进程使用的 CPU 资源,以时钟 tick 计算
系统为进程维护的三个进程时间值:
- 时钟时间,进程运行的时间总量(与系统同时运行的进程数有关)
- 用户 CPU 时间,执行用户指令所用的时间量
- 系统 CPU 时间,为该进程执行内核程序经历的时间量
用户 CPU 时间和系统 CPU 时间常称为 CPU 时间
1 | # 度量执行时间 |
1.11 系统调用和库函数
系统调用:提供给程序向内核请求服务的,操作系统提供的入口点
区别:
- 库函数可以被替换,而系统调用通常不可替换
- 应用程序既可以调用 系统调用,也可以调用 库函数
- 许多库函数会调用系统调用
- 系统调用通常是提供最接口,而库函数通常提供较复杂的功能
- 进程控制系统调用(fork/exec/wait)通常有用户应用程序直接调用