9.4 调度器的工作原理
多任务的本质
抢占cpu
什么是调度器
调度器是操作系统的核心:任务切换
多任务机制:多个任务轮流使用CPU,达到“并发”目的
任务:每个任务是无限循环的
时间片轮转:每个任务运行xx毫秒,由时钟或软中断完成
简单的调度器
/************************************************
* Filename: os_schedule.c
* Author: litao.wang
* Description:
* Create: 2018-07-11 21:39:22
* Last Modified: 2018-08-01 08:48:06
*************************************************/
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
int task_delay[4]={0};
void task1(void)
{
task_delay[0] = 10;
printf("task1...\n");
}
void task2(void)
{
task_delay[1] = 4;
printf("task2...\n");
}
void task3(void)
{
task_delay[2] = 4;
printf("task3...\n");
}
void task4(void)
{
task_delay[3] = 1;
printf("task4...\n");
}
void timer_interrupt(void) //计时器回调函数
{
for(int i=0;i<4;i++)
{
if(task_delay[i])
task_delay[i]--;
}
alarm(1); //计时器
}
void (*task[])(void)={task1,task2,task3,task4};
int main(void)
{
signal(SIGALRM,timer_interrupt);
alarm(1); //开启计时器1s
int i;
while(1)
{
for(i=0;i<4;i++)
{
if(task_delay[i]==0)
{
task[i]();
break;
}
}
}
return 0;
}
模块化调度器
/************************************************
* Filename: os_schedule_v2.c
* Author: litao.wang
* Description:
* Create: 2018-07-11 21:39:22
* Last Modified: 2018-08-01 08:19:15
*************************************************/
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
int task_delay[4]={0};
void task1(void)
{
task_delay[0] = 10;
printf("task1...\n");
}
void task2(void)
{
task_delay[1] = 5;
printf("task2...\n");
}
void task3(void)
{
task_delay[2] = 2;
printf("task3...\n");
}
void task4(void)
{
task_delay[3] = 1;
printf("task4...\n");
}
void timer_interrupt(void)
{
for(int i=0;i<4;i++)
{
if(task_delay[i])
task_delay[i]--;
}
alarm(1);
}
void (*task[])(void)={task1,task2,task3,task4};
void os_init(void)
{
task_delay[0] = 10;
task_delay[1] = 4;
task_delay[2] = 4;
task_delay[3] = 1;
signal(SIGALRM,timer_interrupt);
alarm(1);
}
void os_scedule(void)
{
int i;
while(1)
{
for(i=0;i<4;i++)
{
if(task_delay[i]==0)
{
task[i]();
break;
}
}
}
}
int main(void)
{
os_init(); //初始化,并拉起调度器
os_scedule(); //处理任务
return 0;
}
可抢占型调度器
– 不可抢占型:时间片轮转
– 可抢占型:高优先级任务先运行