线程与调度算法

线程是CPU使用的基本单元,它由线程ID、程序计数器、寄存器集合和栈组成。它与属于同一进程的其他线程共享代码段、数据段和其他操作系统资源。
一个应用程序通常是作为一个具有多个控制线程的独立进程实现的,例如浏览器有一个线程来渲染UI,另一个线程来发起异步请求。进程创建很消耗资源,所以多线程编程就出现了。
多线程编程有以下优点:

  • 响应度高。
  • 资源共享。
  • 经济。
  • 多处理器的运用。

多线程模型

有两种方法来支持多线程:用户层的用户线程或内核层的内核线程。用户线程受内核支持,而无需内核管理。内核线程由操作系统直接管理。它们之间有这几种对应关系:

  • 多对一模型。线程管理是由线程库在用户空间进行的,因而效率高。但如果有一个线程阻塞系统调用,那么整个进程都会阻塞。多对一模型将许多许多用户级线程映射到一个内核线程。
  • 一对一模型将每个用户线程映射到一个内核线程,该模型在一个线程阻塞时,能允许另一个线程继续执行。这个模型优点是能更好地处理并发,但缺点是每创建一个用户线程就要创建一个内核线程。
  • 多对多模型多路复用了许多用户线程到同样数量或者更小数量的内核线程上。

线程库(thread library)为程序员提供创建和管理线程的api。

多线程问题

如果程序中的一个进程使用了fork,那么新进程会复制所有线程。线程取消(thread cancellation)是在线程完成之前来终止线程的任务。例如如果多个线程并发搜索数据库,有一个线程已经得到结果,那么其他线程就可以取消。要取消的线程通常叫做目标线程,目标线程可以在如下情况下取消:

  • 异步取消。一个线程立即终止目标线程。
  • 延迟取消,目标线程不断检查它是否应该终止。

线程池

线程池的主要思想是在进程开始时创建一定数量的线程,并放到池中以等待工作。当服务器收到请求的时候,它会唤醒线程池中的一个线程,并将要处理的请求传递给它。一旦线程完成了任务,会回到线程池中再等待工作。
线程池有以下优点:

  • 使用现有等待线程比新建线程要快。
  • 线程池限制了可用线程数量,对于一些不能适应高并发的系统非常重要。

CPU调度

CPU调度是多道程序操作系统的基础。通过在进程之间切换CPU,可以提高CPU吞吐量。CPU的成功调用依赖于进程的如下属性:进程执行由CPU执行和IO等待周期组成。进程在这两个状态之间切换。
进程执行从CPU区间(CPU burst)开始,在这之后是IO区间(IO burst),循环反复。
每当CPU空闲的时候,操作系统就从就绪队列中选择一个进程来执行。就绪队列不一定先进先出的队列,也可能是优先队列或无序链表。

抢占调度

CPU调度决策可以在如下4种环境中发生:

  • 当一个进程从运行状态切换到等待状态(例如IO请求,或调用wait等待一个子进程的终止)
  • 当一个进程从运行状态切换到就绪状态(例如出现中断时)
  • 当一个进程从等待状态切换到j就绪状态(例如IO已经完成)
  • 当一个进程终止时

对于第1和第4种情况,没有选择而只有调度。当调度发生在1和4的时候,称调度方案为非抢占式的(nonpreemptive),否则称为抢占式的(preemptive)。采用非抢占式调度,一旦给CPU分配一个进程,那么该进程会一直使用CPU直到切换到等待状态或终止状态。

分派程序

与CPU调度有关的另一个部分是分派程序(dispatcher)。分派程序是一个模块,用来将CPU的控制交给短期调度程序选择的进程,功能包括:

  • 切换上下文
  • 切换到用户模式
  • 跳转到用户程序的合适位置,以重新启动程序。

分派程序要尽可能快,因为在每次进程切换时都要使用。分派程序停止一个进程而启动另一个的延迟叫做分派延迟(dispatch latency)。

调度准则

不同的CPU调度算法具有不同属性。为了比较CPU调度算法,提出了以下准则:

  • CPU使用率。需要使CPU尽可能忙,从概念上讲,CPU使用率为0到100%
  • 吞吐量:如果CPU忙于进程,就一定有工作在完成。吞吐量指的是单位时间内进程的数量。
  • 周转时间:从进程提交到进程完成的时间称为周转时间,为所有时间段之和。
  • 等待时间。CPU调度算法并不影响进程运行和执行IO的时间,**它只影响进程在就绪队列中的时间。**等待时间为在就绪队列中等待的时间总和。
  • 响应时间。用户从提交到第一个响应的时间称为响应时间。

调度算法

最简单的CPU调度算法是先到先服务算法(FCFS),但是它会让短进程等待很长时间。比如一个20ms、3ms、4ms的进程,平均等待时间为(20 + 20 + 3)/3ms。而如果是3ms和4ms的调度,则平均等待时间为(3 + 3 + 4)/3ms。先到先服务算法采用的是非抢占式算法。
另一种CPU调度算法是最短作业优先调度算法(SJF)。这一算法将每个进程与其下一个CPU区间相关联。当CPU空闲时,它会赋给具有最短CPU区间的进程。
轮转法调度算法(RR)是专门为分时系统设计的,它类似于FCFS,但是增加了抢占以切换进程。为每个进程分配一个CPU的时间片。

多处理器调度

如果有多个CPU,则负载分配(load sharing)成为可能,但调度问题也相应地变得更为复杂。
在一个多处理器中,CPU调度的一种方法是让一个处理器(主服务器)处理所有的调度决定、IO活动以及其他系统活动。这种非对称多处理比较简单,因为只有一个处理器访问系统数据结构。
另一种方法是使用对称多处理,即每个处理器自我调度。

这篇主要介绍了进程和CPU调度,下一篇操作系统(4)介绍进程同步和原子事务。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值