Skip to content

7月26日学习笔记

lirui edited this page Jul 26, 2020 · 1 revision

第十讲 进程和线程控制

10.1 进程切换(上下文切换)

暂停当前运行进程,从运行状态变成其他状态

调度另一个进程从就绪状态变成运行状态

切换要求:

切换前,保存进程上下文

切换后,恢复进程上下文

快速切换

通常情况下是汇编来实现

进程生命周期信息

寄存器(PC、SP、...)

CPU状态

内存地址空间 (不会被另一个进程所替代,大部分不用保存)

内核为每个进程维护了对应的进程控制块(PCB)

内核将相同状态的进程的PCB放置在同一队列

10.2 进程创建

创建新进程

Windows进程创建API:CreateProcess(filename)

UNIX进程创建系统调用:fork/exec

fork()创建一个继承的子进程

复制父进程的所有变量和内存

复制父进程的所有CPU寄存器(有一个寄存器例外)

fork()返回值

子进程的fork()返回0

父进程的fork()返回子进程标识符

fork()返回值可方便后续使用,子进程可使用getpid()获取PID

fork()执行过程对于子进程而言,是在调用时间对父进程地址空间的一次复制

对于父进程fork()返回child PID,对于子进程返回值为0

系统调用exec()加载新程序取代当前运行进程

空闲进程的创建 idleproc

创建第一个内核线程

fork()的实现开销?

对子进程分配内存

复制父进程的内存和CPU寄存器到子进程里

开销昂贵

在99%的情况里,在调用fork()之后调用exec()

在fork()操作中内存复制是没有作用的

子进程将可能关闭打开的文件和连接

vfork()

创建进程时,不再创建一个同样的内存映像

一些时候称为轻量级fork()

子进程应该几乎立即调用exec()

现在使用Copy on Write(COW)技术

10.3 进程加载:用户的应用程序通过系统调用exec()加载来完成一个新的可执行文件的加载

运行进程“加载”一个完全不同的程序,并从main开始执行(即_start):将一个映像加载到内存中,然后跳过去到指定的位置来执行,中间有关于可执行文件格式的识别问题,不同的系统可以加载的可执行文件的格式是不一样的,

允许进程加载时指定启动参数(argc,argv)

exec调用成功时:

它是相同的进程...

但是运行了不同的程序

代码段、堆栈和堆(heap)等完全重写

10.4 进程的等待与退出

父子进程的一种交互,完成子进程的资源回收

wait()系统调用用于父进程等待子进程的结束

子进程结束时通过exit()向父进程返回一个值

父进程通过wait()接受并处理返回值

wait()系统调用的功能:

子进程存活时,父进程进入等待状态,等待子进程的返回结果,当某子进程调用exit()时,唤醒父进程,将exit()返回值作为父进程中wait的返回值

有僵尸子进程等待时,wait()立即返回其中一个值

无子进程存活时,wait()立刻返回

进程的有序终止exit():进程结束执行时调用exit(),完成进程资源回收

exit()系统调用的功能:

将调用参数作为进程的“结果”

关闭所有打开的文件等占用资源

释放内存

释放大部分进程相关的内核数据结构

检查父进程是否还存活

如存活,保留结果的值直到父进程需要它,进入僵尸(zombie/defunct)状态

如果没有,它释放所有的数据结构,进程结果

清理素有等待的僵尸进程

进程终止时最终垃圾收集(资源回收)

其它进程控制系统调用

优先级控制

nice()指定进程的初始优先级

Unix系统中进程优先级会随执行时间而衰减

进程调试支持

ptrace()允许一个进程控制另一个进程的执行

设置断点和查看寄存器等

定时

sleep()可以让进程在指定的时间进入等待状态,然后时间到了它进入就绪状态,然后继续执行,这是定时的功能

10.5 rCore进程和线程控制

进程和线程控制块

第十一讲 处理机调度

11.1 处理机调度概念

