OS线程调度和cpu使用关系

时间:2018-03-28 10:16:03

标签: windows multithreading linux-kernel operating-system scheduler

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

我想知道,CPU使用率是否与线程调度相关?

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

线程A需要10毫秒才能完成作业,然后休眠5毫秒,循环运行。

线程B需要5ms才能完成工作,然后在一个循环中休眠10ms。

  1. CPU使用率是否为100%?

  2. 如何安排线程?线程A会用尽所有时间然后安排出来吗?

  3. 另一个场景: 如果我运行了一个线程A,那么它会被某些条件阻塞(例如网络)。 100%的CPU是否会影响该线程的唤醒时间?例如,线程B可能在此时间窗口中运行,线程A是否会被OS抢占?

2 个答案:

答案 0 :(得分:2)

  

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

Linux和Windows都使用基于优先级的抢占式线程调度程序。公平很重要,但严格来说,这不是目标。这些调度程序的确切工作方式取决于系统的版本和风格(客户端与服务器)。通常,线程调度程序旨在最大化响应性并减轻调度危险,例如反转和饥饿。尽管一些调度决策是以循环方式进行的,但是在某些情况下,调度程序可以将抢占的线程插入队列的前面而不是后面。

  

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

时间片(或量子)实际上更像是指导而非规则。重要的是要理解时间片是可分的,它等于一些可变数量的时钟周期。调度程序根据时钟周期而不是时间片来计算CPU使用率。线程可以运行超过时间片(例如,时间片和一半)。线程也可以自愿放弃剩余的时间片。这是可能的,因为线程放弃其时间片的唯一方法是执行系统调用(休眠,产生,获取锁定,请求同步I / O)。所有这些都是无法在用户模式下执行的特权操作(否则,线程可以在不告诉操作系统的情况下进入休眠状态!)。调度程序可以将线程的状态从“就绪”更改为“等待”,并安排其他一些准备好的线程运行。如果某个线程放弃了剩余的时间片,则下次计划运行时它将不会得到补偿。

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

  

那么CPU使用率是100%?线程是如何安排的?将   线程A耗尽所有时间然后安排出来?

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

  

如果我有线程运行,并被某些人阻止   条件(例如网络)。 CPU 100%是否会影响唤醒时间   这个帖子?例如,另一个线程可能在其时间运行   窗口,不会由操作系统安排出去?

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

答案 1 :(得分:1)

  

那么CPU使用率将是100%?

理想发言,答案是肯定的,理想情况下,我的意思是,你没有考虑在执行context switch时浪费的时间。实际上,CPU利用率通过始终保持忙碌而增加,但是在执行上下文切换时浪费了一些时间(从一个进程或线程切换到另一个进程或线程所花费的时间)。

但我会说,在你的情况下,两个线程的时间限制完全一致,以获得最大的CPU利用率。

  

线程是如何安排的?线程A会耗尽所有时间吗?   安排好吗?

在大多数现代操作系统实现中,如果在就绪队列中有另一个进程,当前进程在CPU完成后就会被调度出来,无论它是否还有剩余时间量。所以是的,如果你正在考虑一个现代的OS设计,那么线程A就会在10ms之后安排出来。

相关问题