首页 文章

OS线程调度和cpu使用关系

提问于
浏览
0

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

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

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

线程A需要10ms才能完成作业,然后睡5ms,循环运行 .

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

  • CPU使用率是100%吗?

  • 如何安排线程?线程A会耗尽所有时间然后安排出来吗?

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

2 回答

  • 2

    那么CPU使用率将是100%?

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

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

    线程是如何安排的?线程A会耗尽所有时间然后安排出来吗?

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

  • 1

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

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

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

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

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

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

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

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

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

相关问题