精华内容
下载资源
问答
  • 操作系统调度策略

    2021-08-05 15:33:29
    单核调度策略 1.经典调度 1)先到先得(FIFO) 特点:简单直观,但在长短任务混合的场景下对短任务不友好,对I/O密集型任务不友好 2)最短任务优先(SJF) 在调度时会选择运行时间最短的任务执行 特点:必须...

    操作系统调度是为了再有限的资源下,通过对多个程序执行过程的国立,尽可能满足系统和应用的 指标,如等待响应时间,完成时间,系统得资源利用率、吞吐量、功耗等。

    设计一个令用户满意的调度器绝非易事,主要有以下挑战:

    • 调度指标多样性。不同场景下的调度指标的选取有所不同,用户在切换应用场景时,新旧场景的调度指标不一定适用。
    • 调度可参考的信息有限。调度器没有“上帝视角”,且应用场景可能动态变换,调度器只能通过有限的信息做出调度决策。
    • 任务间的复杂交互。同一程序的任务间可能会有相互关联的逻辑,需要相互依赖,调度器不能够独立地调度这些任务。
    • 许多地方存在权衡。调度器的设计实现与系统的设计实现一样,存在多种权衡。

    单核调度策略

    1.经典调度

    1)先到先得(FIFO)

    特点:简单直观,但在长短任务混合的场景下对短任务不友好,对I/O密集型任务不友好

    2)最短任务优先(SJF)

    在调度时会选择运行时间最短的任务执行

    特点:必须与之任务的运行时间,严重依赖于任务到达时间点

    3)最短完成时间任务优先(STCF)

    抢占式版本的SJF,在任务到达系统时回进行调度,有可能会终端当前正在执行的任务,转而执行其他任务,即抢占式调度

    特点:长任务饥饿,STCF策略倾向于完成时间较短的任务,长任务可能会无法占用CPU资源,一直处于饥饿状态。

    4)时间片轮转(RR)

    为了定时相应用户,需要为任务设置时间片,限定任务每次执行的时间,当前任务执行完时间片后,就切换到运行队列中的下一个任务。

    特点:RR策略的关键点在于时间片的大小,在任务运行时间相似的场景下平均周转时间高。

    2.优先级调度

    1)多级队列(MLQ)

    每个人物会被分配预先设置好的优先级,每个优先级对应一个队列,任务会被存储在对应的优先级队列中。

    特点:MLQ策略是一个静态优先级调度策略,但会出现低优先级任务饥饿的问题。

    2)多级反馈队列(MLFQ)

    在多级队列的基础上增加了动态设置任务优先级的策略。

    MLFQ维护多个优先级队列,任务根据优先级存于不同队列中,高优先级任务先于低优先级任务执行,处于相同优先级的任务则采用RR策略执行。MLFQ策略会先对任务的运行时间进行评估,预计运行时间较短的任务会放入优先级较高的队列中。

    特点:低优先级的任务采用更长的时间片,定时地将所有任务的优先级提升至最高。

    3.公平共享调度

    这类调度会量化任务对系统资源的占有比例,实现对资源的公平调度。

    1)彩票调度

    根据每个任务所占有的份额成比例地分配CPU时间,在每次调度时,会根据随机数确定任务是否被调度。任务所占的份额越大,随机数就越有可能落在它的份额之内,即越有可能会被调度。

    随机数带来的问题:彩票调度通过使用随机的方式实现一个简单而又近似公平共享的调度器,但是,随机数会导致某一任务占有CPU时间的比例,需要在该任务经历多次调度后,才能趋近于该任务的份额在所有任务总份额中的比例。

    基于彩票的优化方法:

    • 彩票转让
    • 彩票货币

           通过添加一层彩票货币的抽象,让任务组更加灵活地修改自己持有的份额,避免影响从属于它们的任务。

    • 彩票通胀

           给任务一定自由度,允许任务根据当前对CPU资源的需求决定自己的份额。

    2)步幅调度

    步幅调度通过设置虚拟时间的方式,让任务在每次调度时增加一定的虚拟时间,即步幅。经历虚拟时间相同的任务,它们使用的CPU时间之比就是步幅的倒数之比。即任务的份额之比对应于任务的步幅的倒数之比。

    4.实时调度

    实时操作系统是指需要实时处理任务请求的操作系统。

    分类:

    1)根据任务超过截止时间所造成的后果分类:

    • 硬实时任务

       该类任务必须在截止时间之前完成,否则系统无法承担任务处理超过截止时间的后果

    • 软实时任务

    该类任务允许偶尔超过截止时间完成,其后果可以接受的。

    2)根据被触发的时间分类:

    • 周期任务

    指到达系统时间遵循一定周期的任务

    • 偶发任务

    指不会周期性地到达系统的任务,且还要满足连续两个相同偶发任务到达系统的时间间隔有最小值,即系统不会在同一时刻处理两个相同的偶发任务。

    • 非周期任务

    指到达系统时间随机的任务。相比于偶发任务,非周期任务没有了相同任务间最小时间间隔的限制。

    1)速率调度(RM)

    是一个用于调度周期任务的静态优先级实时调度策略。

    该调度策略需要预知任务的周期T,并且根据周期静态地为每个任务分配优先级,任务的周期越短,意味着其截止时间要求越迫切,其优先级越高。

    2)最早截止时间优先(EDF)

    任务的截止时间越近则优先级越高·

    5.其他调度

    借用虚拟时间(BVT)

    BVT策略允许其“向自己的未来借用一定虚拟时间”。即BVT策略允许人物在短时间内将自己的pass值降低,以达到被优先调用的目的。

    多核调度策略

    在多核系统中,任务会同时在多个CPU核心上并行执行,相比于单核调度策略,多核调度策略需要考虑的因素更加复杂。

    1.负载分担

    2.协同调度

    协同调度的目的在于尽可能让一组任务并行执行,避免调度器同时调度有依赖关系的两组任务,同时避免关联任务执行效率低的问题。

    3.两级调度

    为了减少开销,每个任务尽可能只在一个CPU核心上进行调度。将任务绑定到特定的CPU核心上进行调度执行,避免了任务在多核间切换。

    为每个CPU核心都引入一个本地调度器,并用它管理对应核心上执行的任务。改调度策略使用全局调度器和本地调度器,构成了层级化结构。

    4.负载追踪与负载均衡

    负载均衡是通过追踪每个CPU核心当前的负载情况,将处于高负载的CPU核心管理的任务迁移到低负载的CPU核心上,尽可能地保证每个核心的负载大致相同。

    展开全文
  • 一 Linux内核的三种调度策略:1,SCHED_OTHER分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃3,SCHED_RR实时调度策略,时间片轮转。当...

    一 Linux内核的三种调度策略:

    1,SCHED_OTHER 分时调度策略,

    2,SCHED_FIFO实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃

    3,SCHED_RR实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平 Linux线程优先级设置

    SCHED_OTHER 是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。如果程序控制线程的优先级,一般是用pthread_attr_getschedpolicy来获取系统使用的调度策略,如果是 SCHED_OTHER的话,表明当前策略不支持线程优先级的使用,否则可以。

    二优先级范围的获得

    所设定的优先级范围必须在最大和最小值之间。

    int sched_get_priority_max(int policy);

    int sched_get_priority_min(int policy);

    三设置和获取优先级通过以下两个函数

    int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);

    int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);

    param.sched_priority = 51; //设置优先级

    四更改系统优先级初始值

    系统创建线程时,默认的线程是SCHED_OTHER。所以如果我们要改变线程的调度策略的话,

    可以通过下面的这个函数实现。

    int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

    上面的param使用了下面的这个数据结构:

    struct sched_param {

    int __sched_priority; //所要设定的线程优先级

    };

    例:创建优先级为10的线程

    pthread_attr_t   attr;

    struct   sched_param

    param;

    pthread_attr_init(&attr);

    pthread_attr_setschedpolicy(&attr,

    SCHED_RR);

    param.sched_priority   =

    10;

    pthread_attr_setschedparam(&attr,

    &param);

    pthread_create(xxx   ,

    &attr   ,   xxx   ,   xxx);

    例:设置最高优先级

    pthread_attr_t attr;

    struct sched_param  param;

    pthread_t  thread = pthread_self();//当前程序线程号

    int rs = pthread_attr_init( &attr );

    assert(

    rs == 0 );

    pthread_attr_setschedpolicy(&attr,SCHED_FIFO);//设置线程调度策略

    param.sched_priority   =

    sched_get_priority_max(SCHED_FIFO); //优先级设定

    rs = pthread_attr_setschedparam(

    &attr,  &param );//设置和获取schedparam属性pthread_attr_destroy(&attr);

    五编译

    编译命令:

    #g++

    pthread_priority3.c -o pthread_priority3 -lpthread

    否则,会有如下错误

    /tmp/cc21HcoW.o(.text+0x4c): In function `main':

    : undefined reference to `pthread_create'

    collect2: ld returned 1 exit status

    可以看出是在ld的时候系统无法找到pthread_create函数。也就是说编译器在link得时候找不到其中的一个使用库的函数。

    如果差pthread_create的话可以发现其在pthread.so中,所以需要增加

    -lpthread编译参数,告诉linker在link的时候使用pthread模块

    linux内核的三种主要调度策略

    linux内核的三种主要调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务 3,SCHED_RR实时调度策略,时间片轮转 实时进程将得到优先调用, ...

    操作系统 linux 内核的三种进程调度方法

    1.SCHED_OTHER 分时调度策略: 2.SCHED_FIFO 实时调度策略.先到先服务: 3,SCHED_RR 实时调度策略,时间片轮转 . 实时进程将得到优先调用,实时进程依据实时优先级决定 ...

    Linux虚拟机的三种网络连接方式

    Linux虚拟机的三种网络连接方式 虚拟机网络模式 无论是vmware,virtual box,virtual pc等虚拟机软件,一般来说,虚拟机有三种网络模式: 1.桥接 2.NAT 3.Host- ...

    Linux 下的三种时间介绍

    Linux 下的三种时间介绍: Access Time:简写为atime,表示文件访问的时间,当文件内容被访问时,更新atime时间 Modify Time:简写为mtime,表示文件内容修改的时间, ...

    (笔记)Linux内核学习(三)之进程调度

    进程调度: 在可运行态进程之间分配有限处理器时间资源的内核子系统. 一 调度策略 1 进程类型 I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状态,但运行时间短,等待 ...

    Linux操作系统下三种配置环境变量的方法

    现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 1.修改/etc/profile文件 如果你的计算机仅仅作 ...

    Linux操作系统下三种配置环境变量的方法——转载

    来源:赛迪网 作者:millio       现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 1.修改/e ...

    linux内核(三)文件系统

    1.为什么需要根文件系统 (1)init进程的应用程序在根文件系统上(2)根文件系统提供了根目录/(3)内核启动后的应用层配置(etc目录)在根文件系统上.几乎可以认为:发行版=内核+rootfs(4 ...

    软硬链接、文件删除原理、linux中的三种时间、chkconfig优化

    第1章 软硬链接 1.1 硬链接 1.1.1 含义 多个文件拥有相同的inode号码 硬链接即文件的多个入口 1.1.2 作用 防止你误删除文件 1.1.3 如何创建硬链接 ln 命令,前面是源文件  ...

    随机推荐

    <实训|第五天>通过搭建NFS,FTP实现共享文件附Vim脚本游戏

    先说个事情:我周末是不更新这个系列教程的,不过其他内容的会更新,我周末就整理这一周的各种内容到我的微信公众号中,提供给大家! 期待已久的linux运维.oracle"培训班"终于开 ...

    codeforces D

    D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...

    Intellij IDEA采用Maven+Spring MVC+Hibernate的架构搭建一个java web项目

    原文:Java web 项目搭建 Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring ...

    (转)JVM参数调优八大技巧

    这里和大家分享一下JVM参数调优的八条经验,JVM参数调优,这是很头痛的问题,设置的不好,JVM不断执行FullGC,导致整个系统变得很慢,网站停滞时间能达10秒以上,相信通过本文的学习你对JVM参数 ...

    mac 升级后 web 服务器起不来 问题

    4. Apache 要本地调试代码的时候发现Apache也不能幸免地跪了.执行apachectl -v发现Apache已经更新到2.4.9版本了.一定又是因为版本更新出了什么差错. 4.1 修改htt ...

    火狐HACK

    /*针对Firefox*/@-moz-document url-prefix() {    #nav{ width:200px; }}

    配置chrome支持本地(file协议)ajax请求

    将html代码拖拽进入chrome通过file协议浏览时,发送的ajax请求本地文件,会报跨域错误. XMLHttpRequest cannot load file:///E:/webs/extJS/ ...

    Linux内核源代码解析——用户发送数据包的起源之sendto

    本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/10162853 Jack:我想知道用户如何把数据发送到 ...

    常规DP专题练习

    POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...

    oracle如何链接到另外一个数据库DB_LINK

    命令创建从一个库连接的另外一个库: create database link DB_XXX  --创建连接的名字connect to db_xxx --数据库名identified by DB-XXX ...

    展开全文
  • Java多线程的调度策略

    2021-03-17 14:11:52
    Java多线程的调度策略。在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略,对于CPU运算的分配都进行了规定,按照这些特定的机制为多个线程分配CPU...

    Java多线程的调度策略。

    在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略,对于CPU运算的分配都进行了规定,按照这些特定的机制为多个线程分配CPU的使用权。这小节关注线程如何进行调度,了解了java线程调度模式有助于后面并发框架的深入探讨。

    一般线程调度模式分为两种——抢占式调度和协同式调度。抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制,系统控制指的是在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片较长,甚至某些线程得不到执行的时间片。在这种机制下,一个线程的堵塞不会导致整个进程堵塞。协同式调度指某一线程执行完后主动通知系统切换到另一线程上执行,这种模式就像接力赛一样,一个人跑完自己的路程就把接力棒交接给下一个人,下个人继续往下跑。线程的执行时间由线程本身控制,线程切换可以预知,不存在多线程同步问题,但它有一个致命弱点:如果一个线程编写有问题,运行到一半就一直堵塞,那么可能导致整个系统崩溃。

    21608.html

    21608.html

    图2-5-6-1

    为更加形象说明两种模式的不同,看图2-5-6-1,左边为抢占式线程调度,假如三条线程需要运行,处理器运行的路径是在线程一运行一个时间片后强制切换到线程二运行一个时间片,然后切到线程三,再回到线程一,如此循环直至三条线程都执行完。而协同式线程调度则不这样走,它会先将线程一执行完,线程一再通知线程二执行,线程二再通知线程三,直到线程三执行完。

    在了解了两种线程调度模式后,现在考虑Java使用的是哪种线程调度模式。此问题的讨论涉及到JVM的实现,JVM规范中规定每个线程都有优先级,且优先级越高越优先执行,但优先级高并不代表能独自占用执行时间片,可能是优先级高得到越多的执行时间片,反之,优先级低的分到的执行时间少但不会分配不到执行时间。JVM的规范没有严格地给调度策略定义,我想正是因为面对众多不同调度策略,JVM要封装所有细节提供一个统一的策略不太现实,于是给了一个不严谨但足够统一的定义。回到问题上,Java使用的线程调度是抢占式调度,在JVM中体现为让可运行池中优先级高的线程拥有CPU使用权,如果可运行池中线程优先级一样则随机选择线程,但要注意的是实际上一个绝对时间点只有一个线程在运行(这里是相对于一个CPU来说,如果你的机器是多核的还是可能多个线程同时运行的),直到此线程进入非可运行状态或另一个具有更高优先级的线程进入可运行线程池,才会使之让出CPU的使用权,更高优先级的线程抢占了优先级低的线程的CPU。

    Java中线程会按优先级分配CPU时间片运行,那么线程什么时候放弃CPU的使用权?可以归类成三种情况:

    当前运行线程主动放弃CPU,JVM暂时放弃CPU操作(基于时间片轮转调度的JVM操作系统不会让线程永久放弃CPU,或者说放弃本次时间片的执行权),例如调用yield()方法。

    当前运行线程因为某些原因进入阻塞状态,例如阻塞在I/O上。

    当前运行线程结束,即运行完run()方法里面的任务。

    三种情况中第三种很好理解,任务执行完了自然放弃CPU,前两种情况用两个例子说明,先看使用yield放弃CPU什么情况:

    public class YeildThread {

    publicstatic void main(String[] args) {

    MyThreadmt = new MyThread();

    mt.start();

    while(true) {

    System.out.println(“主线程”);

    }

    }

    }

    class MyThread extends Thread {

    publicvoid run() {

    while(true) {

    System.out.println(“被放弃线程”);

    Thread.currentThread().yield();

    }

    }

    }

    截取某段输出如下,输出“主线程”比“被放弃线程”运行的机会多,因为mt线程每次循环都把时间片让给主线程,正是因为yield操作并不会永远放弃CPU,仅仅只是放弃了此次时间片,把剩下的时间让给别的线程,

    主线程

    主线程

    主线程

    主线程

    主线程

    主线程

    被放弃线程

    主线程

    主线程

    主线程

    主线程

    主线程

    主线程

    主线程

    第二个例子为节省代码量将使用伪代码表示,例子简单但已能说明问题,运行程序将有两条线程工作,ioThread每次遇到I/O阻塞就放弃当前的时间片,而主线程则按JVM分配的时间片正常运行。

    public class IOBlockThread {

    publicstatic void main(String[] args) {

    IOThread ioThread = new IOThread();

    ioThread.start();

    主线程任务执行

    }

    }

    class IOThread extends Thread {

    publicvoid run() {

    while(true) {

    I/O阻塞

    }

    }

    }

    Java的线程的调度机制都由JVM实现,假如有若干条线程,你想让某些线程拥有更长的执行时间,或某些线程分配少点执行时间,这时就涉及“线程优先级”,Java把线程优先级分成10个级别,线程被创建时如果没有明确声明则使用默认优先级,JVM将根据每个线程的优先级分配执行时间的概率。有三个常量Thread.MIN_PRIORITY、Thread.NORM_PRIORITY、Thread.MAX_PRIORITY分别表示最小优先级值(1)、默认优先级值(5)、最大优先级值(10)。

    由于JVM的实现以宿主操作系统为基础,所以Java优先级值与各种不同操作系统的原生线程优先级必然存在某种映射关系,这样才足以封装所有操作系统的优先级提供统一优先级语义。例如1-10优先级值在linux可能要与0-99优先级值进行映射,而windows系统则有7个优先级要映射。

    线程的调度策略决定上层多线程运行机制,JVM的线程调度器实现了抢占式调度,每条线程执行的时间由它分配管理,它将按照线程优先级的建议对线程执行的时间进行分配,优先级越高,可能得到CPU的时间则越长。

    展开全文
  • CPU调度策略

    2021-09-25 20:27:24
    文章目录前言一、调度算法1.FCFS(First Come, First Served)2.SJF...需要有调度策略 CPU调度的直观想法: 1.FIFO:先进先出 (排队) 2.Priority:优先级高的先执行 面对复杂的场景,这两种几乎行不通的。 CPU..
      
    


    前言

    问题引入:
    当线程1阻塞,线程2 3都处于就绪态,该执行哪个呢?需要有调度策略

    在这里插入图片描述
    CPU调度的直观想法:

    1.FIFO:先进先出 (排队)
    2.Priority:优先级高的先执行

    面对复杂的场景,这两种几乎行不通的。

    CPU调度:即按一定的调度算法从就绪队列中选择一个进程,把CPU的使用权交给被选中的进程,如果没有就绪进程,系统会安排一个系统空闲进程或idle进程

    CPU调度时机:发生在内核对中断/异常/系统调用处理后返回到用户态时

    进程正常终止 或 由于某种错误而终止;
    新进程创建 或 一个等待进程变成就绪;
    当一个进程从运行态进入阻塞态;
    当一个进程从运行态变为就绪态。
    

    CPU调度算法衡量指标:

    吞吐量 (Throughput): 每单位时间完成的进程数目;
    
    周转时间TT (Turnaround Time):每个进程从提出请求到运行完成的时间;
    
    响应时间RT(Response Time):从提出请求到第一次回应的时间;
    
    CPU利用率(CPU Utilization):CPU做有效工作的时间比例;
    
    等待时间(Waiting time):每个进程在就绪队列(ready queue)中等待的时间;
    
    ……
    

    提示:以下是本篇文章正文内容

    一、调度算法

    设计调度算法的目的:

    1.面对用户,目的是让用户满意
    2.面对进程:CPU调度的目标是进程满意
    
    进程满意:
    尽快结束任务:周转时间(从任务进入到任务结束)短
    响应用户操作快:响应时间(从操作发生到响应)短
    系统内耗时间少:吞吐量(完成的任务量)
    
    总原则:系统专注于任务执行,又能合理调配任务
    

    1.FCFS(First Come, First Served)

    先来先服务算法(FCFS——First Come First Serve)

    按照进程就绪的先后顺序使用CPU。
    特点:非抢占,公平,实现简单,长进程后面的短进程需要等很长时间,不利于用户体验

    三个进程的处理时间分别为12,3,3,分两种进程到达顺序讨论
    在这里插入图片描述
    优点:调度算法简单

    缺点:
    1.平均等待时间波动较大,短的进程可能排在长的进程后面得到执行

    2.I/O资源和CPU资源利用率较低,CPU密集型进程会导致I/O设备闲置,I/O密集型进程会导致CPU闲置

    2.SJF(Shortest Job First)

    最短作业优先(SJF——Shortest Job First):
    具有最短完成时间的进程优先执行,非抢占

    在这里插入图片描述

    如果调度结果是 P1,P2,…,Pn,则平均周转时间为:
    P1 + P2 + P3 + … + Pn = ∑(n + 1 - i) * Pi
    P1的周转时间是 P1
    P2的周转时间是 P1 + P2
    ……
    Pn的周转时间中含有 n*P1 + (n - 1) * P2 + …
    P1 计算的次数最多,需要把最短的任务放在前边

    所以,这种方式平均周转时间最小。

    3.RR(Round Robin)

    时间片轮转调度算法(Round Robin——RR)
    每个进程被分配一个时间片,允许该进程在该时间段运行,如果在时间片结束时该进程还在运行,则剥夺CPU并分配给另一个进程,如果该进程在时间片结RR束前阻塞或结束,则CPU立即进行切换。

    特点:公平;有利于交互式计算,响应时间快;由于进程切换,时间片轮转算法要花费较高的开销;对进程表中不同进程的大小差异较大的有利,而对进程都是相同大小的不利。

    时间片设计需要避免的两点:

    1.时间片太大,等待的时间过长,极限的情况下退化成为FCFS算法

    2.时间片太小,反应过于迅速,产生大量的上下文切换,会影响到系统的吞吐量

    4.折中方案

    我们可以设置优先级,设置前台任务和后台任务,前台任务优先级高,后台任务优先级低,定义前台任务队列和后台任务队列,只有前台任务没有了才调度后台任务

    但是,如果一直有前台任务,后台任务一直得不到执行(优先级低的任务一直得不到执行)

    所以,任务的优先级要动态调整
    一般后台任务 耗时比较长,一旦后台任务转到前台执行,可能耗时很长,一直不释放CPU,前台任务的响应时间又没法保证,前后台任务都要设置时间片,后台任务转到前台,执行一段,要释放CPU,让其他任务执行
    在这里插入图片描述

    折中方案:短任务优先(减少周转时间)、以 轮转调度为核心,要设置优先级

    二、Schedule()

    schedule() 的目的是找到下一个任务 next,切换到下一个任务

    源码:

    // 任务0是一个闲置(idle)任务,只有当其他任务没有运行时才调用它
    // 它不能被杀死,也不能睡眠。任务0中的状态信息“state”是从来不用的
    
    void schedule(void)
    {
    	int i,next,c;
    	struct task_struct ** p; // 任务结构体的指针的指针
    
    /* check alarm, wake up any interruptible tasks that have got a signal */
    // 检查 alarm(进程的报警定时值),唤醒任何已得到信号的可中断任务
    
    	把p初始化为指向最后一个进程的地址的指针,逆向扫描所有进程,并跳过空指针
    	for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
    		if (*p) { //*p 指向当前进程的指针
    		//jiffies是系统从开机算起的滴答数(每10ms/滴答)
    			//判断定时器是否到期,如果到期需要在信号位图中置SIGALARM位,并且将定时器清0
    			if ((*p)->alarm && (*p)->alarm < jiffies) { 
    					(*p)->signal |= (1<<(SIGALRM-1));
    					(*p)->alarm = 0;
    				}
    			//如果信号位图中表示有非阻塞信号被递送,该任务的状态是可中断的,那么将该任务状态置为就绪
    			if (((*p)->signal & ~(_BLOCKABLE & (*p)->blocked)) &&
    			(*p)->state==TASK_INTERRUPTIBLE)
    				(*p)->state=TASK_RUNNING;   // 置为就绪可以执行状态
    		}
    
    /* this is the scheduler proper: */
    
    // 进程的调度
    	// 检查就绪的任务,判断下一个运行的任务。
    	while (1) {
    		c = -1;                 //从最后一个任务开始遍历任务数组
    		next = 0;
    		i = NR_TASKS;
    		p = &task[NR_TASKS];
    
    		//对就绪任务按照时间片进行排序 
    		//比较每个就绪状态任务的counter值(任务运行时间的递减滴答计数)
    		//哪一个值大,运行的时间还不长,next就指向哪一个任务号
    		while (--i) {
    			if (!*--p)
    				continue;
    			if ((*p)->state == TASK_RUNNING && (*p)->counter > c) //counter这里是时间片
    			//判断是就绪态,并且 counter>-1,就给c和next赋值,遍历找到最大的counter
    				c = (*p)->counter, next = i;
    		}
    
    		
    		//如果比较得出有counter值不等于0的结果,或者系统中没有一个可运行的任务存在
    		//则跳出循环,执行任务切换操作
    		if (c) break;
    
    		//如果所有任务的时间片都为0,那么重新计算各个任务的时间片,计算原则是根据优先级进行计算
          	//更新每个任务的counter值,然后再回到开始处比较
    		//计算方法:counter = counter/2 + priority
    		for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
    			if (*p)
    				(*p)->counter = ((*p)->counter >> 1) + //counter这里代表优先级
    						(*p)->priority;
    	}
    	//把当前任务指针current指向任务号为next的任务,并切换到该任务中运行
    	//若系统中没有其他可运行的任务,则next=0,所以调度去指向空闲任务
    	switch_to(next);    // 任务切换,切换到任务号为next的任务,并允许
    }
    

    1.counter(时间片)

    counter是典型的时间片, 所以是轮转调度, 保证了响应
    do_timer 中 counter 减到0,就schedule
    在这里插入图片描述

    2.counter(优先级)

    counter代表的优先级可以动态调整
    阻塞的进程再就绪以后优先级高于非阻塞进程
    在这里插入图片描述

    总结

    提示:这里对文章进行总结:

    调度函数的核心处理部分:这是根据进程的时间片优先权调度机制,来选择随后要执行的任务。

    它首先循环检查任务数组中的所有任务,根据每个就绪态任务剩余执行时间的值counter,选取该值最大的一个任务,并利用switch _(0)函数切换到该任务。

    若所有就绪态任务的该值都等于零,表示此刻所有任务的时间片都已经运行完,于是就根据任务的优先权值pitority,重置每个任务的运行时间片值counter,再重新执行循环检查所有任务的执行时间片值。

    展开全文
  • linux设置调度策略

    2021-05-15 14:11:40
    #includeint sched_setscheduler(pid_t ...sched_setscheduler()函数将pid所指定进程的调度策略和调度参数分别设置为param指向的sched_param结构中指定的policy和参数。sched_param结构中的sched_priority成员的值...
  • Yarn资源调度策略

    2021-01-01 10:56:54
    资源调度策略 Yarn既然是一个分布式资源调度框架,管理着节点上的计算资源,那它分配这些资源的时候,便会存在调度策略。 而Yarn的调度策略有三种:FIFO调度、容量调度、公平调度。接下来,会依次对这几种调度器进行...
  • 磁盘IO调度策略

    2021-05-17 11:19:56
    Linux内核有四个选择[noop] anticipatory deadline cfq,但大多数发行版使用默认的“CFQ”(完全公平队列)调度,它自2.6.18版本后一直是Linux的默认情况下的调度策略。这通常是一个很好的全面调度,并应提供良好的...
  • 2009年第5期商丘职业技术学院学报Vol.8,No.5 第8卷(总第44期)JOURNALOFSHANGQIUVOCATIONALANDTECHNICALCOLLEGEOct.,2009文章编号:1671-8127(2009)05-0042-03Linux系统中进程调度策略葛 君1,2,郑凤婷2(1....
  • 进程的调度策略

    2021-03-20 12:45:04
    进程调度策略 1.先来先服务调度算法 2.短作业优先调度算法 3.高优先权调度算法 4.高响应比优先调度算法 5.时间片轮换算法 6.多级反馈队列算法 **先来先服务调度算法:**先来先服务调度算法:先来先服务(FCFS)...
  • Red Hat Enterprise Linux 8的9种实时进程调度策略Red Hat Enterprise Linux 8使用是Linux内核版本是Kernel 4.18,其系统进程的实时调度策略有9种。在RHEL 8中,查看ps的帮助手册即可查到:# man ps |grep -A 10 ...
  • 进程调度策略

    2021-04-17 20:12:41
    进程调度策略 1、先来先服务(FCFS) FCFS为first come first server的缩写,即先来先服务之意。先来先服务调度算法是最简单的调度算法,以作业进入就绪队列的先后顺序进行顺序调度,既可用于作业调度也可用于进程...
  • 严格地说,对于优先级对于实时进程和普通进程的意义...2、对于实时进程而言,高优先级的进程存在,低优先级的进程是轮不上的,没机会跑在CPU上,所谓实时进程的调度策略,指的是相同优先级之间的调度策略。如果是FIFO...
  • Linux线程调度策略以及优先级实验 什么是线程调度策略? Linux内核共有三种调度算法,他们分别是: 1、SCHED_OTHER 分时调度策略, 2、SCHED_FIFO实时调度策略,先到先服务 3、SCHED_RR实时调度策略,时间片轮转 ...
  • 图形中的 Driver 表示 master,负责管理整个集群中的作业任务调度。图形中的 Executor 则是 slave,负责实际执行任务。 2.2、Spark核心组件 2.2.1、Driver Spark驱动器节点,用于执行Spark任务中的main方法...
  • Pod的调度策略

    2020-12-18 14:14:31
    Pod的调度策略Pod的调度策略主要概念主机层pod层污点(taints)与容忍(tolerations)调度使用指定主机组独占主机亲和性默认部署案例 Pod的调度策略 主要概念 主机层 nodeSelector 备注: 如果nodeSelectorTerms下面...
  • linux下默认的线程调度策略:linux下共有3种线程调度策略:SCHED_OTHER, SCHED_FIFO, SCHED_RR,打印出的值见下面:SCHED_OTHER=0SCHED_FIFO=1SCHED_RR=2经过测试,系统默认的调度策略是SCHED_OTHER。每个策略的...
  • 进程调度策略主要包括: 先来先服务 短作业优先 最短剩余时间优先 时间片轮转 优先级调度 先来先服务 非抢占式的调度算法,按照请求的顺序进行调度。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的...
  • 2、列表排列显示功能 Windows线程调度策略(超详细) Windows采用基于优先级的、抢占调度算法来调度线程。 用于处理调度的Windows内核部分称为调度程序,Windows调度程序确保具有最高优先级的线程总是在运行的。由于...
  • Hadoop作业调度策略

    2021-03-10 15:34:24
    作业调度策略有三种: 1、默认调度算法–FIFO队列策略: hadoop默认调度器,它先按照作业优先级的高低,再按照到达时间的先后来选择被执行的作业。 优点:调度算法简单,JobTracker工作负担轻。 缺点:忽略了不同...
  • linux调度策略

    2021-10-27 16:15:25
    如果不使用信号量g_thread_ind,那么线程2将一直循环执行,不过主进程的调度策略为普通调度策略,所以linux会分一点cpu时间给主进程来运行,但是线程1将不会得到调度。因为跑的服务器只有一个cpu,所以也无法为线程...
  • Linux的进行调度策略,一般有如下几种: RR、FIFO、OTHER等三种调度 通过PS命令输出如下:TS/FF/RR 通过命令行实现调整Linux任务调度策略。 以上,XXX
  • Flink调度策略优化:Task均衡 一、背景: flink任务部署使用基于k8s的standalone集群,先在容器上部署flink集群再提交flink任务,其中flink任务的提交与taskmanager的创建、注册是同时进行的。 二、问题 如果集群有...
  • 实时调度策略介绍实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,普通分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到...
  • 一、资源调度策略 多用户多作业的环境下,如何将集群资源在它们之间进行分配,需要特定的策略。 FIFO 公平调度器 能力调度器 延迟调度策略 主资源公平调度策略 1. FIFO 最简单的资源调度策略。 提交的作业,...
  • 前言:大部分情况下,kubernetes中的Pod只是容器的载体,通过Deployment、DaemonSet、RC、Job、Cronjob等对象来完成一组Pod的调度与自动控制功能。Pod调度是由Scheduler组件完成的,可见图中位置。Scheduler工作原理...
  • 日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 &... Linux进程管理与调度 ...1.1 进程调度 ...内存中保存了对每个进程的唯一描述, 并通过若干结构与其他进程...调度器面对的情
  • 李胜成摘 要:一种智能加工系统由8台计算机数控机床(CNC)、1辆轨道式自动引导车(RGV)、1条RGV直线轨道、1条上料传送带、1条下料传送带等附属设备组成。...故可得出动态调度后每个CNC的总等待时间最少,...
  • 通过之前的学习我知道了当前 Linux 系统下任务调度策略主要有三种: 1、SCHED_OTHER:普通任务调度策略。 2、SCHED_FIFO:实时任务调度策略,先到先服务。一旦占用cpu则一直运行,直到有更高优先级任务到达或自己...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 211,839
精华内容 84,735
关键字:

调度策略