进程调度

进程,线程和协程

强颜欢笑 提交于 2020-04-06 10:50:27
1,任务调度 要理解进程和线程,必须要先了解一下操作系统的一些相关概念。大部分操作系统(如Windows、Linux)的 任务调度 是采用 时间片轮转的抢占式调度方式 ,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发(别觉得并发有多高深,它的实现很复杂,但它的概念很简单,就是一句话:多个任务同时执行)。多任务运行过程的示意图如下: 操作系统中的任务调度 2,进程 我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序侧是具有某种功能的程序,程序是运行于操作系统之上的。 进程 是一个具有一定独立功能的 程序在一个数据集上的一次动态执行的过程, 是应用程序运行的载体, 操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位 。 进程一般由程序、数据集合和进程控制块三部分组成。 程序用于描述进程要完成的功能

CPU 使用率低高负载的原因

倖福魔咒の 提交于 2020-03-29 17:44:27
CPU 使用率低高负载的原因 原因总结 产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低。 下面内容是具体的原理分析: 在分析负载为什么高之前先介绍下什么是负载、多任务操作系统、进程调度等相关概念。 什么是负载 什么是负载:负载就是cpu在一段时间内正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列的长度统计信息,这个数字越小越好(如果超过CPU核心*0.7就是不正常) 负载分为两大部分:CPU负载、IO负载 CPU负载 假设有一个进行大规模科学计算的程序,虽然该程序不会频繁地从磁盘输入输出,但是处理完成需要相当长的时间。因为该程序主要被用来做计算、逻辑判断等处理,所以程序的处理速度主要依赖于cpu的计算速度。此类cpu负载的程序称为“计算密集型程序”。 IO负载 还有一类程序,主要从磁盘保存的大量数据中搜索找出任意文件。这个搜索程序的处理速度并不依赖于cpu,而是依赖于磁盘的读取速度,也就是输入输出(input/output,I/O).磁盘越快,检索花费的时间就越短。此类I/O负载的程序,称为“I/O密集型程序”。 什么是多任务操作系统 Linux操作系统能够同时处理几个不同名称的任务。但是同时运行多个任务的过程中

erlang进程与操作系统线程

橙三吉。 提交于 2020-03-29 05:24:51
erlang多进程与多线程: 在erlang开发中,我们面对的最小执行单位是进程,当然这个进程并不是系统层面上的进程,也不是线程。而是基于erlang运行时系统的一个进程。那么erlang的多进程是如何变成系统级别上的多线程,进而被多核处理器处理呢? 其实,我们每启动一个erlang VM,实际上就启动了模拟器+erlang运行时系统。而每个erlang运行时系统会启动N个进程调度器,每个进程调度器都是一个独立的操作系统线程。这个调度器会处理一个进程池,进程池里面是M个erlang进程。也就是说erlang进程以1:M的方式映射到操作系统线程。 既然每个调度器都是一个操作系统线程,那么可并行运行的erlang进程最多就能有M个。虽然一个进程池内有M个进程,但是同一池内的进程仍像之前所有进程公用一个调度器那样分时运行。 并且在此之上,进程可以在进程池之间迁移以便维持可用调度器上的负载均衡。 erlang程序的单进程与多线程: 每启动一个erlang VM,也就启动了一个进程,该进程包括很多线程,最基本就包括了erlang运行时系统和模拟器所创建的线程。如果在该虚拟机上还运行erlang程序,那么ERTS就有可能为你的应用程序创建了N个线程。这些线程的个数,跟启动erlang VM时设置的参数和自身硬件环境有关

进程调度算法总结

五迷三道 提交于 2020-03-24 03:43:52
FCFS(First come first serve)先来先服务算法: 简单的排队算法,维护一个队列,后来的只能排在队尾等待。 非抢占。 缺点:不够智能,对于cpu密集型进程不友好,比如:一个只需要1ms运行时间的cpu密集型进程,但是之前有一个要读5s的io密集型进程。那么即使那个cpu密集型进程只需要运行1ms,但是必须等待足足5s才能运行! SJF(Shortest job first)最短作业优先: 这种算法假设我们可以预测每个进程需要运行的时间。比如有5个进程,分别运行时间是:1,3,2,5,1。 这个算法顾名思义,先取需要最短运行时间的进程来运行,所以执行顺序就是:1,1,2,3,5。其实就是算法里的贪心法。 SJF调度是最优调度(贪心法),但问题是怎么预测运行时间呢?所以其实这个算法只能作为比较,无法真正实现。 非抢占。 SJF算法还有一个变种:最短剩余时间优先。是选择剩余运行时间最少的进程来调度,所以这个算法是 抢占的 。 RR(Round robin)轮转调度: 每个进程被分配一个时间片,一般为20~50ms。每个进程只能最多使用一个时间片的时间,如果没用完时间片就运行完毕,那么可以直接调度下一个进程;如果用完了时间片还没运行完毕,系统会把该进程重新放到队尾。 时间片的选择是有要求的,因为在切换进程的时候要进行上下文切换。如果上下文切换的时间不比一个时间片小多少

[Mark] KVM 虚拟化基本原理

