6.进程管理
程序是存储在某种存储介质上的可执行文件,是目标码和用户数据的集合。程序装载进内存后可以执行,处于可执行状态的程序称为进程。但是进程并不仅仅局限于一段可执行代码以及一些用户数据,通常它还包括很多其他的资源,比如打开的文件、用于保存临时数据的堆栈、挂起的信号等。因此,进程可以看作处于执行状态的程序以及它所包含的资源的总称。
从内核的角度来看,进程是操作系统分配内存、CPU时间片等资源的基本单位,为正在运行的程序提供的运行环境。它代表了一个执行过程,是一个动态的实体,随着程序中指令的执行而不断变化。
线程是在进程的基础上进一步的抽象,一个进程可以分为两个部分:线程集合和资源集合。线程是进程中的一个动态对象,是一组独立的指令流,进程中的所有线程将共享进程里的资源,单同时各个线程也拥有独立的程序计数器、堆栈和寄存器上下文。所有的进程都至少拥有一个线程。相对于进程是操作系统进行资源管理的最小单元,线程是程序执行的最小单元。
6.1 进程描述符
主要组成部分:
- 进程状态信息:描述进程当前状态
- 进程调度信息:由调度进程使用,决定系统中哪个进程最应该运行
- 标识符(Identifiers):进程相关的一些标识符
- 进程间通信(IPC,Inter-Process Communication):Linux支持经典的UNIX IPC机制,如信号(Signals)、管道(Pipes),也支持System V IPC机制,如共享内存(Shared Memory)、信号量和消息队列(Message Queues)
- 进程组织信息
- 时间和定时器
- 文件系统信息
- 虚拟内存
- 和处理器相关的上下文信息
- 多处理器系统相关信息
6.2 进程标识符
(1) 进程标识符 pid:与进程一一对应,内核通过进程标识符来识别不同的进程
(2) 线程组标识符 TGID : 通过进程描述符的thread_group字段,统一线程组中的所有轻量级进程组成一个双向链表,线程组标识符TGID即为线程组中第一个轻量级进程的PID
(3) 用户和组标识符 : 运行进程的用户的标志符和该用户所属用户组的标志符。
(4)有效用户和组标识符euid、egid:有些程序可以在执行过程中将进程的uid和gid改成其程序自身的uid和gid。这些程序被称为setuid程序,常在严格控制对某些服务的访问时使用,特别是那些为别的进程而运行的进程,如网络后台进程。
(5) 备份用户和组标识符suid、sgid: POSIX标准要求实现这两个标志,它们被那些通过系统调用改变进程uid和gid的程序使用。当进程的原始uid和gid变化时,它们被用来保存真正的uid和gid。
(6)文件系统用户和组标识符fsuid、fgid: 用来检验进程的文件系统访问权限。
6.3 进程0和进程1
进程0创建进程1,即init进程之后,它就执行cpu_idle函数进入无限循环,因此进程0又被称之为idle进程。当没有其他进程处于TASK_RUNNING时,进程0被执行。
第9章 内存管理
内存是CPU能够访问的大容量高速存储区域,是现代计算机运行的中心。CPU通过地址可以随机访问内存单元的字或字节。
- 物理地址:内存单元所对应的 实际的地址
- 逻辑地址:程序操作访问的内存地址,基于段基址的一个段内偏移地址,虚拟地址
- 线性地址:CPU通过总线操作的内存地址,由段基址和段内偏移组合得到线性地址
从虚拟地址到物理地址的转换由硬件MMU(内存管理单元)来完成
kernel里所有的线程共享1G的地址空间,每个应用进程都是独立私有的3GB的地址空间,互相之间不干扰
物理内存分为固定大小的块,称为帧或页。虚拟地址包含页号和页内偏移,页号作为页表的索引通过MMU映射到物理内存的基地址,再加上页内偏移就得到完整的物理地址。