This memo is based on the course of Dr.Li with Operating System as the reference book.
本part重点:
进程概念
- 3.1 进程概念
3.1 进程概念
进程的三个维度(区分不同的进程):在执行什么程序;用到了哪些数据;处于什么状态
注意ready状态和waiting状态的区别
状态的分类各操作系统有区别
===
PCB
每个进程在操作系统内用进程控制块(PCB)来表示。它包含许多与一个特定进程相关的信息。(存放在内存中)
- 进程状态
- 程序计数器:表示进程要执行的下个指令的地址
- CPU寄存器:
- CPU调度信息:包括进程优先级、调度队列的指针和其他调度参数 内存管理信息
- 记账信息:包括CPU时间、时间界限、记账数据(当使用云计算的时候,可通过相关信息计费)
- I/O状态信息
3.2 调度队列
进程的调度可以理解成将PCB通过队列进行管理。
当进程被分配到CPU并执行时,可能会发生下面几种事件中的一种:
- 发出一个io请求,并被放到io队列中
- 可能创建一个新的子进程,并等待其结束
- 可能会由于中断而强制释放CPU,并被放回就绪队列中
时间片:是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。
===
3.2.3 上下文切换
q:为什么有上下文切换?
a:程序在执行时为了追求高效率,它希望变量放在CPU寄存器或者内存里面。所以当进程运行时,一定会使用到寄存器。所以当进程切换时,寄存器里的值要先备份,确保进程以后能正确地执行。
这是在引进了mutil-tasking后出现的时间开销。
Linux下的PCB
- 优先级(为进程分级)
- 调度策略:非实时进程,基于优先权的轮转法;实时进程,用先进先出算法;实时进程,用基于优先权的轮转法
- 所有就绪进程均放置在就绪队列,构成一个双向链表
- 所有进程(以PCB形式)组成双向链表
3.3 进程操作
3.3.1 进程创建
子进程的资源有多种可能:
- 子进程是父进程的复制品(具有与父进程相同的程序和数据)(并不是指针指向同一个对象,而是得到一份完全相同的“对象”)
- 子进程不从父进程共享资源,重新独立申请
对于子进程,系统调用fork()返回值为0;对于父进程,返回值为子进程的进程标识符(非0)
===
3.3.2 进程终止
调用exit()请求操作系统删除自身时,进程终止。
可以返回状态值到父进程,所有进程资源会被系统释放。
3.4 进程通信
3.4.1 共享内存系统
生产者-消费者模型
3.4.2 消息传递系统
同步通信和异步通信
同步式通信也称为阻塞式通信:
发送进程等待,直至接受进程确认收到消息
接受进程等待,直至有个消息到达
异步通信是非阻塞式的:
发送进程发出消息后继续进行其他操作
接收者收到一个有效消息或空消息