精华内容
下载资源
问答
  • 2020-03-11 20:24:18

    0.一个单核CPU如何执行多线程?原理?

    (1)单核cpu同一时间,cpu只能处理1个线程,只有1个线程在执行;
    (2)多线程同时执行,是cpu快速的在多个线程之间的切换;
    (3)cpu调度线程的时间足够快,就造成了多线程的“同时”执行;
    (4)如果线程数非常多,cpu会在多个线程之间切换,也会消耗大量的cpu资源;
    (5)如果线程数非常多,每个线程被调度的次数会降低,线程的执行效率也会降低。

    更多相关内容
  • 基于这种处理器提出了一种硬件线程调度器,该调度器采用同时多线程技术,最多可同时执行四个线程,支持八个线程阻塞模式下的快速上下文切换。这样避免了因阻塞带来的等待问题,能够有效提高处理器的工作效率和资源...
  • 西北工业大学操作系统实验 线程调度的优化与控制
  • Java线程调度方式

    2021-02-28 13:48:15
    在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略,对于CPU运算的分配都进行了规定,按照这些特定的机制为多个线程分配CPU的使用权。这小节关注...

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

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

    7f105e18806d1105addf099842353e95.png

    图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的时间则越长。

    展开全文
  • 重大软院操作系统实验二:线程调度,计算机操作系统原理,linux
  • 主要介绍了Java线程调度之线程休眠用法,较为详细的分析了Java线程休眠的功能与实现技巧,需要的朋友可以参考下
  • 所谓调度,是一个制定计划的过程,放在线程调度背景下,就是操作系统如何决定未来执行哪些线程? 就这道题目而言,可以抓两条主线 第一条是形形色色调度场景怎么来的? 第二条是每个调度算法是如何工作的? 先到...

    所谓调度,是一个制定计划的过程,放在线程调度背景下,就是操作系统如何决定未来执行哪些线程?

    就这道题目而言,可以抓两条主线

    • 第一条是形形色色调度场景怎么来的?
    • 第二条是每个调度算法是如何工作的?

    先到先服务

    • 早期的操作系统是一个个处理作业(Job),比如很多保险业务,每处理一个称为一个作业(Job)。处理作业最容易想到的就是先到先服务(First Come First Service,FCFS),也就是先到的作业先被计算,后到的作业,排队进行。
    • 这里需要用到一个叫作队列的数据结构,具有先入先出(First In First Out,FIFO)性质。先进入队列的作业,先处理,因此从公平性来说,这个算法非常朴素。另外,一个作业完全完成才会进入下一个作业,作业之间不会发生切换,从吞吐量上说,是最优的——因为没有额外开销。
    • 但是这样对于等待作业的用户来说,是有问题的。比如一笔需要用时 1 天的作业 ,如果等待了 10 分钟,用户是可以接受的;一个用时 10 分钟的作业,用户等待一天就要投诉了。 因此如果用时 1 天的作业先到,用时 10 分钟的任务后到,应该优先处理用时少的,也就是短作业优先(Shortest Job First,SJF)。

    短作业优先

    通常会同时考虑到来顺序作业预估时间的长短,比如下面的到来顺序和预估时间:

    这样就会优先考虑第一个到来预估时间为 3 分钟的任务。 我们还可以从另外一个角度来审视短作业优先的优势,就是平均等待时间。

    平均等待时间 = 总等待时间/任务数

    上面例子中,如果按照 3,3,10 的顺序处理,平均等待时间是:(0 + 3 + 6) / 3 = 3 分钟。 如果按照 10,3,3 的顺序来处理,就是( 0+10+13 )/ 3 = 7.66 分钟。

    平均等待时间和用户满意度是成反比的,等待时间越长,用户越不满意,因此在大多数情况下,应该优先处理用时少的,从而降低平均等待时长。

    采用 FCFS 和 SJF 后,还有一些问题没有解决。

    • 紧急任务如何插队?比如老板安排的任务。
    • 等待太久的任务如何插队?比如用户等太久可能会投诉。
    • 先执行的大任务导致后面来的小任务没有执行如何处理?比如先处理了一个 1 天才能完成的任务,工作半天后才发现预估时间 1 分钟的任务也到来了。

    为了解决上面的问题,我们设计了两种方案, 一种是优先级队列(PriorityQueue,另一种是抢占(Preemption)。

    1. 优先级队列(PriorityQueue)

    • 刚才提到老板安排的任务需要紧急插队,那么下一个作业是不是应该安排给老板?毫无疑问肯定是这样!那么如何控制这种优先级顺序呢?一种方法是用优先级队列。优先级队列可以给队列中每个元素一个优先级,优先级越高的任务就会被先执行。
    • 优先级队列的一种实现方法就是用到了堆(Heap)这种数据结构,更最简单的实现方法,就是每次扫描一遍整个队列找到优先级最高的任务。也就是说,堆(Heap)可以帮助你在 O(1) 的时间复杂度内查找到最大优先级的元素。
    • 比如老板的任务,就给一个更高的优先级。 而对于普通任务,可以在等待时间(W) 和预估执行时间(P) 中,找一个数学关系来描述。比如:优先级 = W/P。W 越大,或者 P 越小,就越排在前面。 当然还可以有很多其他的数学方法,利用对数计算,或者某种特别的分段函数。
    • 这样,关于紧急任务如何插队?等待太久的任务如何插队?这两个问题我们都解决了,接下来我们来看先执行的大任务导致后面来的小任务没有执行的情况如何处理?

    2. 抢占

    • 为了解决这个问题,我们需要用到抢占(Preemption)。
    • 抢占就是把执行能力分时,分成时间片段。 让每个任务都执行一个时间片段。如果在时间片段内,任务完成,那么就调度下一个任务。如果任务没有执行完成,则中断任务,让任务重新排队,调度下一个任务。

    拥有了抢占的能力,再结合之前我们提到的优先级队列能力,这就构成了一个基本的线程调度模型。

    线程相对于操作系统是排队到来的,操作系统为每个到来的线程分配一个优先级,然后把它们放入一个优先级队列中,优先级最高的线程下一个执行。

     每个线程执行一个时间片段,然后每次执行完一个线程就执行一段调度程序。

     图中用红色代表调度程序,其他颜色代表被调度线程的时间片段。调度程序可以考虑实现为一个单线程模型,这样不需要考虑竞争条件。

    上面这个模型已经是一个非常优秀的方案了,但是还有一些问题可以进一步处理得更好

    • 如果一个线程优先级非常高,其实没必要再抢占,因为无论如何调度,下一个时间片段还是给它。那么这种情况如何实现?
    • 如果希望实现最短作业优先的抢占,就必须知道每个线程的执行时间,而这个时间是不可预估的,那么这种情况又应该如何处理?

    为了解决上面两个问题,我们可以考虑引入多级队列模型

    3. 多级队列模型

    多级队列,就是多个队列执行调度。 我们先考虑最简单的两级模型,如图:

     上图中设计了两个优先级不同的队列,从下到上优先级上升,上层队列调度紧急任务,下层队列调度普通任务。只要上层队列有任务,下层队列就会让出执行权限。

    • 低优先级队列可以考虑抢占 + 优先级队列的方式实现,这样每次执行一个时间片段就可以判断一下高优先级的队列中是否有任务。
    • 高优先级队列可以考虑用非抢占(每个任务执行完才执行下一个)+ 优先级队列实现,这样紧急任务优先级有个区分。如果遇到十万火急的情况,就可以优先处理这个任务。

    上面这个模型虽然解决了任务间的优先级问题,但是还是没有解决短任务先行的问题。可以考虑再增加一些队列,让级别更多。比如下图这个模型:

    • 紧急任务仍然走高优队列,非抢占执行。
    • 普通任务先放到优先级仅次于高优任务的队列中,并且只分配很小的时间片;
    • 如果没有执行完成,说明任务不是很短,就将任务下调一层。
    • 下面一层,最低优先级的队列中时间片很大,长任务就有更大的时间片可以用。
    • 通过这种方式,短任务会在更高优先级的队列中执行完成,长任务优先级会下调,也就类似实现了最短作业优先的问题。
    • 实际操作中,可以有 n 层,一层层把大任务筛选出来。 最长的任务,放到最闲的时间去执行。要知道,大部分时间 CPU 不是满负荷的。

    总结

    线程调度都有哪些方法?

    • 非抢占的先到先服务的模型是最朴素的,公平性和吞吐量可以保证。
    • 但是因为希望减少用户的平均等待时间,操作系统往往需要实现抢占, 操作系统实现抢占,仍然希望有优先级,希望有最短任务优先。
    • 但是这里有个困难,操作系统无法预判每个任务的预估执行时间,就需要使用分级队列
    • 最高优先级的任务可以考虑非抢占的优先级队列
    • 其他任务放到分级队列模型中执行,从最高优先级时间片段最小最低优先级时间片段最大逐渐沉淀。
    • 这样就同时保证了小任务先行和高优任务最先执行。

     

    展开全文
  • 【操作系统】进程和线程调度

    千次阅读 2020-03-20 13:38:38
    进程调度的对象是进程或内核级线程,是最基本的一种调度。用于决定就绪队列中的哪个进程(或内核级线程,为叙述方便,以后只写进程)应获得处理机,然后再由分派程序执行把处理机分配给该进程的具体操作。 1 主要功能...

    目录

    进程调度

    1 主要功能和过程

    2 必要机制

    3 进程调度方式

    3.1 非抢占方式(Nonpreemptive Mode) 

    3.2 抢占方式(Preemptive Mode) 

    4 进程调度队列模型

    线程调度

    1 进程切换的弊端

    2 线程的引入

    3 线程的调度

    4 线程调度的优势

    windows的线程调度

    1 基于优先级的可抢占调度

    2 Windows调度原则

    Linux线程调度


    进程调度

    进程调度的对象是进程或内核级线程,是最基本的一种调度。用于决定就绪队列中的哪个进程(或内核级线程,为叙述方便,以后只写进程)应获得处理机,然后再由分派程序执行把处理机分配给该进程的具体操作。

    1 主要功能和过程

    1. 保存处理机的现场信息。在进程调度进行调度时,首先需要保存当前进程的处理机的现场信息,如程序计数器、多个通用寄存器中的内容等,将它们送入该进程的进程控制块(PCB)中的相应单元。 
    2.  按某种算法选取进程。低级调度程序按某种算法如优先数算法、轮转法等,从就绪队列中选取一个进程,把它的状态改为运行状态,并准备把处理机分配给它。 
    3. 把处理器分配给进程。由分派程序(Dispatcher)把处理器分配给进程。此时需为选中的进程恢复处理机现场,即把选中进程的进程控制块内有关处理机现场的信息装入处理器相应的各个寄存器中,把处理器的控制权交给该进程,让它从取出的断点处开始继续运行。

    2 必要机制

    为了实现进程调度,应具有如下三个基本机制: 

    • 排队器。为了提高进程调度的效率,应事先将系统中所有的就绪进程按照一定的方式排成一个或多个队列,以便调度程序能最快地找到它。 
    • 分派器(分派程序)。分派器把由进程调度程序所选定的进程,从就绪队列中取出该进程,然后进行上下文切换,将处理机分配给它。 
    • 上下文切换机制。当对处理机进行切换时,会发生两对上下文切换操作。在第一对上下文切换时,操作系统将保存当前进程的上下文,而装入分派程序的上下文,以便分派程序运行;在第二对上下文切换时,将移出分派程序,而把新选进程的 CPU 现场信息装入到处理机的各个相应寄存器中。 

    应当指出,上下文切换将花去不少的处理机时间,即使是现代计算机,每一次上下文切换大约需要花费几毫秒的时间,该时间大约可执行上千条指令。为此,现在已有通过硬件(采用两组或多组寄存器)的方法来减少上下文切换的时间。 一组寄存器供处理机在系统态时使用,另一组寄存器供应用程序使用。在这种条件下的上下文切换只需改变指针,使其指向当前寄存器组即可。 

    3 进程调度方式

    进程调度可采用下述两种调度方式。 

    3.1 非抢占方式(Nonpreemptive Mode) 

    在采用这种调度方式时,一旦把处理机分配给某进程后,不管它要运行多长时间,都一直让它运行下去,决不会因为时钟中断等原因而抢占正在运行进程的处理机,也不允许其它进程抢占已经分配给它的处理机。直至该进程完成,自愿释放处理机,或发生某事件而被阻塞时,才再把处理机分配给其他进程。

    这种调度方式的优点是实现简单,系统开销小,适用于大多数的批处理系统环境。但它难以满足紧急任务的要求——立即执行,因而可能造成难以预料的后果。

    3.2 抢占方式(Preemptive Mode) 

    这种调度方式允许调度程序根据某种原则去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。抢占调度方式是基于一定原则的,主要有如下几条:

    •  优先权原则。通常是对一些重要的和紧急的作业赋予较高的优先权。当这种作业到达时,如果其优先权比正在执行进程的优先权高,便停止正在执行(当前)的进程,将处理机分配给优先权高的新到的进程,使之执行;或者说,允许优先权高的新到进程抢占当前进程的处理机。 
    • 短作业(进程)优先原则。当新到达的作业(进程)比正在执行的作业(进程)明显的短时,将暂停当前长作业(进程)的执行,将处理机分配给新到的短作业(进程),使之优先执行; 或者说,短作业(进程)可以抢占当前较长作业(进程)的处理机。 
    • 时间片原则。各进程按时间片轮流运行,当一个时间片用完后,便停止该进程的执行而重新进行调度。这种原则适用于分时系统、大多数的实时系统,以及要求较高的批处理系统。

    抢占方式的优点是,可以防止一个长进程长时间占用处理机,能为大多数进程提供更公平的服务,特别是能满足对响应时间有着较严格要求的实时任务的需求。但抢占方式比非抢占方式调度所需付出的开销较大。

    4 进程调度队列模型

    进程的状态分别为:就绪(只要获取cpu资源即可执行)、执行(获取cpu正在执行)、阻塞(释放cpu资源,同时停止竞争cpu,直到被唤醒)。

    系统可以把处于就绪状态的进程组织成栈、树或一个无序链表,至于到底采用其中哪种形式,则与 OS 类型和所采用的调度算法有关。在目前,通常使用FIFO的队列来存储就绪进程,每当 OS 创建一个新进程时,便将它挂在就绪队列的末尾(入队时按创建顺序)。比如对于分时系统,采用抢占式的时间片原则进行进程调度,则每个进程在执行时都可能出现以下三种情况:

    1. 任务在给定的时间片内已经完成,该进程便在释放处理机后进入完成状态; 
    2. 任务在本次分得的时间片内尚未完成,OS 便将该任务再放入就绪队列的末尾; 
    3. 在执行期间,进程因为某事件而被阻塞后,被 OS 放入阻塞队列。

    调度模型如下:

    线程调度

    1 进程切换的弊端

    在以往的OS中,进程既是资源的拥有者,也是处理器调度的基本单位。

    对进程进行切换时,由于要保留当前进程的 CPU 环境和设置新选中进程的 CPU 环境,因而须花费不少的处理机时间。 换言之,由于进程是一个资源的拥有者,因而在创建、撤消和切换中,系统必须为之付出较大的时空开销。

    假设以分时系统为例,设定每个进程执行的时间片为20ms,这就意味着在N核CPU满载的情况下,通常每20ms就会切换N个进程;同时,一个进程只能在一个cpu核心上运行,若同一时刻只开启了一个进程,那么其他cpu核心会处于空闲状态。

    2 线程的引入

    因为进程是资源的拥有者,所以在进程的切换时必须切换进程所拥有的资源,因而须花费不少的处理机时间。为了解决这个问题,引入了线程。在引入了线程的操作系统中,通常一个进程都拥有若干个线程,至少也有一个,线程成为了处理器调度的基本单位。

    线程的引入使得进程仅仅是一个资源的拥有者,不再是作为调度和分派的基本单位。线程的特点如下:

    • 轻型实体。线程中的实体基本上不拥有系统资源,只是有一点必不可少的、 能保证其独立运行的资源。
    • 独立调度和分派的基本单位。在多线程 OS 中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻” ,故线程的切换非常迅速且开销小。
    • 可并发执行。多核处理器系统中,一个进程中的多个线程之间可以并发(并行)执行;同样,不同进程中的线程也能并发(并行)执行。 
    • 共享进程资源。在同一进程中的各个线程都可以共享该进程所拥有的资源。
    • 在同一进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时,将会引起进程的切换。

    3 线程的调度

    线程的调度与进程的调度采用相同的调度策略,但以线程为基本单位进行调度后,对整个系统的并发能力会有一个很大的提升。下面用图来描述线程调度的好处,这里假设处理器为3核,同时OS采用抢占式的时间片原则进行线程调度。

    首先,有两个进程A和B位于就绪队列中,以线程为单位进行调度:

    然后,经过一次分配之后:

    最后,假设线程A1,A2,B1在时间片用完后依然没有执行完,此时经过调度,会进行线程切换,线程A1,A2,B1放弃cpu并被加入就绪队列尾部,线程B2,B3,B4获得cpu资源并开始执行。

    4 线程调度的优势

    1. 一个进程内的线程可以并行执行,提高了并发性,加快了进程任务的处理。
    2. 线程基本不拥有资源,同一进程内线程的切换所费时间极小。

    windows的线程调度

    转载自论文:来源:《进程的多对多(M:N)线程模型研究》李晋。

    1 基于优先级的可抢占调度

    Windows操作系统的调度模块采用的是基于优先级的可抢占调度,保证了一定的实时性支持。Windows调度代码是在内核中实现的,但是这个调度器并不是一个单独的模块或者例程,而是在调度可能触发的位置设置了一个类似触发器的函数,它被称作Windows的分发器(dispatcher)。当一个线程变为就绪态时,或者有线程离开了运行态,再或者线程的优先级和处理器亲和性等发生了改变,都会触发分发器对线程的重新调度。

    Windows的优先级被分为32个级别:16个实时级别(16至31),该级别中的线程一定是最先运行,且优先级数不会发生浮动;15个可变级别(1至15),该级别中线程低于实时级别进程运行,其优先级可以根据需要由系统的负载均衡模块实时浮动,但是最高不可达到16;1个留给零页面线程的系统级别(0)。每个线程都有一个基本优先级,它是其进程优先级类别和相对线程优先级的一个函数,而线程的基本优先级根据进程基本优先级来计算。同时,线程还拥有一个当前优先级别,而调度是根据这个优先级别来进行调度判断的。在特定情况下,系统在很短的时间周期内会在动态范围(1至15)之内增加线程的优先级。在PRCB结构中有就绪线程队列整组DispatcherReadyListHead,其中每个队列都代表一个优先级,所有就绪线程就按照其优先级挂入其某个队列。

    2 Windows调度原则

    Windows的线程调度系统并没有Linux调度系统那么的复杂,其本身就遵循以下几个调度规则:

    1. 严格执行按优先级的调度,只要有高优先级就绪线程的存在,低优先级线程就不能得到运行机会。
    2. 如果有多个相同优先级的就绪线程存在,则按照各线程在就绪队列中的先后次序调度。
    3. 受调度运行的线程被赋予一个时间片,只要不被更高优先级的线程剥夺,则一直运行直到时间片耗尽。但耗尽之后应当适当降低其优先级(不会低于其基准优先级),然后按照实际优先级继续挂入相应就绪队列尾部。
    4. 运行中的线程因为需要待待某个事件发生而自愿暂时放弃运行进行睡眠,这时线程并不处于就绪状态,因则不挂入就绪队列。当等待事件发生时,该线程则挂入对应优先级的就绪队列或者直接变为“剥夺者”线程。
    5. 如果线程运行过程中有更高优先级线程变为就绪线程,则当前运行线程被剥夺。

    最后需要注意的是,Windows的‘剥夺式’调度中线程的调度与切换是分离的。即新调度线程并不会导致直接的线程切换。原因是如果此时是在中断服务处理阶段时,系统是不允许发生线程切换的,因为线程切换会引起堆栈的切换,这样的话中断返回时就会返回到另一个新线程的上下文中去运行。因此实际的线程切换可能会滞后一段时间到中断返回。windows的‘可剥夺’调度机制,从实时性角度上来讲还是有一定的条件限制的。

    Linux线程调度

    以下内容转自:https://blog.csdn.net/qq_38410730/article/details/81253686

    基于时间片原则、优先级原则的可抢占调度。

    在处理器资源有限的系统中,所有进程都以轮流占用处理器的方式交叉运行。为使每个进程都有运行的机会,调度器为每个进程分配了一个占用处理器的时间额度,这个额度叫做进程的“时间片”,其初值就存放在进程控制块的counter域中。进程每占用处理器一次,系统就将这次所占用时间从counter中扣除,因为counter反映了进程时间片的剩余情况,所以叫做剩余时间片。

    Linux调度的主要思想为:调度器大致以所有进程时间片的总和为一个调度周期;在每个调度周期内可以发生若干次调度,每次调度时,所有进程都以counter为资本竞争处理器控制权,counter值大者胜出,优先运行;凡是已耗尽时间片(即counter=0)的,则立即退出本周期的竞争;当所有未被阻塞进程的时间片都耗尽,那就不等了。然后,由调度器重新为进程分配时间片,开始下一个调度周期。

    Linux基于时间片调度的基本思想如下图所示:

    上面的调度方式主要体现的是一种公平性:如果一个进程的剩余时间片多,那么它在前期获得运行的时间片就少,为了公平性,就应该适当的赋予它更高的优先级。但是这仅仅是一个总体的原则,为了应付实际问题中的特殊状况,在上述平等原则的基础上,为了给特殊进程一些特殊照顾,在为进程分配时间片时,Linux允许用户通过一个系统调用nice()来设置参数nice影响进程的优先权

     

    展开全文
  • 线程调度图形化分析工具,根据优先级依次分行排列线程信息:分别显示 序号、优先级、线程名、线程调度运行图形化信息 可以统计运行次数、调度次数、实际运行时间、运行总时间(含被抢占时间)、有效运行时间比...
  • 什么是线程调度?

    千次阅读 2019-09-18 02:37:37
    线程调度有两种: 1.分时调度 分时调度就是所有线程轮流拥有(使用)cpu的使用权,平均分配每个线程占用cpu的时间 2.抢占式调度 抢占式调度就是优先让优先级高的线程使用cpu,如果线程的优先级相同,则会随机选择一个,...
  • 浅析Java的线程调度策略

    千次阅读 2019-03-13 23:52:34
    作者:杨兴强 原文来源:开点工作室(ID:kaidiancs) 一.... 看着Java线程执行起来的那种任性和随意,我们不免会...本文将带着这样的问题,探讨Java线程调度机制。 程序的问题还是先从代码说起吧,下面是一个广泛...
  • 基于pthread,实现的 thread scheduler 线程调度器,并行编程,四种调度算法,时间优先 fcfs (first come first serve), 权重优先 pdb (priority), 循环 round robin, 多层反馈 multi-level feedback queue。
  • 线程调度方式 抢占式调度 抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制,系统控制指的是在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片较长,甚至某些...
  • Java线程调度

    千次阅读 2018-09-28 11:32:28
    每个虚拟机都有一个线程调度器,确实在任何时刻运行哪个线程。有两种线程调度器: 1、抢占式(preemptive) 2、协作式(cooperative)  抢占式线程高度器确实线程何时已经公平地享用了CPU时间,然后暂停此线程上,...
  • 有两种调度模型:分时调度模型和抢占式(java默认使用)调度模型。 分时调度模型: 平均分配每个线程占用的 CPU 的...抢占式调度模型: 让优先级高的线程占用CPU,如果线程优先级相同,那么就随机选择一个线程。 ...
  • 基于Protothreads思路实现的一个可用于STC15系列单片的一个多线程及消息队列应用示例。可以在资源极少的单片上实现多线程调度
  • 线程数目不超过128,实现基于优先级的线程调度
  • android进程、线程调度简介

    千次阅读 2020-12-19 20:47:59
    2、怎样保证app的main thread、render thread等高优先级线程不会被其他低优先级的线程打断?3、app退到后台时,怎么限制其对cpu资源的占用?4、android是怎样支持ARM的big.LITTLE架构的?本文接下来将回答这几个问题...
  • 什么线程调度器: 线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 CPU 时间。 一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。同上一个问题,线程调度并不受到 Java 虚拟机...
  • Threadx 线程调度

    千次阅读 2020-02-05 13:56:47
    Threadx os 线程调度方法: 1,基于优先级的调度,高优先级线程抢占低优先级线程 2,同一优先级线程可以采用基于时间片轮转调度方式 3,线程主动挂起,其他线程获得调度执行 几种方式同时采用,联合进行线程调度。 ...
  • Java线程调度机制

    千次阅读 2019-06-25 11:54:50
    首先,我们来说一下两种不同的线程调度方式: 所有的Java虚拟机都有一个线程调度器,用来确定那个时刻运行那个线程。主要包含两种:抢占式线程调度器和协作式线程调度器。 1.抢占式线程调度,每个线程可能会有...
  • 衡量一个性能的高低好坏,每秒事务处理数(Transactions Per Second)是最重要的指标之一,它代表着一秒内服务端平均能响应的请求...并发不一定要依赖多线程,但是在Java里面谈论并发,大多数都与线程脱不开关系。此
  • 线程调度算法分析

    千次阅读 2017-08-10 09:01:52
    4.1.1 线程调度算法的总体描述 在分时系统中,内核给每个线程分配一段CPU时间,这段时间称为时间片,当这段时间过去之后,内核将调度另一个线程将其变为执行态。这就是所谓的时间片轮转法。 与UNIX中的线程调度...
  • 线程调度-------yield()

    千次阅读 2021-12-16 00:25:57
    static void yield() 暂停当前正在执行的线程对象并运行其他线程 暂停当前线程允许其他具有相同优先级的线程获得运行机会 public Static void yield(); 线程礼让只是提供一种可能,但是不能保证一定会实现礼让...
  • 线程同步以及线程调度相关的方法

    千次阅读 2019-03-12 17:16:37
    线程同步以及线程调度相关的方法 wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁; sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理 InterruptedException ...
  • 进程和线程调度算法

    千次阅读 2019-07-29 13:12:54
    调度算法是指:根据系统的资源分配策略所规定的资源分配算法,如任务A在执行完后,选择哪个任务来执行,使得某个因素(如进程总执行时间,或者磁盘寻道时间等)最小。对于不同的系统目标...
  • cuda 线程调度

    千次阅读 2020-03-28 16:56:42
    warp:线程束,一个线程束中的线程属于同一个线程块,GPU线程调度的基本单位,即GPU每次以warp数量的线程为单位进行调度。 线程调度 GPU具有成千上万的CUDA Core,同时也会有成千上万个线程需要执行。当一个kernel...
  • 线程池及线程调度

    千次阅读 多人点赞 2019-07-10 17:13:44
    线程池内部提供了一个线程队列,队列中保存着所有等待状态的线程,在开发过程中,合理地使用线程池能够带来以下3个好处: 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高...
  • java线程调度的两种方式: 一 协同线程调度 1.线程自己的工作执行完后,要主动通知系统切换到另一个线程上。 2.好处是实现简单,没有什么线程同步问题。 3.如果一个线程编写有问题,一直不告知系统进行线程切换...
  • C++线程调度策略

    千次阅读 2019-04-06 18:37:54
    1SCHED_OTHER:表示分时调度策略(也称轮转策略),是一种非实时调度策略,系统会为每一个线程分配一段运行时间,称为时间片。 2SCHED_FILO:先来先服务策略,支持优先级抢占。CPU让一个先来的线程执行完再调度下一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 409,981
精华内容 163,992
关键字:

线程调度

友情链接: jb707.zip