不让CPU偷懒

文章资料摘自——《程序员的自我修养》

不让CPU偷懒_第1张图片

为了防止cpu执行完该程序后需要等待程序员手动加入下一个程序,才可以继续运行,这里大大浪费了cpu的效率,要知道cpu是十分昂贵的。

多道程序

在计算机发展的早期,CPU使用十分不方便,它一次只能运行一个程序,而且该程序必须允许完毕后才可以执行下一个程序,学过数据结构的朋友都知道一个叫做队列结构的存储方式,当队头数据为出队列时候,后面的数据都必须等待它执行Pop才可以出列,早期cpu就是类似这样的运行程序的方式,我们成为“多道程序”-->这种方式在现在看似原始,但是在当时确实大大的提升了cpu的效率。

不让CPU偷懒_第2张图片

用户急需执行的程序必须等I3 I4  I5全部执行完毕后才进入cpu计算运行。

但是这种方式在程序调度上有着重大的漏洞,比如:人机交互时,用户现在就需要执行一个程序,但是将想要执行该程序,就要等待前面所有程序执行完毕后才会执行(不可插队),等到用户急需程序开始运行时,可能都过去10多分钟了,这是多么悲伤的事情。

分时系统

在这多道程序的基础上,我们将cpu执行单个程序从头到尾一次性执行完毕,改为了计算当前程序部分时间后,让出cpu给其他程序进行计算其他程序,以此类推,每个程序都有机会运行一段时间,这个时候这样的系统叫做分时系统,这样的监控程序比多道程序高级也复杂,当用户调用几个系统调用(Yield、GetMessage等)时,监控系统会查看cpu是否在执行其他文件,如果有,发出请求,cpu可能暂停当前执行程序,让cpu先执行其他程序。

不让CPU偷懒_第3张图片

 但是这里有个弊端,这里的分时系统,只是协商,如果I3正在执行有个十分耗时间的计算,或者陷入死循环,他就会霸占cpu,使计算死机,无法执行其他程序,整个系统都停止了,一直执行该计算,这是我们不希望看见的,区区一个死循环,导致一台计算机死机,现在来看十分的荒唐,比如在你的IDE上执行while(1); 死机只能重新启动,这样的电脑谁敢买

#include
//在分时系统下
int main()
{
    while(1);//cpu疯狂计算该条程序,电脑只能重启。
    return 0;
}

多任务系统

分时系统也仅能满足当时的交互,当今计算机发展越来越快,绝不能因为一个死循环死机,这个时候,高端领域的佬们研究发明了多任务(Multi-tasking)系统,它完全接管了硬件资源,不再是协商,这是直接命令,所有的程序都以进程(Process)的方式在比操作系统权限更低级的级别,每个进程都有自己的独立空间,使得进程之间有独立的地址空间(大通铺,变成小单间),使得不同的进程相互隔离,而且不同的进程有不同的优先级别(出现高低贵贱,三六九等)。这时操作系统全权接管CPU资源,这时操作系统会根据进程的优先级高低进行先后分配cpu资源,当前面的进程运行一段时间都,直接暂停当前进程,运行下一优先级进程,每个进程都执行一小段时间,这样所有的进程都会使用到cpu资源,出现死循环,进程也霸占不了cpu资源,因为该系统下,操作需要全权控制cpu资源分配,这样的这方式我们称之为:抢占式(Preemptive) ,操作系统可以强制剥夺cpu资源(哪怕正在执行其他进程,甚至进程在死循环),并且分配给它认为目前最急需的进程。

不让CPU偷懒_第4张图片 剥夺当前使用cpu资源的进程
不让CPU偷懒_第5张图片 将cpu资源给急需cpu资源的进程

 并且如果分配给每个进程的时间都很短的话,出现多个进程之间快速的切换,产生多个进程同时执行的假象。当下许多的操作系统都是采用这样的方式如:Linux、windows NT、UNIX、以及苹果的Mac OS X的流行的操作系统。

你可能感兴趣的:(服务器,windows,运维)