菜鸟IT技术杂谈(一)——从多任务系统原理说起

怎么说我最近的状态呢?

不是特别好,但是也还是可以,老板也对自己不错。过得还算开心。

这个系列的博文,算是自己自己这两三年来学到的东西的理解吧。

不会对大家产生立竿见影的效果,只是拿自己学习到的东西做一个系统性的原理上的讲解,纯粹起个抛砖引玉的作用吧。

博文我都不会打草稿的,说到哪里算哪里吧。

首先要先明白,CPU计算是有一个最小单位时间的周期的,这是由硬件决定的。

主要表现出来就是有个多少GHZ,像卡吧基佬最喜欢的E3,I7,已经达到了3~4GHZ。

那这个时间周期是由什么决定的呢,也就是说这个抽插速度怎么决定下来的呢?判断依据就是来自晶振。

晶体振荡器是指从一块石英晶体上按一定方位角切下薄片(简称为晶片)。下图就是和IC封装在一块的晶振。

菜鸟IT技术杂谈(一)——从多任务系统原理说起_第1张图片

晶振的原理,在石英晶体的两个电极上加一电场,晶片就会产生机械变形。反之,若在晶片的两侧施加机械压力,则在晶片相应的方向上将产生电场,这种物理现象称为压电效应。如果在晶片的两极上加交变电压,晶片就会产生机械振动,同时晶片的机械振动又会产生交变电场。在一般情况下,晶片机械振动的振幅和交变电场的振幅非常微小,但当外加交变电压的频率为某一特定值时,振幅明显加大,比其他频率下的振幅大得多,这种现象称为压电谐振,它与LC回路的谐振现象十分相似。它的谐振频率与晶片的切割方式、几何形状、尺寸等有关。

然后CPU就有这么一个依据,知道自己应该什么时候跑了,

低端CPU的运行速度由晶振直接决定。高端CPU的运行速度由晶振倍频后产生时钟决定,倍频N倍后可到GHz,当然你要问I7的晶振是多少MHZ,我答不上来- -!

有人说那我不断倍频,岂不是能跑得很快?你这不就是超频吗?淫特二有个睿频,但是你要考虑硬件工艺啊,CPU里的二极管开关速度是有限制的,所以你就不能一直超频了。

如果学过量子力学,就明白量子力学有个说法,世界不是无限可分的,有个最小的度量,那么CPU的运算也不是连续,就算你一直按住一个按键,你触发的电信号,也是断续的。

我说那么多,和软件上的系统有什么关系呢?

当然是有意义的,现代的多任务操作系统就是利用这样原理来工作的。

现在的多任务操作系统都遵循一个原则,就是划分出时间片,就是把CPU的工作时间划分出来。

举个例子,一秒钟内CPU可以工作1000万个周期,那么划为100个,那么10ms,就能算10万个周期。然后再把这个量化好的时间片分配下去,A运行10ms,B运行10ms。

就人的感知来说,10ms交替运行,我完全感觉不出来有啥停顿的。当然这只是个例子,现实里划分为多少ms这完全可以由系统决定。

这么一个时间片,有个很有意思的名字时钟滴答(clock tick),

Linux内核用宏HZ来表示时钟滴答的频率,而且在不同的平台上HZ有不同的定义值。对于ALPHA和IA62平台HZ的值是1024,对于SPARC、MIPS、ARM和i386等平台HZ的值都是100。该宏在i386平台上的定义如下(include/asm- i386/param.h): 
#ifndef HZ 
#define HZ 100 
#endif 
根据HZ的值,我们也可以知道一次时钟滴答的具体时间间隔应该是(1000ms/HZ)=10ms。 


好了,到这里不是真的笨蛋再想想也应该明白了,操作系统所谓的并行操作原来特么的大部分都是在骗我啊,你CPU不都是串行操作吗!!(当然人类也不是那么笨,也有像FPGA这种真并行的东西,你们看到挖比特币的那种矿卡原理上就是靠这种并行,不过那种用途毕竟还是有局限的)


大部分原理的书籍到这里,他们就卖关子不说了!!!你特么在逗我吗!!我就是想知道多任务是怎么切换的!!


当然我不会这么丧心病狂,这里我还是会介绍一下的,大家如果稍微接触过CPU的知识或者汇编,就应该知道CPU上面有一个叫做寄存器的东西。

这些寄存器很小,但是它很快很快,而且每一种架构的CPU都不一样,比如ARM,MIPS,X86,PowerPC的寄存器都不一样。

还是靠举例子来说明

32位x86架构的CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)


想象一下你正在计算一道数学题,但是你只能用十根手指和一张纸。

那么手指就是你的寄存器,比如你要算A=1,B=1,C=A+B,你伸出两个手指,在纸上写下C=2。

这个纸就是CPU的其他的缓存,比如常说的一级二级三级缓存,实在存不下,还有内存硬盘,这些内存的管理,现代CPU往往有一个硬件去做映射,叫做MMU,就是Memory Management Unit的缩写


那么操作系统是怎么样让你可以看起来同时算两条题的呢?

采取的是一个笨方法

一、你算题1的时候,每算一个步骤都在纸上写计算结果。这样你实际要关心的只是你的手指的状态是什么样的。

二、然后你要中途算题2了,那你在纸上把你手指状态画下来,然后重新保持手指张开。

三、你再算题2,算到半路,你要回去算题1,就把现在手指状态画下来,重新照之前题1的画下来的手指状态摆好,你接着题1的计算结果往下算。

四、重复以上过程,直到算完。

写惯了程序的我们可以要问了,CPU怎么知道我执行到了程序第几行?比如我写个循环

for(int i=0,i<10;i++){

      printf(%d,i);

}

怎么知道i到多少了?

你再仔细想想,我刚才说了我每算一步,就会在纸上写结果,就相当于CPU在缓存里写了i是多少,其他的变量也是一样的,所以无论你多少变量,只要缓存能存下,就没有问题。

而你的手指,也就是寄存器摆回原来的位置,就和你算到半路的现场一模一样了。

这种在操作系统里,叫做上下文切换。

实际的原理,就是把当时的寄存器状态存起来,然后在换回原来进程的时候,又把这些寄存器状态还原,这种叫做还原现场。


你看,其实多任务的原理就是这样。至于系统移植到不同的CPU,很大一部分工作就是要把寄存器部分,也就是涉及到汇编部分,重新按平台写一次,然后再用不同的平台的C编译器翻译一次,当然说是这么说,里面有很多细节会把人搞死。


多任务切换的原理就是这样,分配给某个进程运行的时间到了,就切换出来给别的进程使用,当然,也可以通过很多时候可以用中断去打断。

中断,其实就是发出一个信号给CPU,至于CPU要不要响应这个中断,那得看这个中断重要不重要了。比如CPU某个管脚电压高了,这里定义为键盘被敲下了,CPU不忙的话,可以响应一下,忙的话,键盘的这个信息就先等着,CPU忙完再去干。

当然操作系统还能分为实时系统,软实时和固实时系统,其实就是说这个系统能不能在规定的时间内响应,这里面并没有说很明显的分割,比如飞机这种,一定要立刻响应的,肯定是要实时系统,但是像你听个MP3,打开菜单慢点,你最多就不爽而已,可以叫做固实时系统,软实时就宽松了,比如mac os这种做个界面好像很流畅,但是跑起来半天没反应的。


不知不觉,写这文章花了一个多小时,一个多小时能搬多少砖啊!!算了,我好像也挺乐在其中的。


不知道下篇文章要什么时候,下次就说说进程线程这些吧






你可能感兴趣的:(IT杂谈)