linux进程可分为:CPU消耗型和I/O消耗型
linux内核的调度器倾向于提高系统的响应性(桌面系统的实时响应)
一,进程分类及优先级
1,linux内核进程主要分为: 内核线程(内存管理,中断)、用户态线程(用户需求)、实时进程(时钟控制系统)、守护进程(日志,网络)及轻量级进程。
2,linux内核中进程优先级:实时优先级和普通优先级。
实时优先级:轮流调度(时间片机制 SCHED_RR)和先进先出(SCHED_FIFO)(进程一直运行,直到更高优先级抢占/自己不想运行了)
普通优先级:CFS(完全公平调度)(每个进程有虚拟运行时间,每个时间片执行完,选择优先级最高的执行)和nice值(反比优先级,最高-20,最低19)。
实时优先级高于普通优先级
二,时间片及调度算法
1,时间片 是OS将CPU将分配给进程执行的时间段(默认的时间片大小是10ms)。时间片的大小可以通过修改内核参数来修改。
2,linux内核调度算法:CFS(完全公平调度算法)、RT(实时调度算法)(时间敏感场景)、MLFQ(多级反馈队列调度算法)(将进程按照优先级分很多队列,每个队列时间长长度不一样,优先级越高,时间片越短)、RR(轮转调度算法)(先来先后顺序)。
三,多核调度原理与算法
1,linux内核的多核原理机制基于:时间片、抢占式、优先级队列。
2,linux内核的多和调度算法:CFS(完全公平调度器 时间片)和实时调度(FIFO,Deadline截止期调度算法,RR)。
3,CFS调度算法:基于红黑树的时间片轮转调度算法,CFS基本核心思想:为了每个任务维护一个虚拟运行时间来决定下一个被调度的任务。
实现模式:将所有正在执行的任务插入到一颗红黑树中,树节点按照虚拟运行时间进行排序,调度器优先选择最小运行时间的节点作为下一个执行任务,并且将它移到树的末尾(大家都会得到相当的CPU时间)。
优点:公平性和扩展性
缺点:可能导致上下文切换频率不断增加,因为每次调度时需要遍历整个红黑树找到最小虚拟运行时间的节点。
四,linux内核CFS(完全公平调度器)实战应用
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_PROCESS 20
struct cfsProcess{
int pid; //进程ID
int arrival_time; //到达时间
int brust_time; //突发时间 执行整个过程的时间
int remaining_time; //剩下多少时间
int waiting_time; //等待时间
int trunaround_time; //周转时间
float response_ratio; //响应系数
}
//初始化进程
void Init_ProcessFunc(struct cfsProcess process[], int num_process){
}
//打印进程信息
void Disp_ProcessFunc(struct cfsProcess[], int num_process){
}
//此函数算法功能:按照进程到达的先后顺序进行调度
void fcfs_Func(struct cfsProcess process, int num_process){
}
//此函数功能:按照进程执行时间的长短进行调度
void fjf_Func(struct cfsProcess process[], int num_process){
int icurrent_time = 0;
int i = 0;
for( i = 0;i < num_process;i++){
if(icurrent_time < process[i].arrival_time){
icurrent_time = process[i].arrival_time;
}
process[i].waiting_time = process[i].icurrent_time - process[i].arrival_time;
process[i].trunaround_time = process[i].waiting_time + process[i].brust_time;
process[i].response_ratio = 1.0;
icurrent_time = icurrent_time + process[i].brust_time
}
}
//此函数功能:抢占式算法,每次选择剩余时间最短的进程进行调度
void srtf_Func(struct cfsProcess process[], int num_process){
}
//此函数功能:规则为时间片轮转调度算法
//在时间片用完之前/执行完毕之前, 进程将会被挂起等待下一次被调度
void rr_Func(struct cfsProcess process[], int num_process, int time_quantum){
}
int main(){
return 0;
}