混江龙づ霸主 提交于 2020-03-17 06:06:53
X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机硬件。x86 架构提供四个特权级别给操作系统和应用程序来访问硬件。 Ring 是指 CPU 的运行级别,Ring 0是最高级别,Ring1次之,Ring2更次之…… 就 Linux+x86 来说, 操作系统(内核)需要直接访问硬件和内存,因此它的代码需要运行在最高运行级别 Ring0上,这样它可以使用特权指令,控制中断、修改页表、访问设备等等。 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作。如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作用户态和内核态的切换。 那么,虚拟化在这里就遇到了一个难题,因为宿主操作系统是工作在 ring0 的,客户操作系统就不能也在 ring0 了,但是它不知道这一点,以前执行什么指令,现在还是执行什么指令,但是没有执行权限是会出错的。所以这时候虚拟机管理程序(VMM)需要避免这件事情发生。 虚机怎么通过 VMM 实现 Guest CPU 对硬件的访问,根据其原理不同有三种实现技术: 1. 全虚拟化 2. 半虚拟化 3. 硬件辅助的虚拟化 1

计算机四级操作系统-3-进程线程模型

本小妞迷上赌 提交于 2020-03-16 18:29:25
第3章 进程线程模型 操作系统中最核心的概念是进程,这是对正在运行程序的一个抽象。操作系统的其他所有 内容都是围绕着进程的概念展开的,所以,透彻地理解进程是非常重要的。即使可以利用的 CPU 只有一个,但是通过进程,可以使系统具有支持并发操作的能力,可将一个单独的 CPU 变换 成多个虚拟的 CPU 。 本章通过大量的细节探究进程,以及进程中的运行实体 —— 线程。 3.1多道程序设计模型 采用多道程序设计可以提高 CPU 的利用率。多道程序设计技术充分发挥了处理器与外围 设备以及外围设备之间的并行工作能力,从而提高处理器和其他各种资源的利用率。下面从程 序的顺序执行、程序的执行环境和程序的并发执行几方面介绍多道程序设计模型。 3.1.1 程序的顺序执行 程序是一个在时间上按严格次序前后相继的操作序列,这些操作是机器指令或高级语言编 写的语句。人们习惯的传统程序设计方法是顺序程序设计,计算机也是以顺序方式工作的 : CPU 一次执行一条指令,对内存一次访问一个字节或字,对外部设备一次传送一个数据块。顺序处理 也是人们习惯的思考方法,为了解决一个复杂的问题,人们把它分解成一些较为简单、易于分析 的小问题,然后逐个解决。也可以把一个复杂的程序划分为若干个程序段,然后按照某种次序逐 个执行这些程序段。 我们把一个具有独立功能的程序独占 CPU 直到得到最终结果的过程称为程序的顺序执行。

Linux学习49 资源管理三板斧-htop、vmstat、dstat实战

丶灬走出姿态 提交于 2020-03-16 09:51:26
一、回顾   1、Linux OS基础概念,进程查看的几个工具   2、内核的功能:进程管理(进程调度)     进程调度:保存现场,恢复现场       task struct:任务结构       task list:任务列表     CPU:us,sy,ni,id,hi,si,cs,st     Memory:VSZ,RSS,SHM   3、命令     pstree,pgrep,pkill,ps,top,uptime 二、Linux进程管理及作业管理(2)   1、htop:top的升级版      来源: https://www.cnblogs.com/Presley-lpc/p/12501817.html

【原创】(五)Linux进程调度-CFS调度器

安稳与你 提交于 2020-03-15 02:10:15
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述 Completely Fair Scheduler ,完全公平调度器,用于Linux系统中普通进程的调度。 CFS 采用了红黑树算法来管理所有的调度实体 sched_entity ,算法效率为 O(log(n)) 。 CFS 跟踪调度实体 sched_entity 的虚拟运行时间 vruntime ,平等对待运行队列中的调度实体 sched_entity ,将执行时间少的调度实体 sched_entity 排列到红黑树的左边。 调度实体 sched_entity 通过 enqueue_entity() 和 dequeue_entity() 来进行红黑树的出队入队。 老规矩,先上张图片来直观了解一下原理: 每个 sched_latency 周期内,根据各个任务的权重值,可以计算出运行时间 runtime ; 运行时间 runtime 可以转换成虚拟运行时间 vruntime ; 根据虚拟运行时间的大小,插入到CFS红黑树中,虚拟运行时间少的调度实体放置到左边;

【原创】(四)Linux进程调度-组调度及带宽控制

馋奶兔 提交于 2020-03-10 23:36:21
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述 组调度( task_group )是使用Linux cgroup(control group) 的cpu子系统来实现的,可以将进程进行分组,按组来分配CPU资源等。 比如,看一个实际的例子: A和B两个用户使用同一台机器,A用户16个进程,B用户2个进程,如果按照进程的个数来分配CPU资源,显然A用户会占据大量的CPU时间,这对于B用户是不公平的。组调度就可以解决这个问题,分别将A、B用户进程划分成组,并将两组的权重设置成占比50%即可。 带宽( bandwidth )控制,是用于控制用户组( task_group )的CPU带宽,通过设置每个用户组的限额值,可以调整CPU的调度分配。在给定周期内,当用户组消耗CPU的时间超过了限额值,该用户组内的任务将会受到限制。 由于组调度和带宽控制紧密联系,因此本文将探讨这两个主题,本文的讨论都基于CFS调度器,开始吧。 2. task_group 组调度,在内核中是通过 struct task_group 来组织的,

进程、线程、协程之概念理解+线程和进程各自有什么区别和优劣

给你一囗甜甜゛ 提交于 2020-03-10 06:09:31
一、概念 首先,根据图了解一下串行,并行和并发的基本概念:   1、进程    资源分配的基本单位 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 Linux系统函数fork()可在父进程中创建一个子进程,在父进程接到新请求时,复制出一个子进程来处理,即父进程监控请求,子进程处理,实现并发处理。注意:必须是Linux系统,windows不能用fork。 组成 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 特征 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。 并发性:任何进程都可以同其他进程一起并发执行 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位; 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的