Total Pageviews

Wednesday, 22 June 2016

程序员眼中的程序世界

规律,世界的运转遵循着一定的规则。比如地球围绕着太阳转,月球围绕着地球转。我们无法理解月球为什么叫月球,因而CPU也是如此,他为什么用的是这个名词而不是别的,这些是一些约定俗成的东西。我们只需要理解他所代表的意义,没有必须深究其在表面上的意义。
我们在计算机给予了节拍的概念,也就是说在计算机运行的时候也在以某个频率运行着操作系统,如在早期的Linux内核中,是以100Hz为节拍的。而随后的内核有些则改用1000Hz的定时器。而这些就像我们生活中的秒一样都是人为规定的。我们可以更改内核中的CPU节拍,同时我们也可以人为地定义这个世界的1分钟可以是30秒,而不是60秒。这些都是人为发明和创造的,就如同我们称呼太阳为太阳一样。而计算机也是将我们所熟知的世界的规律带入计算机世界中。
定时器中断也是相当有趣的一个设计,我们在使用操作系统的时候无法察觉到定时器的设计,每秒都发生了一定数量的中断。而中断的意义是使得硬件得以与处理器进行通信,而中断也是多任务设计的一个利器。当然,我们还不知道这个世界是不是有中断如此有趣的设计。
但是,我们也可以将这些重新构造,也就是在C++等语言中的重构。在初等数学中1+1=2,然而你可以将“+”号重新定义,这里的”+”就不是加法、ADD了。你就是我们可以重新定义1+1=3,而”+”这是一个符号。通常,当然我们认为是加号。当然了,你也可以认为是其它已知事实。这些只是人为定义和发明的,而我们将这些已知的规律带入了计算机世界,而使这些更为简单。所以,我们可以将计算机定义为人类世界的延伸。故,我们可以用已知的已经熟知的这个世界的规律来理解计算机操作系统。
计算机操作系统是以基于管理计算机及其他配件为基础的软件,也就是一个管理工具,操作系统内核管理着计算机本身及其应用程序,同时为其它程序提供系统服务,操作系统控制着计算机的所有资源。计算机本身有着极其复杂的硬件结构,无论是直接用RISC、还是MIPS等来操纵系统都是极为复杂的工作。同时在这些机器语言中有着数量不少的指令,可以用作数据传输、运算等操作。当然除了这些之外还有内存地址操作等等。因而操作系统的职责之一就是将所有这些复杂性的事物隐藏下来,同时为程序员提供一套更加方便的指令。(比如说,在unix shell中我们可以通过rm –rf *来删除某个目录的所有文件,然而这是相当危险的。在类unix系统中,一般都认为用户知自己的操作会带来什么后果。)同时,我们也可以基于操作系统来开发应用程序,比如C++、Python等高级语言也是基于操作系统层次上而言的。
我们可以将这一切类比,如同地球本身一样,为其它生态提供了载体,而这一切又是以操作系统为核心。当我们需要建设房屋的时候我们直接买来的是砖、玻璃等等,而不会去选择去买土,然后再用来烧砖。建设的时候,就好比是程序设计。首先我们要分析好我们的需要,为这房屋多大,什么样子的。因而,在多数语言中一般会要求你事先了解你所要设计的程序架构等等,也就是自顶向下的编程。(也存在某些例外,比如Lisp)。这些都已经是基于类似于我们操作系统层次上的操作。
而这一切如同我们所生活的环境一样。我们所需的一切都是基于地球。以建筑为例,我们在建设的同时,就如同应用程序一样,一切都是基于系统所提供的资源。如房屋、木材等,而这都是利用周围的资源所构成的。而资源都是有限,尽管我们在当前认为有些资源是无限的,然而,我们也会发现这一切是有限的。
开发PC程序时,通常不会去限制对资源(如内存等)的使用,除在某些特定的开发领域如嵌入式、游戏编程等。在我们所生活的环境中,我们会遇到这样或者那样的灾难,而这些都是不可预料的,正如系统中的BUG一样。就当我们对自然规律不断掌握的同时,我们也会遇到这样或者那样无法解决的问题,而映射在WINDOWS系统中比如蓝屏,或者在单片机中遇到的溢出等等。我们还无法遇知问题出在哪里。因而,如同自然规律一样,软件中的BUG也是存在的,随着开发的进行,数量会减少,但是还是存在的。就好比是数学领域人们在计算最大的质数一样,软件中的BUG也是那个质数。虽然你在此时认为BUG已经被消除了,然而它还是存在的,只不过不知道它在何处罢了。
从没有操作系统到简单的批处理系统,就有如地球的的诞生一样。而批处理简单就像第一个细胞的诞生那样有着重要的意义,你可以将之类比为今天的人的大脑和操作系统的关系,今天的操作系统当然还不比人的智能,然而意义上也可以是相当的。我们可以发现,这有着如此的相似之处。
一个又一个的人类好比是计算机中一个个简单的线程,每个人都是独立的的有着自己的思想,行动等等,然而有这么几群人为着一个共同的目标为努力着,这就构成了操作系统中的进程。一个进程可以由N多个线程构成,当然这只是理论值。我们暂且将之类比为一家公司,一个进程如同一家公司一样,它有N多个员工,也就是线程。而当一家公司不断扩大的时候,就可能触犯边界,也就是法律给予的边境。每个系统本身也给予了程序一定的资源使用范围。当一个程序占用了过多的系统的资源的时候,操作系统就开发干涉这个程序的行为。就像垄断法所规定的公司应当如何如何一样,如果你触发了这个边界,那么你可能如同美孚石油一样被拆分,而这一切也是相当的有趣的。
当我们在一个团队里面工作的时候,有时候几个人同时做一件事的,也有可能在同一时间段内由不同的人来做同一件事了。而我们的核心就是完成某个任务,听起来是不是很像操作系统的任务的运行。而我们在做这个任务的时候可以得到团队最好的资源和人力,那么这就是抢占式(Preemptive),因为我们可以优先获得系统资源。当然了,同一团队中如果去抢别人的资源可能是不好的行为,当然了其它线程也可以做出让步(yielding)。因而一个内核调配器的设计在整个操作系统中是极为重要的。会影响系统资源的利用,及多进程的并发效果。基于抢占式多任务(Preemptive multitasking)设计的linux内核中,进程在被抢占之前能够运行的时候是预先设置好的,而且有一个专门的名字,叫进程的时间片(timeslice)。
当然了一个操作系统中可能会有不同的高度程序,就像我们在执行一个任务的时候会有不同的方法一样。在Solaris中,有多个调度程序可以并发操作。Solaris提供表驱动的、随用量减少的分时调度程序(TS);为窗口系统优化的交互高度程序(IA);基于共享的调度程序(FSS);固定优先级的调度程序(FX)及实时的固定优先级的调度程序(RT)。
一个操作系统中,也包含文件系统,而你可以将之类比为什么呢,地球……我们所用的软件将依赖于文件系统,随着开发的不断进行,这还在相当长的时间还是一样的。你会发现,我们生活在地球上,我们所工作、生活的地方也是在地球上的。而这一切都是有限的,因为资源从来都是有限的。取之不尽用之不竭那只是鬼话,一种相当激进的自我安慰。
因而将操作系统形像为我们所居住的环境,你会发现这一切是如此的简单。在生态中,一切都是对象,无论是人类还是其它什么的,他们之间有着共同的属性,比如,人和猴子一样都有四肢。而这之间又有着如此多的区别,就以人类而论,男人和女人之间又有着这么多的区别,他们这又是人类。又有大脑,等等。你又能加以从性方面加以区别。
人的思考就有如系统一样,在不断地进行判断,冯体系的操作系统是如此只有真和假,而人的大脑也是如此吧,只不过加以了一个又个复杂的编程,就如计算机诞生之时,人们会惊叹其的伟大和神奇,而人的大脑也如同其一样复杂,编程的一个又一个的终点就是BIN,二进制。而就是1和0构成了这个复杂的世界。而我们所生活的世界就是由这个,那个化学元素构成的,而你又会发现这一个又一个神奇的事物的构成究其底是什么呢H,也就是所谓的氢。我们所生活的世界到最后也就是由氢构成的,就如同计算机世界的1一样,有着神奇的功能,而0呢,有趣的是你会发现0是什么也没有,正如同物理学家告诉你真空的存在一样,0就是这个世界的真空。
因而,你可以将计算机操作系统等等理解为这个世界,一切都是如此的有趣,有着如此多的相似之处而。更有趣的是人的大脑吧,就像早期的操作系统没有多任务属性一样。而人的大脑同上也是一个神奇的多任务操作系统,当然了你可能会说人的大脑无法同一时间处理两件事,而操作系统可以吗?答案是不可以的。一个时间片我们只能考虑这件事,然而一天呢,我们可以想这件事或者那件事。因而,操作系统的多任务也是如此的。在一段时间内做那件事,在那一个时间内做另外一件事。尽管相互之间有着如此多的区别,当然了。有的系统,可能不是基于时间片的。
你可以将法律类比为操作系统的一个个策略、管理单元等等。而这一切都是为了操作系统有着更好的开发环境,或者说这是为了让人与人和平的相处下来,而不至于发生矛盾。当发生问题的时候,就有了规范,有了解决方案,这就是系统存在的意义,如同国家对于人民的意义一样。这个国家可能会有病毒,你可以将之称之为造反。病毒就如同义军一样,要么你平息了他,要么,你被他“平息”了。但是一个新的操作系统不会因此而诞生,这也是两者间的区别.