OS线程调度和cpu使用关系
OS thread scheduling and cpu usage relations
据我所知,对于线程调度,Linux 实现了公平调度器,Windows 实现了循环 (RR) 调度器:每个线程都有一个执行时间片(纠正我如果我错了)。
请问CPU的用法与线程调度有关吗?
例如:有2个线程同时执行,系统时间片为15ms。 cpu只有1个核心。
线程 A 需要 10ms 完成工作,然后休眠 5ms,运行 循环。
线程 B 需要 5ms 完成工作,然后休眠 10ms,同样在一个循环中。
CPU使用率会是100%吗?
线程是如何调度的?线程A会不会用完所有时间然后调度出去?
还有一个场景:
如果我有一个线程 A 运行ning,它会被某些条件(例如网络)阻塞。 CPU 100% 会影响这个线程的唤醒时间吗?比如一个线程B可能在这个时候window被运行ning,那么线程A会不会被OS抢占呢?
So the CPU usage will be 100%?
理想情况下 来说,答案是肯定的,我的意思是理想情况下,您没有考虑执行 context switch 所浪费的时间。实际上,CPU 的利用率是通过一直保持忙碌来提高的,但是在进行上下文切换时仍然会浪费一些时间(从一个进程或线程切换到另一个进程或线程所花费的时间) .
但我要说的是,在您的情况下,两个线程的时间限制完美对齐,以实现最大 CPU 利用率。
And how is the thread scheduled? Will thread A use up all its time and
then schedule out?
好吧,这真的取决于,在大多数现代操作系统实现中,如果就绪队列中有另一个进程,则当前进程在 CPU 完成后立即被安排出去,无论它是否还剩下时间量子。所以是的,如果您正在考虑现代 OS 设计,那么线程 A 将在 10 毫秒后立即安排。
As i know that Linux implements a fair scheduler and Windows System
implements the Round-robin (RR) schedulers for threads scheduling,
Linux 和 Windows 都使用 priority-based,抢占式线程调度程序。公平很重要,但严格来说,它不是 objective。这些调度程序的确切工作方式取决于系统的版本和风格(客户端与服务器)。通常,线程调度程序旨在最大化 响应能力 并减轻诸如反转和饥饿之类的调度风险。尽管某些调度决策是以 round-robin 方式做出的,但在某些情况下,调度程序可能会将被抢占的线程插入队列的前面而不是后面。
each thread has a time slice for its execution.
时间片(或时间片)实际上更像是一个指南而不是规则。重要的是要了解时间片是可分割的,它等于一些可变数量的时钟周期。调度程序根据时钟周期而不是时间片收取 CPU 使用费。线程可能 运行 超过一个时间片(例如,一个半时间片)。线程也可以自愿放弃其剩余的时间片。这是可能的,因为线程放弃其时间片的唯一方法是执行系统调用(睡眠、产生、获取锁、请求同步 I/O)。所有这些都是无法在 user-mode 中执行的特权操作(否则,线程可以在不通知 OS 的情况下进入睡眠状态!)。调度程序可以将线程的状态从 "ready" 更改为 "waiting",并将其他一些就绪线程调度为 运行。如果一个线程放弃了它剩余的时间片,它不会在下次被调度到 运行.
时得到补偿
一个特别有趣的情况是在线程 运行ning 时发生硬件中断。在这种情况下,处理器会自动切换到中断处理程序,强行抢占线程,即使它的时间片还没有结束。在这种情况下,线程不会因为处理中断所花费的时间而被计费。请注意,中断处理程序确实会使用 CPU。顺便说一句,上下文切换本身的开销也不计入任何时间片。此外,在 Windows 上,线程在 user-mode 或 kernel-mode 中处于 运行 的事实本身不会影响其优先级或时间片。在 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 操作的线程能够 "wake up quickly" 并获得更高的机会很快被调度。例如,在 Windows 上,等待 I/O 操作的线程的优先级可能会在 I/O 操作完成时提高一点。这意味着它可以在完成其时间片之前抢占另一个 运行ning 线程,即使两个线程最初具有相同的优先级。当一个 boosted-priority 线程醒来时,它的原始优先级将恢复。
据我所知,对于线程调度,Linux 实现了公平调度器,Windows 实现了循环 (RR) 调度器:每个线程都有一个执行时间片(纠正我如果我错了)。
请问CPU的用法与线程调度有关吗?
例如:有2个线程同时执行,系统时间片为15ms。 cpu只有1个核心。
线程 A 需要 10ms 完成工作,然后休眠 5ms,运行 循环。
线程 B 需要 5ms 完成工作,然后休眠 10ms,同样在一个循环中。
CPU使用率会是100%吗?
线程是如何调度的?线程A会不会用完所有时间然后调度出去?
还有一个场景: 如果我有一个线程 A 运行ning,它会被某些条件(例如网络)阻塞。 CPU 100% 会影响这个线程的唤醒时间吗?比如一个线程B可能在这个时候window被运行ning,那么线程A会不会被OS抢占呢?
So the CPU usage will be 100%?
理想情况下 来说,答案是肯定的,我的意思是理想情况下,您没有考虑执行 context switch 所浪费的时间。实际上,CPU 的利用率是通过一直保持忙碌来提高的,但是在进行上下文切换时仍然会浪费一些时间(从一个进程或线程切换到另一个进程或线程所花费的时间) .
但我要说的是,在您的情况下,两个线程的时间限制完美对齐,以实现最大 CPU 利用率。
And how is the thread scheduled? Will thread A use up all its time and then schedule out?
好吧,这真的取决于,在大多数现代操作系统实现中,如果就绪队列中有另一个进程,则当前进程在 CPU 完成后立即被安排出去,无论它是否还剩下时间量子。所以是的,如果您正在考虑现代 OS 设计,那么线程 A 将在 10 毫秒后立即安排。
As i know that Linux implements a fair scheduler and Windows System implements the Round-robin (RR) schedulers for threads scheduling,
Linux 和 Windows 都使用 priority-based,抢占式线程调度程序。公平很重要,但严格来说,它不是 objective。这些调度程序的确切工作方式取决于系统的版本和风格(客户端与服务器)。通常,线程调度程序旨在最大化 响应能力 并减轻诸如反转和饥饿之类的调度风险。尽管某些调度决策是以 round-robin 方式做出的,但在某些情况下,调度程序可能会将被抢占的线程插入队列的前面而不是后面。
each thread has a time slice for its execution.
时间片(或时间片)实际上更像是一个指南而不是规则。重要的是要了解时间片是可分割的,它等于一些可变数量的时钟周期。调度程序根据时钟周期而不是时间片收取 CPU 使用费。线程可能 运行 超过一个时间片(例如,一个半时间片)。线程也可以自愿放弃其剩余的时间片。这是可能的,因为线程放弃其时间片的唯一方法是执行系统调用(睡眠、产生、获取锁、请求同步 I/O)。所有这些都是无法在 user-mode 中执行的特权操作(否则,线程可以在不通知 OS 的情况下进入睡眠状态!)。调度程序可以将线程的状态从 "ready" 更改为 "waiting",并将其他一些就绪线程调度为 运行。如果一个线程放弃了它剩余的时间片,它不会在下次被调度到 运行.
时得到补偿一个特别有趣的情况是在线程 运行ning 时发生硬件中断。在这种情况下,处理器会自动切换到中断处理程序,强行抢占线程,即使它的时间片还没有结束。在这种情况下,线程不会因为处理中断所花费的时间而被计费。请注意,中断处理程序确实会使用 CPU。顺便说一句,上下文切换本身的开销也不计入任何时间片。此外,在 Windows 上,线程在 user-mode 或 kernel-mode 中处于 运行 的事实本身不会影响其优先级或时间片。在 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 操作的线程能够 "wake up quickly" 并获得更高的机会很快被调度。例如,在 Windows 上,等待 I/O 操作的线程的优先级可能会在 I/O 操作完成时提高一点。这意味着它可以在完成其时间片之前抢占另一个 运行ning 线程,即使两个线程最初具有相同的优先级。当一个 boosted-priority 线程醒来时,它的原始优先级将恢复。