![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
进程管理
文章平均质量分 95
操作系统进程管理
奇小葩
学习,思考,总结
展开
-
linux进程管理(二十六) — 负载调节历代方案演变
下面是MTK的调度器的演变过程,我们顺着这个过程来学习下历代的调度器在手机系统上的演变过程。原创 2022-08-06 20:24:00 · 1147 阅读 · 0 评论 -
[一文搞懂]深入浅出linux同步机制
进程同步机制因为现代操作系统是多处理器计算的架构,必然更容易遇到多个进程,多个线程访问共享数据的情况,如下图所示:图中每一种颜色代表一种竞态情况,主要归结为三类:进程与进程之间:单核上的抢占,多核上的SMP;进程与中断之间:中断又包含了上半部与下半部,中断总是能打断进程的执行流;中断与中断之间:外设的中断可以路由到不同的CPU上,它们之间也可能带来竞态;本章主要是学习的内容如下:原子锁解决什么问题,有什么缺陷自旋锁解决什么问题,原理和应用场景睡眠锁解决什么问题,mutex和Sema原创 2022-02-13 22:36:03 · 1966 阅读 · 0 评论 -
linux进程管理(二十五)—负载均衡
linux进程管理—负载均衡前面主要是学习进程的调度管理,默认都是在单CPU上的调度策略,在O(1)调度后,为了减小CPU之间的干扰,就会为每个CPU上分配一个任务队列,运行的时候可能会出现有的CPU很忙,有的CPU很闲,为了避免这个问题的出现,甚至最极端的情况是,一个 CPU 的可运行进程队列拥有非常多的进程,而其他 CPU 的可运行进程队列为空,这就是著名的 一核有难,多核围观,Linux 内核实现了 CPU 可运行进程队列之间的负载均衡。1 什么是CPU负载提到负载,我们首先会想到命令upti原创 2022-01-29 22:12:30 · 6985 阅读 · 0 评论 -
linux进程管理(二十四)—实时调度
首先看看维基百科对实时操作系统的定义:实时操作系统(Real-time operating system, RTOS),又称即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。实时操作系统与一般的操作系统相比,最大的特色就是“实时性”,如果有一个任务需要执行,实时操作系统会马上(在较短时间内)执行该任务,不会有较长的延时。这种特性保证了各个任务的及时执行。实时操作系统 (Real-time OS) 是相对于分时操作系统 (Time-Sharing OS) 的一个概念。在一个原创 2022-01-27 23:20:57 · 1595 阅读 · 0 评论 -
进程管理(二十三)—组调度器
CFS的调度器颗粒是进程,但是在某些应用场景中,用户希望的调度颗粒是用户组,例如下面的用户场景,主要用到服务器场景中A用户要跑一个任务,因为要调用一个库,只能单线程跑B用户跑并行的任务,创建了100个线程跑那么对于CFS会发生什么呢?用户A可使用的CPU时间越来越少。这显然是不公平的对于服务器中,我们希望这两个用户可以平均的分配CPU时间,所以这在调度颗粒为进程的CFS是很难做到的,拥有进程数量多的用户将被分配比较多的CPU资源,因此,我们引入组调度(Group Scheduling )的概念。原创 2022-01-23 19:41:02 · 1227 阅读 · 0 评论 -
进程管理(二十二)—CFS调度器
进程管理(十八)—CFS调度器CFS是内核使用的一种调度器或调度类,它主要负责处理三种调度策略:SCHED_NORMAL、SCHED_BATCH和SCHED_IDLE。调度器的核心在挑选下一个运行的进程时有可能会遍历所有的调度类别。实际上系统大多数进程通常都是CFS调度类负责处理的,因此为了优化下一个进程的挑选调度器核心会先判断当前进程是否采用了CFS调度策略,若是,则直接调用CFS代码来挑选下一个进程,若不是或CFS代码未能挑选到一个合适的进程,则会调用各个调度类的挑选函数来寻找一个合适的进程。若CFS原创 2022-01-16 19:05:22 · 1926 阅读 · 0 评论 -
进程管理(十七)---cfs调度器基本概念
在O(n)和O(1)调度器中,时间片是一个很重要的概念,它决定了一个任务能够运行多长时间而不被抢占。对于内核,时间片的机制是这样的,每当系统时钟中断来临,调度器从当前任务的时间片中减去一个时钟周期,直至时间片耗完,这个时候当前任务返回用户空间会,换成其他任务执行,所以时间片的划分是调度器设计上重要的问题。为了解决上面问题,以往的调度器把动态优先级和时间片绑定在一起,高优先级的进程获得长的时间片,而低优先级的进程获得短的时间片,调度器优先调度具有时间片长的任务。但是这样分配不合理,时间片长的进程并不一定是当原创 2022-01-08 19:25:50 · 1583 阅读 · 4 评论 -
进程管理(二十一)---进程调度时机
上一章学习了调度的方式,分为主调度器和周期性调度器,明白了进程切换分为自愿(voluntary)和强制(involuntary)两种。自愿切换: 是指任务由于等待某种资源,将state改为非running状态后,主动调用schedule让出CPU任务因为等待 IO 操作完成或者其它资源而阻塞。任务显式地调用 schedule 前,把任务运行态设置成 TASK_UNINTERRUPTIBLE。保证任务阻塞后不能因信号到来而引起睡眠过程的中断,从而被唤醒。 Linux 内核各种同步互斥原语,如 M原创 2022-01-03 22:45:27 · 2656 阅读 · 0 评论 -
进程管理(二十)----进程调度器
对于调度器,一个很重要的是调度时机问题,在什么情况下,什么时候发生调度?也就是说在什么情况下,什么时候,把现在占用CPU的进程替换下来,根据进程生命周期的图示本章主要关注的是上图中schedule的调度时机,主要有两部分组成,一种是直接,比如上图中的进程等待资源的到位需要睡眠,或者处于其他的原因主动放弃CPU资源;另外一种是时间片耗尽而放弃调度,本章主要是结合源码,学习内容包括schedule()函数什么时候被调用主调度器和周期性调度器如何工作内核对于调度的各个场景是如何工作的1. 进程调原创 2021-12-26 21:38:35 · 1532 阅读 · 1 评论 -
进程管理(十九)----linux内核进程上下文(二)
我们知道当调用schedule函数进行主动调度时,首先会调用通过调度类找到下一个要被调度的进程,然后将当前进程切换状态放入对应调度类的调度队列里面,等待再次被唤醒。而对于被调度的这个队列我们就要对其进行上下文切换,上一章节我们学习了上下文切换的时候的基本原理后,本章主要是学习在最新的内核上基于ARM架构学习完整的进程上下文切换的过程,本文的内核版本号为linux4.9.88。1 context_switch代码分析在操作系统中把当前正在运行的进程挂起并恢复以前挂起的某个进程的执行,这个过程叫进程切换或原创 2021-12-08 23:31:30 · 2152 阅读 · 0 评论 -
进程管理(十八)--进程上下文切换(一)
学习了操作系统的基本原理和调度的相关知识,开始学习进程的上下文切换,本章主要要了解一下内容:用户级和内核级上下文切换的原理前面章节学习了进程由哪些部分组成,那么进程自身的上下文切换有哪些部分组成了何时发生进程的上下文切换进程间切换的线程和断点保存在哪里,结合linux0.11讲解进程切换的五部曲1 用户级线程上下文切换上文([进程管理(二)----线程的基本概念]((9条消息) 进程管理(二)----线程的基本概念_奇小葩-CSDN博客))中,我们讨论了何为多线程,而线程又分用户级线程和内核原创 2021-11-28 23:01:42 · 2159 阅读 · 0 评论 -
进程管理(十六)---进程调度演变过程之O(1)
上一章学习了O(n)调度器的设计,以及它的核心算法,其主要思路如下:O(n)调度器采用一个Runqueue运行队列来管理所有可运行的进程,在主调度schedule函数中选择一个优先级最高,也就是时间片最大的进程来运行,同时也会对喜欢睡眠的进程做奖励,去增加此类进程的时间片当Runqueue运行队列中无进程可选择时,则会对系统中所有的进程进行依次重新计算时间片的操作针对这个调度,虽然简单,但是也存在去缺点时间复杂度为O(n),当系统中就绪队列中的进程数目增多,那么调度器的运算量就会线性增长,为每原创 2021-06-14 20:20:19 · 454 阅读 · 0 评论 -
进程管理(十五)---进程调度演变过程之O(n)调度器
1 调度器概述任务调度器是操作系统中一个很重要的功能部件,主要功能是把系统中的task调度到各个CPU上去执行,满足如下的性能需求:调度器必须是公平的:(对于分时的进程,每个任务都应该有机会执行,不能饿死,保证每个进程得到合理的CPU时间)快速的进程响应时间:(对于交互式进程,需要和用户进行交流,因此对调度延迟比较敏感)高系统的吞吐量:(对于批处理进程进程,属于那种在后台的默默奉献的,因此它更注重吞吐量的需求)功耗要小:(对于移动式终端,功耗的需求其实一直以来都没有特别被调度器重视,当然在lin原创 2021-06-12 22:51:11 · 879 阅读 · 0 评论 -
进程管理(十四)--linux进程管理
1 linux进程分类当涉及有关调度的问题时, 传统上把进程分类为”I/O受限(I/O-dound)”或”CPU受限(CPU-bound)”.类型别名描述示例I/O消耗性I/O-Bound频繁进行I/O处理,并花很多时间等待I/O操作完成键盘等待输入、写磁盘CPU消耗性CPU-Bound花费大量时间进行数字计算,一直占用CPU大量数学计算另外一种分法把进程区分成三类类型描述示例交互式进程此进程经常需要与用户进行交互,因此需要花费很原创 2021-06-07 21:39:02 · 744 阅读 · 0 评论 -
进程管理(十三)---进程调度基本原理
1. 为什么需要调度进程调度的概念比较简单,我们假设在一个单核处理器的系统中,同一时刻只有一个进程可以拥有处理器资源,那么其他的进程只能在就绪队列中等待,等到处理器空闲之后才有计划获得处理器资源来运行。在这种场景下,操作系统就需要从众多的就绪进程中选择一个最合适的进程来运行,这个就是调度器需要做的事情。作为一个通用的操作系统,需要兼顾各种类型的进程,包括交互式进程、批处理进程、实时进程等。其特征如下:交互式进程: 与人机交互的进程,例如鼠标、键盘、触摸屏等相关的应用,这类进程的特点是系统响应时间越短原创 2021-06-06 22:43:55 · 2077 阅读 · 0 评论 -
进程管理(十二)--内核线程
在Linux系统中,前面我们接触了用户进程或用户进程,但是在实际的也是有内核线程的存在,例如我们在内存管理章节中熟悉的内存回收进程kswapd,软中断等。本章主主要包括内核线程的创建和结束的完整过程。1. Linux线程管理Linux内核在启动的时候,是没有线程的概念,当内核初始化完成后将启动一系列的线程,之后,CPU执行流就绑定在一个线程中运行,内核线程和用户线程的区别如下图所示:每一个线程创建之初都是内核线程;创建之后如果与具体的进程上下文绑定,那线程就成了用户线程如果绑定的内核线程,那么执行原创 2021-06-03 23:00:16 · 995 阅读 · 0 评论 -
进程管理(十一)---进程fork+vfork+clone
fork,vfork,clone都是linux系统调用,这三个函数分别调用sys_fork,sys_vfork,sys_clone,最终都会调用到do_fork函数。差别就在于参数的传递和一些准备工作的不同,上一章节已经详细学习了fork的流程,本章主要专注学习这三个接口函数的使用方法和差异点。1 进程的四要素linux进程所必须的四个要素:程序代码,有一段程序供其执行: 代码不一定是进程专有,可以与其它进程共享有自己专用系统堆栈空间:有进程控制块(task_struct):有独立的存储空间:原创 2021-06-02 21:16:17 · 1078 阅读 · 0 评论 -
进程管理(十)--进程的返回和终止
上一章学习了进程的创建,在用户空间可以使用fork接口来创建一个用户进程,或者使用clone接口来创建一个用户线程,它们在内核空间都会调用do_fork函数来实现,但是我们有两个疑问未得到解答fork接口,它可以是父、子进程都会返回,那么它会返回两次,其中父进程的返回值是子进程的PID,而子进程返回0,这个过程是如何的呢?子进程第一次返回用户空间时,它的返回在哪里呢?进程如何完成终止1. fork的执行过程当调用_do_fork()函数创建子进程后,子进程会加入到内核的调度器中,在调度器中参与原创 2021-05-31 21:23:48 · 744 阅读 · 0 评论 -
进程管理(九)--创建进程内存管理copy_mm
对于进程,除了0号进程,其他的所有进程(无论是内核线程还是普通线程)都是通过fork出来的,而创建进程是在内核中完成的要么在内核空间直接创建出所谓的内核线程要么是应用空间通过fork/clone/vfork这样的系统调用进入内核,再内核空间创建同上一章,我们完成的分析了fork的整个过程,fork分为两部分,一部分是初始化进程控制块,另外一部分是进程管理部分。本章的重点学习以下内容子进程如何构建自己的内存管理父子进程如何共享地址空间写时复制如何发生1. 写时复制技术在传统的unix操原创 2021-05-18 23:34:27 · 1418 阅读 · 0 评论 -
进程管理(八)--创建进程fork
在最新的版本的POSIX标准中,定义了进程创建和终止的操作,进程创建包括fork()和execve(),进程终止包括wait(),waitpid(),kill()以及exit()。Linux系统为了提高效率,把POSIX标准的fork()扩展为vfork和clone。前面一章我们学习了用GCC将一个最简单的程序(如hello world程序)编译成ELF文件,在shell提示符下输入该可执行文件并且按回车后,这个程序就开始执行了。起始这里shell会调用fork()来创建一个新进程,然后调用execve(原创 2021-05-17 21:43:47 · 1465 阅读 · 1 评论 -
进程管理(七)--进程的加载
我们常见的一个应用场景是,在shell中输入命令,然后等待命令返回。如果以进程创建和终止的角度来看,shell首先会读取命令,解析命令,创建自建成并执行命令,然后父进程在等待子进程终止,其如下图示对于用户空间的一个进程,首先我们需要编写对应的.c/.h文件,然后经过编译器编译成二进制的可执行文件,装载到硬盘上开始执行,最终生成用户进程,这里面涉及到很多细节,本章主要针对这些内容进行深入学习,主要包括以下内容对于程序员如何从文本文件到可执行的程序操作系统如何完成对于可执行文件加载1 程序的编译原创 2021-05-16 22:04:20 · 1417 阅读 · 4 评论 -
进程管理(六)--进程初始化
我们知道,对于内核提供的进程管理子系统,将来肯定是要运行各种各样的进程,对于我们做Linux内核开发的同学来说,大家熟悉Linux下有3个特殊的进程,其主要内容如下:Idle进程(PID = 0),本章主要讲解进程0是什么?Init进程(PID = 1),本章主要讲解进程1是什么?kthread(PID = 2),本章主要讲解进程2是什么?1 进程初始化(0号进程)内核的启动从入口函数 start_kernel() 开始;在 init/main.c 文件中,start_kernel 相当于内原创 2021-05-13 22:01:41 · 2032 阅读 · 0 评论 -
进程管理(五)--linux进程内核栈
在进程创建时,内核会为进程创建一系列数据结构,其中最重要的就是上章学习的task_struct结构,它就是进程描述符,表明进程在生命周期内的所有特征。同时,内核为进程创建两个栈,一个是用户栈,一个是内核栈,分别处于用户态和内核态使用的栈。本章主要包括以下内容内核栈的概念thread_info的用途1 内核态内核栈在每个进程的生命周期内,经常会通过系统调用(SYSCALL)或者中断进入内核。在执行系统调用后,这些内核代码所使用的栈并不是原先用户空间的栈,而是一个内核空间的栈,这个栈被称作进程的“内原创 2021-05-11 23:17:55 · 3316 阅读 · 5 评论 -
进程管理(四)--linux进程描述符task_struct
Linux内核涉及到进程和程序的所有算法都围绕一个名为task_struct的数据结构建立,对于Linux内核把所有进程的进程描述符task_struct数据结构链成一个单链表(task_struct->tasks),该数据结构定义在include/sched.h中。这是系统的中主要的一个数据结构,其进程管理task_struct的结构图如下1 任务ID每一个任务都应用有一个ID,作为这个任务的唯一标识。pid是进程的ID,tgid是线程的group ID,group_leader是进程组的组长原创 2021-05-10 23:00:09 · 1833 阅读 · 2 评论 -
进程管理(三)----linux进程管理起源
在学习Linux进程管理的知识之前,我们来从操作系统的发展说起,在每个阶段的发展历程中,每一个新的技术都是解决当前的技术瓶颈。操作系统的进程管理的发展和解决什么问题早期分时系统的内核实现,以linux0.11源码为主1. 我从哪里来人工控制时代在20世纪50年代中期,出现了人们历史上的第一代计算机,那个适合还需要程序员亲自手工操作穿孔的纸带卡片,当时的计算机一切数据和操作指令都是通过穿孔纸带输入的。 穿孔纸带利用一排孔表示一个字符,用穿孔或不穿孔表示1和0,来将指令和数据导入内存。当时,原创 2021-05-09 22:54:14 · 700 阅读 · 2 评论 -
进程管理(二)----线程的基本概念
在操作系统中引入进程的目的,是为了使多个程序能并发执行,以提高资源的利用率和系统的吞吐量,那么在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发行。本小节主要是学习以下内容什么是线程,为什么要引入线程与进程相比,线程有哪些特点用户线程内核线程1. 线程的引入我们以软件生活中,常见的应用为例,我们要编写一个MP4的播放软件,其核心功能模块有以下三个:磁盘文件中读取MP4数据对视频数据进行解码把解码后的视频数据进行播放对于目前采用进程的方法,原创 2021-04-06 21:46:26 · 932 阅读 · 3 评论 -
进程管理(一)--进程管理的基本概念
对于内存管理告一段落,今天正式开始进入内存管理的章节,首先从基础学习,主要是包括进程线程基础概念篇,主要包括以下内容为什么要引入进程的概念进程的概念,进程和程序的联系和区别进程控制块进程的状态模型1. 为什么要引入进程早期的计算机一次只能执行一个任务,采用批处理的方法,由监督系统完成作业的切换,使得作业一个接一个的被处理,如下图所示首先,由监督器将磁带上的第一个程序装入内存,并把运行的控制权交给作业当该作业批处理完成时,又把控制权交还给监督程序,再由监督程序把磁带上的第二个作业调入内原创 2021-04-05 18:17:52 · 6594 阅读 · 1 评论