linux内核--进程调度算法

本文探讨了Linux系统中的进程分类,重点介绍了内核线程、用户态线程等,并详细解析了CFS完全公平调度、实时调度(如SCHED_RR和SCHED_FIFO)以及多核调度算法,包括时间片、抢占式和优先级队列的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值