首页 > 系统相关 >14 进程调度

14 进程调度

时间:2023-04-29 13:22:17浏览次数:37  
标签:调用 函数 调度 context 进程 CPU 14

进程调度的原因:

一是CPU同一时刻只能运行一个进程,并且CPU 的个数总是少于进程个数,就需要让进程共用一个CPU;二是当一个进程拿不到资源时就应该让出CPU,否则会一直霸占CPU;

1、管理进程:

进程的生命周期:

进程的状态:运行、睡眠、等待、新建、僵死;

组织进程:

设计思想:链表数据结构,一个优先级对应一个链表头;

schedclass_t 结构是一个总的全局结构,其中包含一个schdata_t结构数组,大小根据CPU数量决定,每个schdata_t 结构,包含一个进程优先级大小的thrdlst_t 结构数组,挂载进程;

管理进程初始化:

init_krlsched 函数:初始化schedclass_t 结构实例,调用schedclass_t_init 函数,逐级初始化上述 的三个结构数组;

init_krlsched 函数被内核功能层的入口函数init_krl 函数调用;

2、实现进程调度器:

停止运行当前进程,让CPU开始执行另一个进程;

进程调度器入口:

krlschedul接口函数:调用krlsched_retn_currthread 函数返回当前运行进程,接着调用 krlsched_select_thread 函数选择下一个运行的进程;最后调用save_to_new_context 函数从当前进程切换到下一个进程;

获取当前运行进程:

krlsched_retn_currthread 函数 ,先得到是哪个CPU的cpuid,借此通过获取数据结构中sda_currtd 成员得到当前运行的进程;

选择下一个进程:

这是进程调度算法的核心:关乎进程的吞吐量、能否及时响应请求、CPU的利用率、各个进程之间运行获取资源的公平性;

cosmos系统选择简单的一个调度算法:优先级高的作为下一个进程;

krlsched_select_thread 函数:从最高优先级开始扫描,若当前优先级的 链表不为空,取出该链表下的第一个进程,执行脱链,旧的当前进程先挂入链表尾,再将新的当前进程挂入tdl_curruntd 字段;

若扫描到最后,也没有找到进程,就返回默认的空转进程;

获取空转进程:

空转进程的必要性:调度器的功能必须是从一个切换到另一个进程,若没有下一个进程,且上一进程又不能运行,系统将停止运行;

krlsched_retn_idlethread 函数,与获取当前进程函数设计一样,只不过获取的schdata_t 结构中的sda_cpuidle 空转进程;

进程切换

进程在内核中的函数调用路径:通俗讲就是一个进程中的函数层层调用,直到调用进程调度器函数,中间的调用函数顺序就是函数调用路径;通过栈保存;

 save_to_new_context 进程切换函数:首先保存当前进程的通用寄存器到当前进程的内核栈中;

然后 保存CPU的RSP寄存器 到当前进程的机器上下文中,并且读取 保存在下一个进程机器上下文的RSP的值,把它存到CPU的RSP寄存器中;

接着 调用函数切换MMU页表;

最后从下一个进程的内核栈中恢复下一个进程的通用寄存器;

通过切换进程的内核栈,切换进程,因为进程的函数调用路径就保存在对应的内核栈中,只要调用 krlschedul 进程调度函数,最后的函数调用路径一定会停在 save_to_new_context 函数中,当 save_to_new_context 函数一返回,就会导致回到调用 save_to_new_context 函数的下一行代码开始运行,在这里就是返回到 krlschedul 函数中,最后层层返回;

这个机制的前提是:下一个进程已经被调度过,执行过krlschedul函数;

对于新建进程,没有调用过krlschedul 函数,需要特殊处理; 

__to_new_context 函数:负责设置当前运行的进程,处理CPU发生中断时需要切换栈的问题,又切换一个进程的MMU页表;如果是新建进程第一次运行,就调用retnfrom_first_sched 函数进行处理;

该函数不会返回到调用它的__to_new_context 函数,直接运行新建进程的代码;

 

标签:调用,函数,调度,context,进程,CPU,14
From: https://www.cnblogs.com/xuan01/p/17363728.html

