Skip to content

操作系统基本原理

根据任务的优先级进行分配

C
  1 #include <stdio.h>                                                                    //linux的系统函数用来产生中断
  2 #include <unistd.h>
  3 #include <signal.h>
  4 
  5 int task_delay[4] = {0};
  6 void task1(void)
  7 {
  8     task_delay[0] = 10;
  9     printf("task1..\n");
 10 }
 11 
 12 void task2(void)
 13 {
 14     task_delay[1] = 4;
 15     printf("task2..\n");
 16 }
 17 void task3(void)
 18 {
 19     task_delay[2] = 4;
 20     printf("task3..\n");
 21 }
 22 void task4(void)
 23 {
 24     task_delay[3] = 1;
 25     printf("task4..\n");
 26 }
 27 void timer_interrupt(void)
 28 {
 29     for(int i = 0; i < 4; i++)
 30     {
 31         if(task_delay[i])
 32             task_delay[i]--;
 33     }
 34     alarm(1);//设定下一次调用这个函数的时间
 35 }
 36 
 37 void (*task[])(void) = {task1, task2, task3, task4};
 38 
 39 int main(void)
 40 {
 41     signal(SIGALRM, timer_interrupt);
 42     alarm(1);
 43     int i;
 44     while(1)
 45     {
 46         for(i=0;i<4;i++)
 47             if(task_delay[i]==0)
 48             {
 49                 task[i]();
 50                 break;
 51             }
 52     }
 53 }

进行封装

C
  1 #include <stdio.h>                                                                    
  2 #include <unistd.h>
  3 #include <signal.h>
  4 
  5 int task_delay[4] = {0};
  6 void task1(void)
  7 {
  8     task_delay[0] = 10;
  9     printf("task1..\n");
 10 }
 11 
 12 void task2(void)
 13 {
 14     task_delay[1] = 4;
 15     printf("task2..\n"); 
 16 }
 17 void task3(void)
 18 {
 19     task_delay[2] = 4;
 20     printf("task3..\n");
 21 }
 22 void task4(void)
 23 {
 24     task_delay[3] = 1;
 25     printf("task4..\n");
 26 }
 27 void timer_interrupt(void)
 28 {
 29     for(int i = 0; i < 4; i++)
 30     {
 31         if(task_delay[i])
 32             task_delay[i]--;
 33     }
 34     alarm(1);
 35 }
 36 
 37 void (*task[])(void) = {task1, task2, task3, task4};
 38 
 39 void os_init(void)
 40 {//初始化任务的时间
 41     task_delay[0] = 10;
 42     task_delay[1] = 4;
 43     task_delay[2] = 4;
 44     task_delay[3] = 1;
 45     signal(SIGALRM, timer_interrupt);
 46     alarm(1);
 47 }
 48 void os_scedule(void)
 49 {//进行任务的切换
 50     int i;
 51     while(1)
 52     {
 53         for(i=0;i<4;i++)
 54             if(task_delay[i]==0)
 55             {
 56                 task[i]();
 57                 break;
 58             }
 59     }
 60 }
 61 
 62 int main(void)
 63 {
 64     os_init();
 65     os_scedule();
 66     return 0;
 67 
 68 }
  • 调度器:负责任务的切换,分为抢占型和不可抢占型,抢占型针对对时间要求较高的内核,可随时对任务打断不可抢占型是在任务时间段结束后进行切换