9.4 调度器的工作原理

本文探讨了调度器在操作系统中的核心作用,通过实例对比讲解了时间片轮转和可抢占调度的区别。通过`os_schedule.c`和`os_schedule_v2.c`代码,展示了调度器如何实现任务的轮换与优先级处理。涉及的关键概念包括多任务、抢占CPU、任务切换和模块化设计。
摘要由CSDN通过智能技术生成

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;
}

可抢占型调度器

– 不可抢占型:时间片轮转
– 可抢占型:高优先级任务先运行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值