多处理器SMP系统结构--SMP结构中的进程调度

2024-09-03 13:36

本文主要是介绍多处理器SMP系统结构--SMP结构中的进程调度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

多核进程调度中,相关task_struct 结构中代表进程与CPU之间关系的变量

struct task_struct{...int has_cpu, processor;unsigned long cpus_allowed;...}

has_cpu:表示当前进程在CPU上正在运行;

processor:表示在哪个CPU上运行;

cpus_allowed:一个位图变量,其中一位,置1,表示允许这个进程接受调度在置1编号的CPU上运行。

系统中的进程调度

当一个CPU通过schedule()从系统的就绪队列中挑选一个进程作为运行的下一个进程next,其task_struct结构中的has_cpu字段置成1,并将processor设置成该CPU的逻辑编号。进行任务切换也就是进程状态、内存、寄存器、堆栈的切换,以及TLB的是否刷新等等。

asmlinkage void schedule(void)
{.../*                            * 1.Default process to select..*/                           next = idle_task(this_cpu);   .../* * 2.从运行队列中找到能够调度运行的进程next。*/list_for_each(tmp, &runqueue_head) {                        ____p = list_entry(tmp, struct task_struct, run_list);      ____if (can_schedule(p, this_cpu)) {                        ________int weight = goodness(p, this_cpu, prev->active_mm);________if (weight > c)                                     ____________c = weight, next = p;                           ____}                                                       }.../** 3.如果是多核处理器,则更新进程 task_struct 中的标志*/next->has_cpu = 1next->processor = this_cpu;.../** 4. prepare_to_switch()*/
____{                                             
________struct mm_struct *mm = next->mm;          
________struct mm_struct *oldmm = prev->active_mm;
________if (!mm) {    /* 如果是内核线程*/
____________if (next->active_mm) BUG();           
____________next->active_mm = oldmm;              
____________atomic_inc(&oldmm->mm_count);         
____________enter_lazy_tlb(oldmm, next, this_cpu);/*暂时先不更新TLB*/
________} else {    /*如果是用户空间线程*/
____________if (next->active_mm != mm) BUG();     
____________switch_mm(oldmm, mm, next, this_cpu);/**/
________}                                         ________if (!prev->mm) {                          
____________prev->active_mm = NULL;               
____________mmdrop(oldmm);                        
________}                                         
____}.../** 5.                                             
____ * This just switches the register state and the
____ * stack.                                       
____ */                                             
____switch_to(prev, next, prev);/** 6. 尝试再次运行:在剩下的CPU中,寻找能替换的进程,也就是“运行优先级”最低的进程。 */
______schedule_tail(prev);                          ...
}

根据在CPU中运行的prev进程与next进程的不同,所处理细节也不同。prev进程发生切换的方式主要如下:

  1. 自愿礼让: (prev->policy &=  ~SCHED_YIELD) && (prev->state = TASK_RUNNING)
  2. 被剥夺: (prev->policy  & SCHED_YIELD == FALSE) && (prev->state = TASK_RUNNING)

2.被剥夺再次尝试运行:reschedule_idle()

2.1 首先尝试在当前CPU再次运行

        can_schedule(p, p->processor)

2.2 如果不能在当前CPU运行,则考察系统中所有CPU。如果找到能运行的CPU,当前这个CPU上运行的进程为被剥夺的候选对象。找出所有可被剥夺的所有候选对象中最合适的那个,然后替换执行。

被替换进程最合适的标准:运行时间最长,资格最低的进程。

这篇关于多处理器SMP系统结构--SMP结构中的进程调度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133102

相关文章

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux进程终止的N种方式详解

《Linux进程终止的N种方式详解》进程终止是操作系统中,进程的一个重要阶段,他标志着进程生命周期的结束,下面小编为大家整理了一些常见的Linux进程终止方式,大家可以根据需求选择... 目录前言一、进程终止的概念二、进程终止的场景三、进程终止的实现3.1 程序退出码3.2 运行完毕结果正常3.3 运行完毕

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

linux本机进程间通信之UDS详解

《linux本机进程间通信之UDS详解》文章介绍了Unix域套接字(UDS)的使用方法,这是一种在同一台主机上不同进程间通信的方式,UDS支持三种套接字类型:SOCK_STREAM、SOCK_DGRA... 目录基础概念本机进程间通信socket实现AF_INET数据收发示意图AF_Unix数据收发流程图A

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring