抢占式多任务处理

我们可以问自己下面这个问题: 我的计算机只有一个处理器,然而在任务管理器中我们却可以看到数以百计的线程正同时运行在机器上!这怎么可能呢?

多亏了抢占式多任务处理,通过它对线程的调度,使得上述问题成为可能。调度器作为Windows内核的一部分,将时间切片,分成一段段的时间片。这些时间间隔以毫秒为精度且长度并不固定。针对每个处理器,每个时间片仅服务于单独一个线程。线程的迅速执行给我们造成了它们在同时运行的假象。我们在两个时间片的间隔中进行上下文切换。该方法的优点在于,那些正在等待某些Windows资源的线程将不会浪费时间片,直到资源有效为止。

之所以用抢占式这个形容词来修饰这种多任务管理方式,是因为在此种方式下线程将被系统强制性中断。那些对此比较好奇的人应该了解到,在上下文切换的过程中,操作系统会在下一个线程将要执行的代码中插入一条跳转到下一个上下文切换的指令。该指令是一个软中断,如果线程在遇到这条指令前就终止了(例如,它正在等待某个资源),那么该指定将被删除而上下文切换也将提前发生。

抢占式多任务处理的主要缺点在于,必须使用一种同步机制来保护资源以避免它们被无序访问。除此之外,还有另一种多任务管理模型,被称为协调式多任务管理,其中线程间的切换将由线程自己负责完成。该模型普遍认为太过危险,原因在于线程间的切换不发生的风险太大。如我们在4.2.8节中所解释的那样,该机制会在内部使用以提升某些服务器的性能,例如SQL Server2005。但Windows操作系统仅仅实现了抢占式多任务处理。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抢占任务调度系统是一种多任务处理,可以提高单片机的效率和运行速度。下面是一个简单的51单片机的抢占任务调度系统代码: #include <reg51.h> #define TASK_NUM 3 // 定义任务数量 #define TASK1_TIME 10 // 定义任务1的执行时间 #define TASK2_TIME 20 // 定义任务2的执行时间 #define TASK3_TIME 30 // 定义任务3的执行时间 unsigned char task_time[TASK_NUM]; // 存储每个任务已经执行的时间 unsigned char task_flag[TASK_NUM]; // 存储每个任务是否需要执行的标志位 void task1(void) { // 任务1的代码 } void task2(void) { // 任务2的代码 } void task3(void) { // 任务3的代码 } void main(void) { unsigned char i; TMOD = 0x01; // 定时器0工作在模1 TH0 = 0x3C; // 定时器0初值为0x3C TL0 = 0xB0; // 定时器0初值为0xB0 ET0 = 1; // 开启定时器0中断 EA = 1; // 开启总中断 TR0 = 1; // 启动定时器0 task_time[0] = TASK1_TIME; // 设置任务1的执行时间 task_time[1] = TASK2_TIME; // 设置任务2的执行时间 task_time[2] = TASK3_TIME; // 设置任务3的执行时间 task_flag[0] = 1; // 设置任务1需要执行 task_flag[1] = 0; // 设置任务2不需要执行 task_flag[2] = 0; // 设置任务3不需要执行 while (1) { for (i = 0; i < TASK_NUM; i++) { if (task_flag[i]) { switch (i) { case 0: task1(); break; case 1: task2(); break; case 2: task3(); break; default: break; } task_time[i] = 0; // 重置任务执行时间 task_flag[i] = 0; // 设置任务不需要执行 } } } } void timer0_ISR(void) interrupt 1 { unsigned char i; TH0 = 0x3C; // 定时器0初值为0x3C TL0 = 0xB0; // 定时器0初值为0xB0 for (i = 0; i < TASK_NUM; i++) { if (task_time[i] > 0) { task_time[i]--; // 减少任务执行时间 } else { task_flag[i] = 1; // 设置任务需要执行 } } } 在这个代码中,我们定义了3个任务,并设置了每个任务执行时间。在主循环中,我们使用一个for循环遍历每个任务执行标志位,如果标志位为1,则执行相应的任务代码。在定时器0中断中,我们使用一个for循环遍历每个任务执行时间,如果时间减少到0,则设置相应的执行标志位为1,表示该任务需要执行。这样,就可以实现简单的抢占任务调度系统了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值