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

相关文章

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

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