相关文章

  • 【协程】进程,线程和协程
    进程进程,描述的是程序的执行过程,是运行着程序的代表,在操作系统中,每个进程的内存空间都是独立的,使用多进程并发有两个缺点:一是内核的管理成本高,而是无法简单地通过内存同步数据(进程运行的虚拟内存空间),很不方便,于是多线程模式就出现了。线程线程是操作系统能够运行运算调度的最......
  • [ARC144D] AND OR Equation
    ProblemStatementYouaregivenpositiveintegers$N$and$K$.Findthenumber,modulo$998244353$,ofintegersequences$\bigl(f(0),f(1),\ldots,f(2^N-1)\bigr)$thatsatisfyallofthefollowingconditions:$0\leqf(x)\leqK$forallnon-negative......
  • P3573 [POI2014]RAJ-Rally 题解
    非常好题目,爱来自xc。看到有向无环图,想到拓扑序。通过拓扑序,可以轻松求出以每个点为起点的最长路\(disS\)与每个点为终点的最长路\(disF\)。如何求总共的最长路?在\(disS,disF,disS_u+1+disF_v((u,v)\inE)\)中取最大值即可。注意最后一项,表示将连边的二点值相加。......
  • 13 进程
    进程:从进程的结构看:进程是一个应用程序运行时刻的实例;从进程的功能看:进程是应用程序运行时所需资源的容器;从操作系统对进程的实现角度看:进程是一堆数据结构;进程的结构:进程必须要有一个地址空间:这个地址空间包括至少两部分:一部分是内核,一部分是用户的应用程序;每个进程拥有x86......
  • 操作系统(3.1)--处理机调度和作业
    一、处理机调度层次1.高级调度(HighLevelScheduling)高级调度又称长程调度或作业调度,它的调度对象是作业。其主要功能是根据某种算法,决定将外存上处于后备队列中的哪几个作业调入内存,为它们创建进程、分配必要的资源,并将它们放入就绪队列。主要用于多道批处理系统中,而在分时和实......
  • cf-edu-142.D
    题目链接:https://codeforces.com/problemset/problem/1792/D算法:tire树求最长公共前缀(lcp)。反思:题目转换出的题意已大致得到,但怎么具体求不会。思路:tire树维护一个结构,1在哪些位置出现,2在哪些位置出现,以此类推。代码:#include<bits/stdc++.h>usingnamespacestd;consti......
  • 学系统集成项目管理工程师(中项)系列14_采购管理
    1. 概念和术语1.1. 采购是从项目团队外部获得产品、服务或成果的完整的购买过程1.2. 三大类1.2.1. 工程1.2.2. 产品/货物1.2.3. 服务2. 主要过程2.1. 编制采购管理计划2.2. 实施采购2.3. 控制采购2.4. 结束采购3. 合同3.1. 包括买方和卖方之间的法律文......
  • [oeasy]python0141_自制模块_module_reusability_复用性
    自制包内容回忆上次内容上次导入了外部的py文件importmy_module导入一个自己定义的模块 可以使用my_module中的变量不能直接使用my_module.py文件中的变量只要加my_module.作为前缀就可以  直接导入导入变量、函数frommy_mo......
  • [ABC143E] Travel by Car
    2023-02-20题目题目传送门翻译翻译难度&重要性(1~10):4.5题目来源AtCoder题目算法最短路解题思路我们枚举每一对点\((u_i,v_i)\)间的距离小于等于\(t\),那么只要在\(u_i\)加一次油就可以直接到\(v_i\)了,距离设为\(1\);若大于\(t\),那么在\(u_i\)加满油也不能直......
  • [ABC142E] Get Everything
    2023-02-18题目题目传送门翻译翻译难度&重要性(1~10):5题目来源AtCoder题目算法状压dp解题思路我们令\(S\)表示当前箱子状态,\(P_i\)表示第\(i\)把钥匙能开的箱子。设\(f_S\)表示开启当前状态箱子的最小花费。能得到转移方程:\(f_{P_i|i}=\min(f_{P_i|i},f_i+......