六、高级进程管理

进程调度简称调度器,是把有限的处理器资源分配给进程的内核子系统。
在作出决策的过程中,调度器既要最大化处理器效率,又要让多个进程同时运行、互不影响。

就绪进程:该进程是非阻塞的。进行用户交互、大量读写文件、响应I/O和网路事件的进程会花费大量时间来等待资源可用,在相当长的事件内无法转换为就绪状态。
多任务操作系统分为两大类:协同式和抢占式。Linux实现了后一种形式的多任务。

时间片

Linux分配给进程的运行时间。时间片的长短对系统行为和性能非常重要。一些系统给予进程长时间片,希望最大化系统吞吐率和整体表现。另一些系统给予较短的时间片,希望获得优秀的交互性能。Linux通过动态分配进程时间片,期望在两方面都能做到最好

I/O约束进程 Vs. 处理器约束进程

持续消耗所有可用的时间片的进程称为“处理器约束进程”。多数时间处于等待资源的阻塞状态的进程称为“I/O约束进程”;I/O约束进程经常发起和等待文件I/O,阻塞在键盘输入,或者用户移动鼠标等。
两类进程得益于调度器对于不同程序类型所采用的不同行为。处理器可能得到尽可能多的时间片从而最大化缓存命中率,尽可能完成任务。而I/O约束进程不需要长时间片,因为它们一般在发出I/O请求和阻塞在内核资源前只会运行很短一段时间。

抢占调度

当一个时间片耗光的时候,调度器会中止其运行,开始运行一个新的进程。如果没有其他的就绪进程,内核会给予所有耗光时间片的进程新的时间片,继续运行。低优先级进程必须等待高优先级进程耗光时间片或者阻塞。
没有就绪进程,那么会运行空闲进程。空闲进程既不是一个进程,也不能实际运行。空闲进程是为了简化调度算法和统计方便而生的特殊例程。
系统中运行的进程一定是最高优先级的可运行进程。

线程

线程是进程中的运行单元,所有进程都至少有一个线程。每个线程都独占一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。但是共享同一地址空间(同样的动态内存,映射文件,目标代码等等),打开的文件队列和其他内核资源。

让出处理器

虽然Linux是一个抢占式多任务操作系统,但是它也提供了一个系统调用来允许进程主动让出处理器,并通知调度器选择另一个进程来运行。

#include <sched.h>
int sched_yiedld(void);

中断当前进程,运行一个新的进程,就和内核主动抢占一样。当没有其他就绪进程,让出的进程会直接恢复运行。
一般来说,Unix程序倾向于使用建立在一个可阻塞文件描述符基础上的事件驱动机制。有一种需要使用sche_yield():用户空间线程锁。让一个线程试图请求另一个线程已拥有的锁的时候,该线程会让出处理器直到锁可用。

让出处理器方法的过去和现状

在早期调用sched_yeild()如果就绪队列有其他进程就运行该进程,并把当前进程放到就绪队列的队尾。
在2.6内核做了调整
(1)进程是实时进程吗?如果是,放到就绪队列的队尾。如果不是,到下一步。
(2)把该进程从就绪队列移出,放到到期进程队列中。也就是说,只有当所有就绪进程运行,耗光时间片后,该进程才能和所有的到期进程一道重新进入就绪
(3)调度下一个就绪进程运行。

进程优先级

历史上,Unix把这个优先级称为“nice values”,因为低优先级的进程往往允许其他进程分享更多的处理器时间。
“nice values”是在进程运行的时候指定的,Linux调度器基于这样的原则来调度:高优先级的程序总是先运行。同时nice值也指明了进程的时间片长度。
合法的优先级在-20到19之间,默认为0。nice值越低优先级越高,时间片越长。增加一个进程的nice值意味着该进程对系统更友好。

nice()

#include <unistd.h>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值