处理机调度是操作系统中用来管理处理机执行能力的这一部分资源的功能

进程切换实际上就是CPU资源的当前占用者的一种切换,通过这种切换,实现CPU资源的时分复用

保存当前进程在PCB中的执行上下文(CPU状态)

恢复下一个进程的执行上下文

处理机调度算法:从就绪队列中挑选下一个占用CPU运行的进程,从多个可用CPU中挑选;从多个可用CPU中挑选就绪进程可使用的CPU资源;

调度程序:挑选就绪进程的内核函数,如果说是多处理机的话,还有负责挑选可用处理机的这个功能

调度策略:

依据什么原则挑选进程/线程

调度时机:

什么时候进行调度

内核运行调度程序的条件

进程从运行状态切换到等待状态

进程被终结了

以上是针对非抢占系统:当前进程主动放弃CPU

对于可抢占系统

中断请求被服务例程响应完成时

当前进程被抢占

进程时间片用完

进程从等待切换到就绪

11.2 调度准则

调度策略:确定如何从就绪队列中选择下一个执行进程

要解决的问题:挑选就绪队列中的哪一个进程?通过什么样的准则来选择?

调度算法:在调度程序中实现的调度策略

比较调度算法的准则

处理机资源的使用模式

进程在CPU计算和I/O操作间交替

每次调度决定在下一个CPU计算时将哪个工作交给CPU

在时间片机制下,进程可能在结束当前CPU计算前被迫放弃CPU

CPU使用率

CPU处于忙状态的时间百分比

吞吐率

单位时间内完成的进程数量

周转时间

进程从初始化到结束(包括等待)的总时间

等待时间

进程在就绪队列中的总时间

响应时间

从提交请求到产生响应所花费的总时间

吞吐量与延迟

调度算法的要求:希望更快的服务;传输文件时的高带宽,调度算法的高吞吐量

玩游戏时的低延时,调度算法的低响应延迟

以上两个因素是独立的

处理机调度策略的响应时间目标

减少响应时间

及时处理用户的输入请求,尽快将输出反馈给用户

减少平均响应时间的波动

在交互系统中,可预测性比高差异低平均更重要

低延时调度改善了用户的交互体验

响应时间是OS的计算延迟

处理机调度策略的吞吐量目标

增加吞吐量

减少开销(操作系统开销,上下文切换)

系统资源的高效利用(CPU、I/O设备)

减少等待时间

减少每个进程的等待时间

操作系统需要保证吞吐量不受用户交互的影响

操作系统必须不时进行调度,即使存在许多交互任务

吞吐量是OS的计算带宽

处理机调度的公平性目标

公平的定义

保证每个进程占用相同的CPU时间

保证每个进程的等待时间相同

公平通常会增加平均响应时间

11.3 先来先服务、短进程优先和最高响应比优先调度算法

先来先服务:FCFS First Come,First Served

短进程优先:根据作业执行时间长短来进行排队的

SPN:shortest Process Next

SJF:Shortest Job First(短作业优先算法)

SRT:Shortest Remaining Time (短剩余时间优先算法)

最高响应比优先算法:考虑的是进程在就绪队列里的等待时间

HRRN:Hightest Response Ratio Next

时间片轮转算法:各个进程轮流占用一个基本的时间片,排到队列里面仍然按照FCFS算法来进行排队,在这个基础上多了一个执行时间的最大长度限制,最长不能执行超过一个时间片,在这之前,可以由于等待或是结束而让出CPU使用权

RR:Round Robin

多级反馈队列算法:将就绪队列排成多个子队列,不同的子队列可以有不同的算法,并且可以在多个队列之间调整一个进程所排的队列

MFQ:Multilevel Feedback Queues

公平共享调度算法:按照进程占用的资源的情况来进行调度,保证我们每一个进程占用的资源是相对公平的

FSS:Fair Share Scheduling

Clone this wiki locally