linux进程/线程调度策略(SCHED_OTHER,SCHED_FIFO,SCHED_RR)

本文深入解析Linux内核的三种调度策略:SCHED_OTHER分时调度、SCHED_FIFO实时调度及SCHED_RR时间片轮转调度。阐述了它们的工作原理、应用场景及优缺点,帮助读者理解如何在实时和分时任务并存的环境中合理配置调度策略。

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

目的:

  1. 系统性的认识linux的调度策略(SCHED_OTHER、SCHED_FIFO、SCHED_RR);
  2. 实时调度?分时调度?
  3. 混搭系统(实时任务+分时任务),怎样调度。

linux的调度策略

linux内核的三种 调度策略 :

  • SCHED_OTHER 分时调度策略,(默认的)
  • SCHED_FIFO实时调度策略,先到先服务
  • SCHED_RR实时调度策略,时间片轮转
    实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,
    分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。

实时调度SHCED_RR和SCHED_FIFO的差异:

实时调度:SHCED_RR和SCHED_FIFO,
SHCED_RR是SCHED_FIFO的优化版本。

相同点:

  • 都是实时调度
  • 创建时优先级大于0(1-99)。
  • 按照可抢占优先级调度算法进行。
  • 就绪态的实时任务立即抢占非实时任务。

不同点:相同优先级的任务调度方式不同

SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有 更高优先级任务到达或自己放弃。如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。==调度不公平。
而SHCED_RR可以让每个任务都执行一段时间。
为保证所有具有相同优先级的RR任务的调度公平,当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。

实际的系统调度流程描述:

当所有任务都采用分时调度策略时(SCHED_OTHER):

  1. 创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。
  2. 将根据每个任务的nice值确定在cpu上的执行时间( counter )。
  3. 如果没有等待资源,则将该任务加入到就绪队列中。
  4. 调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice)结果,选择计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。
  5. 此时调度程序重复上面计算过程,转到第4步。
  6. .当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。

当所有任务都采用FIFO调度策略时(SCHED_FIFO):

  1. 创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)。
  2. 如果没有等待资源,则将该任务加入到就绪队列中。
  3. 调度程序遍历就绪队列,根据实时优先级计算调度权值,选择权值最高的任务使用cpu, 该FIFO任务将一直占有cpu直到有优先级更高的任务就绪(即使优先级相同也不行)或者主动放弃(等待资源)。
  4. 调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。
  5. 如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步

当所有任务都采用RR调度策略(SCHED_RR)时:

  1. 创建任务时指定调度参数为RR, 并设置任务的实时优先级和nice值(nice值将会转换为该任务的时间片的长度)。
  2. 如果没有等待资源,则将该任务加入到就绪队列中。
  3. 调度程序遍历就绪队列,根据实时优先级计算调度权值,选择权值最高的任务使用cpu。
  4. 如果就绪队列中的RR任务时间片为0,则会根据nice值设置该任务的时间片,同时将该任务放入就绪队列的末尾 。重复步骤3。
  5. 当前任务由于等待资源而主动退出cpu,则其加入等待队列中。重复步骤3。

系统中既有分时调度,又有时间片轮转调度和先进先出调度:

  1. RR调度和FIFO调度的进程属于实时进程,以分时调度的SCHED_OTHER进程是非实时进程。
  2. 当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程 。
  3. RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR是FIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的未知决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?),如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。

出处:linux进程/线程调度策略(SCHED_OTHER,SCHED_FIFO,SCHED_RR)

<think>好的,我现在需要帮用户查找Linux内核中task_struct相关代码所在的文件位置。首先,我应该回忆一下自己了解的Linux内核结构相关知识。 用户提到的task_struct是Linux内核中非常重要的数据结构,用来表示进程线程的信息。根据之前的经验,进程管理相关的代码通常位于内核源码的某个特定目录下。比如,可能是在include/linux/sched.h头文件中定义task_struct结构体,因为sched.h通常包含调度相关的定义。不过,我需要确认这一点是否正确。 接下来,用户可能需要具体的文件路径。我需要回想内核源码的目录结构。一般来说,核心数据结构如task_struct可能会在include/linux目录下,而具体的实现代码可能在kernel目录下的某个子目录中,比如kernel/fork.c可能负责进程的创建和销毁,所以task_struct的初始化或相关函数可能在这里。还有,调度相关的实现可能在kernel/sched/目录下的文件中,例如core.c或某个具体的调度器文件。 另外,用户可能不仅需要结构体的定义位置,还想了解相关的实现文件。比如,进程状态管理、调度、信号处理等功能的代码可能分布在不同的文件中。例如,信号处理可能在kernel/signal.c中,进程间通信可能在ipc目录下,而内存管理可能和mm目录相关。 我需要确保提供的路径准确,所以最好参考官方内核源码或者可靠的文档。根据引用内容中的结构体如resv_map,虽然这和内存管理有关,但用户的问题是关于task_struct的,所以应该集中在进程管理部分。根据引用[2],线程的创建和销毁涉及资源管理,这可能与fork.c中的代码有关联,因为fork处理进程的创建。 总结一下,可能的文件路径包括: - include/linux/sched.h:定义task_struct结构体。 - kernel/fork.c:包含进程创建和销毁的代码,比如copy_process函数。 - kernel/sched/目录下的文件:处理调度相关的实现。 - 其他如kernel/exit.c处理进程退出,kernel/pid.c管理进程ID等。 需要检查这些文件是否确实包含相关代码。例如,在sched.h中查找struct task_struct的定义,确认其是否存在。同时,在fork.c中查找比如fork()系统调用的实现,里面应该会调用copy_process来创建新的task_struct实例。 最后,用户可能需要知道如何在内核源码中查找这些文件。比如使用git仓库,或者通过在线源码浏览工具。此外,不同内核版本可能会有路径变化,但主要结构通常保持稳定。所以建议用户根据自己使用的内核版本进行确认,或者参考官方文档。</think>在Linux内核中,`task_struct`结构体是进程管理的核心数据结构,其定义和相关实现分布在以下文件中: ### 1. **结构体定义位置** `task_struct`的完整定义位于: ``` include/linux/sched.h ``` 该文件包含进程调度、状态、上下文切换等基础定义,其中`task_struct`结构体记录了进程的PID、内存映射、信号处理、线程信息等所有元数据[^1]。 ### 2. **关键实现文件** - **进程创建与销毁** ```kernel/fork.c``` 包含`copy_process()`函数,负责复制父进程的`task_struct`结构体以创建新进程[^2]。 - **进程调度** ```kernel/sched/core.c``` 实现进程调度算法(如CFS),通过`task_struct`中的调度策略字段(`policy`)和优先级(`prio`)进行决策。 - **进程状态管理** ```kernel/exit.c``` 处理进程终止逻辑,如`do_exit()`函数会清理`task_struct`关联的资源。 - **进程ID管理** ```kernel/pid.c``` 管理进程的PID命名空间,通过`task_struct`中的`pid`和`tgid`字段实现。 ### 3. **相关功能扩展** - **信号处理** ```kernel/signal.c``` 通过`task_struct`的`sighand`字段处理信号队列和信号处理函数。 - **内存管理** ```mm/mmap.c``` 管理进程的虚拟内存映射(`vm_area_struct`),与`task_struct`中的`mm`字段关联。 - **线程实现** ```kernel/fork.c``` 线程进程共享`task_struct`结构,通过`CLONE_THREAD`标志区分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值