加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

进程调度与进程调度的时机分析

(2016-04-15 10:41:40)

作者:20133205张卫东

Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

所谓进程调度程序,即为确保进程能够有效工作的一个内核子系统,它负责决定哪个进程投入运行,何时运行以及运行多长时间。

进程调度的时机包括:中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。

不同类型的进程有不同的调度需求。

第一种分类:

I/O-bound 频繁的进行I/O;通常会花费很多时间等待I/O操作的完成。

CPU-bound 计算密集型;需要大量的CPU时间进行运算。

第二种分类:

批处理进程

实时进程

 

交互式进程 shell

为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换、任务切换、上下文切换,schedule()函数选择一个新的进程来运行,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换。

实验截图:

http://s14/mw690/002JBYijgy70VrEHXIxbd&690
http://s15/mw690/002JBYijgy70VrH4QsC2e&690
http://s11/mw690/002JBYijgy70VrIjXsKea&690
http://s4/mw690/002JBYijgy70VrJYssX43&690Linux系统的一般执行过程:
最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程。

几种特殊情况:通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略;创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork;加载一个新的可执行程序后返回到用户态的情况,如execve

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有