多处理器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

相关文章

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径