orange's学习--第六章:de两个进程交换执行

进程不外乎4个要素:进程表、进程体、GDT、 TSS。 

仿照进程A初始化,我们当然可以将这份代码复制一份,将其中涉及进程A的内容统统改成与进程B相关的代码。可是显然那样有些蹩脚,因为我们不可能每增加一个进程就复制一份代码,最好我们能够让代码在某种程度上实现一点自动化,让增加一个进程变得简单而迅速。   定义一个数组,循环遍历即可。一个进程只要有一个进程体和堆栈就可以运行了。

进程表很简单就是初始化一个数组,了解每个字段的意义即可。

一个进程如何由 “睡眠”状态变成 “运行”状态?无非是将esp指向进程表项的开始处,然后在执行lldt之后经历 一系列pop指令恢复各个寄存器的值。一切信息都包含在进程表中,所以,要想恢复不同的进程,只需要将esp指向不同的进程表就可以了。 

时钟中断调用的C语言程序编写的进程调度函数,进程表是一个数组,存储了所有进程的状态,仅仅修改全局变量p_proc_ready指向数组的不同下标,就可以完成进程切换。

PUBLIC void clock_handler(int irq)
{
    disp_str("#");
    p_proc_ready++;
    if (p_proc_ready >= proc_table + NR_TASKS)
        p_proc_ready = proc_table;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值