windows - OS线程调度与cpu使用关系

标签 windows multithreading linux-kernel operating-system scheduler

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

请问CPU占用率和线程调度有关系吗?

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

线程A需要10ms完成工作,然后休眠5ms,循环运行。

线程 B 需要 5ms 来完成工作,然后休眠 10ms,同样循环。

  1. CPU使用率会是100%吗?

  2. 线程是如何调度的?线程A会用完所有时间然后调度出去吗?

另一种情况: 如果我有一个线程 A 正在运行,那么它就会被某些条件(例如网络)阻塞。 CPU 100% 会影响该线程的唤醒时间吗?比如这个时间窗口内可能运行着一个线程B,那么线程A会被OS抢占吗?

最佳答案

As i know that Linux implements a fair scheduler and Windows System implements the Round-robin (RR) schedulers for threads scheduling,

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

each thread has a time slice for its execution.

时间片(或量子)实际上更像是指南,而不是规则。重要的是要理解时间片是可分的,并且它等于一些可变数量的时钟周期。调度程序按照时钟周期而不是时间片来对 CPU 使用情况进行收费。线程可以运行超过一个时间片(例如,一个半时间片)。线程也可以自愿放弃其剩余的时间片。这是可能的,因为线程放弃其时间片的唯一方法是执行系统调用( sleep 、让出、获取锁、请求同步 I/O)。所有这些都是特权操作,不能在用户模式下执行(否则,线程可以在不通知操作系统的情况下进入休眠状态!)。调度程序可以将线程的状态从“就绪”更改为“等待”,并调度其他就绪线程运行。如果线程放弃了剩余的时间片,则在下次计划运行时将不会得到补偿。

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

So the CPU usage will be 100%? And how is the thread scheduled? Will thread A use up all its time and then schedule out?

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

If i got a thread running, and blocked by some condition(e.g network). Will the CPU 100% will affect the wakeup time of this thread? For example, another thread may running in its time window and will not schedule out by the OS?

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

关于windows - OS线程调度与cpu使用关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49531853/

相关文章:

python - Windows Scipy 安装 : No Lapack/Blas Resources Found

ios - Realm 不正确的线程访问崩溃

c - 使用 emscripten 的简单多线程程序

linux - 函数 'create_proc_entry' 的隐式声明

c - Windows 和 Linux 系统如何实现物理到虚拟 IRQ 映射?

java - 无法在具有 8GB RAM 的系统上将 xmx 设置为超过 4GB

windows - 如何覆盖或自定义 Windows 中的删除确认对话框?

xcode - SVN + 保管箱 : sync project on Windows and Mac

php - 如何在Redhat 6.5上为多线程设置php

linux - 在 IF_NET 模式下,不会调用 POST_ROUTING Hook