zoukankan      html  css  js  c++  java
  • 时间片和抢占式

    在常用的操作系统中,Unix系统使用的是时间片算法来处理进程,所谓的时间片算法,就是所有进程排成一个队列。操作系统按照他们的顺序,每个进程分配一段时间,如果在时间片结束时进程还在执行,那么CPU就会被强行剥夺并分配给另一个进程,如果进程在时间片结束前阻塞或者结束,则CPU当即进行切换。调度程序要做的就是维护一张就绪进程表,当进程用完他的时间片之后,就会被移到末尾。

    而Windows使用的是抢占式,也就是说一个进程如果得到了CPU时间,除非他放弃使用CPU,否则将完全霸占CPU。在windows中,假设有若干进程,操作系统会根据他们的优先级,饥饿时间(已经多长时间没有使用过CPU)给他们算出一个总的优先级。操作系统就会把CPU交给总优先级最高的这个进程。当进程执行完毕或者自己主动挂起,操作系统就会重新计算一次所有就绪进程的总优先级,再挑一个优先级最高的把CPU控制权交给他。

    现在对于抢占式系统有一个问题,如果现在有10个进程,1号进程总优先级最高且高出其他线程一大截,那么1号线程会先使用cpu,当他使用完一会儿之后,阻塞了(比如io读取数据,cpu的计算是相当快的,反而io读取数据会显得很慢)他决定挂起。当他挂起之后,系统又对所有的进程进行了优先级排序。因为1号刚执行过,饥饿度低于其他进程,但由于优先级太高,此次总优先级还是1号进程最高(可能只比其他进程高一点了),所以这次cpu还是交给1号进程来使用。1号进程使用cpu之后被告知,需要io读取的数据还是没有读取到。这样一来就耽误了时间。这时候可以使用Thread.sleep(毫秒数)来告诉操作系统,我需要的数据还没来,我在多长时间里不参与竞争。(即使毫秒数已经到达,1号线程也不会立刻执行,因为这时候cpu可能被其他进程使用,其他进程挂起/结束之后,也要等操作系统重新计算优先级来分配)。 (实际上操作系统会监控进程,如果进程长时间控制cpu,会被强制挂起)

    Thread.sleep(0)的意义为通知操作系统立即重新进行一次CPU竞争。竞争的结果还是要依赖优先级来决定。

    不和别人一样,不复制只真正理解
  • 相关阅读:
    BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路
    BZOJ 1708: [Usaco2007 Oct]Money奶牛的硬币
    BZOJ 1642: [Usaco2007 Nov]Milking Time 挤奶时间
    BZOJ 1611: [Usaco2008 Feb]Meteor Shower流星雨
    BZOJ 1610: [Usaco2008 Feb]Line连线游戏
    BZOJ 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
    BZOJ 1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
    BZOJ 1606: [Usaco2008 Dec]Hay For Sale 购买干草
    BZOJ 1083: [SCOI2005]繁忙的都市
    STL set的用法
  • 原文地址:https://www.cnblogs.com/Vinlen/p/13158759.html
Copyright © 2011-2022 走看看