当前位置: 首页 > 知识库问答 >
问题:

OS线程调度与cpu使用关系

萧渝
2023-03-14

正如我所知,对于线程调度,Linux实现了一个公平的调度器,而Windows实现了轮询(RR)调度器:每个线程都有一个执行时间片(如果我错了,请纠正我)。

我想知道,CPU的使用与线程调度有关吗?

例如:有2个线程同时执行,系统的时间片为15ms。cpu只有一个核心。

线程A需要10毫秒完成作业,然后睡眠5毫秒,在循环中运行。

线程B需要5毫秒来完成任务,然后睡眠10毫秒,也是在一个循环中。

>

  • CPU使用率会是100%吗?

    线程是如何安排的?线程A会用完所有的时间然后计划退出吗?

    还有一种情况:如果我运行了一个线程a,那么它就会被某些条件(例如网络)阻塞。CPU在100%时是否会影响此线程的唤醒时间?例如,线程B可能正在这个时间窗口中运行,那么线程a是否会被操作系统抢占?

  • 共有2个答案

    骆雅昶
    2023-03-14

    那么CPU使用率将是100%?

    理想情况下,答案是肯定的,理想情况下,我的意思是,您没有考虑在执行上下文切换时浪费的时间。实际上,CPU的利用率是通过让它一直保持忙碌来提高的,但是仍然有一些时间被浪费在上下文切换上(从一个进程或线程切换到另一个进程或线程所需的时间)。

    但我想说的是,在您的例子中,两个线程的时间约束都是完美地对齐的,以获得最大的CPU利用率。

    线程是如何调度的?线程会耗尽所有的时间,然后将其排出来吗?

    这真的取决于,在大多数现代操作系统实现中,如果准备好的队列中还有另一个进程,那么当前进程在使用CPU完成后就会被调度出去,不管它是否还有剩余的时间。所以,是的,如果你正在考虑一个现代的操作系统设计,那么线程A将在10毫秒后被安排出来。

    赏成益
    2023-03-14

    据我所知,Linux实现了公平调度程序,Windows系统实现了用于线程调度的循环调度程序(RR),

    Linux和Windows都使用基于优先级的抢占式线程调度程序。公平很重要,但严格来说,这不是目标。这些调度器的具体工作方式取决于系统的版本和风格(客户机与服务器)。通常,线程调度程序的设计目的是最大限度地提高响应速度,并减轻调度风险,如反转和饥饿。尽管某些调度决策是以循环方式做出的,但在某些情况下,调度程序可能会在队列的前面而不是后面插入抢占线程。

    每个线程都有一个执行时间片。

    时间片(或量子)实际上更像是一个指南,而不是一个规则。重要的是要理解时间片是可分割的,它等于一些可变的时钟周期数。调度器根据时钟周期而不是时间片对CPU使用情况进行收费。一个线程可以运行一个以上的时间片(例如,一个半时间片)。线程也可以自动放弃其剩余的时间片。这是可能的,因为线程放弃其时间片的唯一方法是执行系统调用(sleep、yield、acquire lock、request synchronous I/O)。所有这些都是特权操作,不能在用户模式下执行(否则,线程可以在不通知操作系统的情况下进入睡眠状态!)。调度程序可以将线程的状态从“就绪”更改为“等待”,并安排其他一些就绪线程运行。如果线程放弃其剩余的时间片,则在计划下次运行时不会对其进行补偿。

    一个特别有趣的情况是当线程运行时发生硬件中断。在这种情况下,处理器将自动切换到中断处理程序,即使线程的时间片尚未完成,也会强制抢占线程。在这种情况下,线程将不会被收取处理中断所需的时间。请注意,中断处理程序确实会利用CPU。顺便说一下,上下文切换本身的开销也不会计入任何时间片。此外,在Windows上,线程在用户模式或内核模式下运行的事实本身不会对其优先级或时间片产生影响。Linux,在内核的特定位置调用调度程序以避免饥饿(Linux2.5中实现的内核抢占)。

    所以CPU使用率将是100%?线程是如何安排的?线程A会用完所有的时间然后计划退出吗?

    现在很容易回答这些问题。当一个线程进入Hibernate状态时,另一个线程会被调度。请注意,即使线程具有不同的优先级,也会发生这种情况。

    如果我有一个线程运行,并阻止了一些条件(如网络).CPU 100%会影响这个线程的唤醒时间吗?例如,另一个线程可能在其时间窗口中运行并且将不会由OS调度出去?

    Linux和Windows调度器实现技术,使等待I/O操作的线程能够“快速唤醒”,并获得更高的快速调度机会。例如,在Windows上,当I/O操作完成时,等待I/O操作的线程的优先级可能会提高一点。这意味着它可以在完成时间片之前抢占另一个正在运行的线程,即使两个线程最初具有相同的优先级。当提升优先级的线程唤醒时,它的原始优先级将恢复。

     类似资料:
    • 多CPU与CPU间调度 SMP(对称多处理器)系统中,所有的CPU共享全部资源(总线,内存,I/O等),最大的特点就是所有资源共享,多个CPU之间没有区别。 NUMA(非一致内存访问)的基本特征是具有多个CPU节点,每个CPU节点由多个CPU组成,并且具有独立的本地内存与I/O槽口等。因此,虽然每个 CPU都可以访问整个系统的内存,但是访问本地节点内存的速度远远高于访问其它节点的内存。详见《SMP

    • 我读到java中的线程调度程序在单个进程中每次只运行一个线程。 假设我们有一个JVM运行一台CPU机器。因此,如果我启动10个线程,它们将由同一个线程调度程序管理。

    • 问题内容: 看起来我已经搞砸了Java线程/ OS线程和解释性语言。 在开始之前,我确实了解绿色线程是Java线程,其中JVM处理线程,并且整个Java进程仅作为单个OS线程运行。因此,在多处理器系统上是没有用的。 现在我的问题是。我有两个线程A和B。每个线程都有10万行独立代码。我在多处理器系统上的Java程序中运行这些线程。每个线程都将被赋予一个本机OS线程来运行,该线程可以在不同的CPU上运

    • SRTF cpu调度分为三个部分,一个进程花费cpu突发时间,然后是IO突发时间,接着是cpu突发时间。混乱的是,SRTF需要应用在哪个突发时间上,是在总cpu突发时间上还是仅在第一次cpu运行中给出的cpu突发时间(分别在第二次cpu突发时间)上?

    • 调度器 调度器的算法有许多种,我们将它提取出一个 trait 作为接口 os/src/algorithm/src/scheduler/mod.rs /// 线程调度器 /// /// 这里 `ThreadType` 就是 `Arc<Thread>` pub trait Scheduler<ThreadType: Clone + Eq>: Default { /// 优先级的类型 t

    • 主要内容:1 Java 线程调度程序,2 抢占式调度与时间片调度的区别1 Java 线程调度程序 Java中的线程调度程序是JVM(Java虚拟机)的一部分,它决定应该运行哪个线程。 我们无法保证线程调度程序将会选择哪个线程来运行。 一次只能在一个进程中运行一个线程。线程调度程序主要使用抢占式或时间片调度来调度线程。 2 抢占式调度与时间片调度的区别 在抢占式调度下,最高优先级的任务会一直执行,直到进入等待状态或死机状态或存在更高优先级的任务为止。 在时间分片调度下