linux0.11 进程,LINUX0.11进程调度

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

LINUX0.11进程调度

void schedule(void)是调度函数的原型,在kernel/sched.c文件中定义。

一、进程调度的时机

1、进程调度发生在时钟中断到来时 2、内核由于等待硬件资源而主动放弃cpu时。由于schedule()本身就是时钟中断例程的一部分,所以每次时钟中断到来时都会执行schedule()。当内核要访问的硬件资源还未准备好,此时进程进入睡眠状态执行schedule()切换到其他就绪态任务主动交出cpu使用权。

二、SCHEDULE()

schedule()函数是整个进程调度的核心,他首先要完成对所有进程的预处理,发送定时器信号给已达到定时时间的进程,唤醒有信号待处理的进程。简而言之就是将所有符合运行条件的进程都置为就绪态(TASK_RUNNING)。

28344e7091eaf626fd89de32d5cb50e3.png

kernel/sched.c

接下来就是调度算法的核心。从后往前遍历所有进程,挑选出运行时间最短的进程(进程的产生有先后,而且一旦被阻塞将导致大部分时间处于睡眠状态),这是一种公平调度算法让所有进程都尽可能平等地占用cpu不至于让某些进程“饿死”。

a146edaf9ab37871a7ec1bea3efbfd89.png

kernel/sched.c

如果所有就绪态进程的时间片都已经使用完就给所有进程加上counter/2+priority个时间片。注意此时可能还存在阻塞状态的进程,虽然他们的时间片没有使用完,但是不参加调度。对于就绪态进程,他们又获得priority个时间片,对于阻塞态进程,即使一直阻塞下去,一直获得时间片,时间片累加和也会有极限值而不会一直无限增长,这是一个设计很巧妙的地方。

在重新获得时间片之后再次进行比较选择出一个符合条件的进程。

三、进程切换

进程切换发生在switch_to,它是一个汇编宏。我发现Linux0.11中定义有很多的宏,使用宏替换函数调用将大大减少函数调用的开销,同时也减少了堆栈的使用,保持了堆栈的清洁。

392461e24ce3ee0cd21110b95f0ec9e0.png

include/linux/sched.h

这里定义了一个64位的临时变量作为临时的任务门,任务门的32~48位填充TSS选择子,其余位无效。数据交换指令将current变量和ecx寄存器交换,使current指向被选中的进程。ljmp长跳转指令如果跟的操作数是一个指向任务门的地址则此时发生任务切换,cpu将会自动把原来进程的现场保存到旧的TSS中,并且加载新的TSS。这里需要注意的是由于保存的现场是ljmp的下一条指令,所以当进程被切换回来的时候都是从cmpl指令开始运行,如果是因为时钟中断而导致的进程切换的话那么切换回来的时候还是在内核态,需要ret_from_sys_call来完成信号的处理并恢复到正常的用户空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值