【操作系统】概述

这篇主要是综述总结一下操作系统的基本概念,了解操作系统OS到底在做哪些工作。之所以写这一篇blog,主要是因为我长期以来都没有搞懂OS到底在做些什么工作。

毕竟从接触计算机开始,就在使用windows系统,进程啊,线程啊这些东西我一直以为是理所当然的;另一方面,操作系统毕竟是非常抽象的,在我学完单片机之后,对计算机有了基本的认识,而操作系统是个什么东西,要比计算机更抽象,难以理解;再者,我本科的时候没有开设操作系统这门课,这让我误以为操作系统只要会用就可以了。因此,我还是抽空把操作系统重新认真翻书看了两遍,当然了,还是有一些概念模糊没有理解透彻的,两遍远远不够。写这一篇blog,也是为了能够让自己对OS有个更加深刻的认识。

一、操作系统的发展

1、原始阶段

如果是没有操作系统软件的计算机,程序员必须直接对硬件编程,用管脚和引线高速机器该上哪一个程序,运行完毕之后程序员取出结果,然后再上下一个用户和程序。这样的思路就是单片机的思路,在单片机上,我们用c语言写好程序,并烧录到单片机上,一旦通上电,单片机立即开始工作,因为没有软件,只有一些硬件逻辑电路在工作,这个就是程序。

2、单道批处理阶段

程序员人工上机安放程序是需要花时间的,同样我们每次要处理的程序都是人工写好再放在计算机上的。此时处理机并没有运行,所以此时可以将处理机和其它部分划分开,即将程序的装配的同时,其它用户的其它程序正在占用处理机,一旦下机,本程序即可在处理机上运行,这样能够显著节约时间,提高处理效率,即脱机技术

但上述操作仍然是一种单道批处理程序,在IO、内存、外存等访问处理机时,处理机会中断下来,处理其它设备的请求,且单道批处理程序依然属于串行,浪费了大量的处理机资源。每一次的批处理程序都浪费了大量的时间来解决中断,处理机资源并没有得到完全发挥。

3、多道批处理阶段

由此诞生了多道批处理程序,其作用是多个程序并发处理,提高处理机利用率。在一个程序中断的时候,其它程序能够接续上,运行在处理机上,一点不浪费资源。

4、人机交互阶段

所谓批处理程序即人工无法中断干预的程序。一旦程序出现问题想暂停下来,非得等到它停下来才行,相当不便。由此,分时系统可以实现人机交互,所谓分时是从其具体实现上来命名的,它将计算机处理程序划分为离散的一系列的时间片,每一个时间片都交给一个程序去使用处理机,如果没有处理完,那也需要交出处理机使用权限给其它程序,这就是分时的概念,其实是一种轮转算法。分是系统实现了对当前切入的程序的实时响应,因为在很短的时间片内,用户感觉不到。

5、处理时间限制阶段

实时系统是在分时系统上提出来的,其目的就是实现人们对于程序运行的实时性的高要求,即赋予某个程序很高的优先级,让该程序占用处理机,在某个截止时间前完成运行。这就对处理机选择处理哪个程序任务的算法提出了比较高的要求。

6、多用户阶段

此外,处理机也不仅仅提供给一个用户使用,大型软件的开发需要多人协作,操作系统需要提供多用户功能,最突出的就是两个用户操作一个文件和程序等资源,如何保证不冲突。虽然windows也有多用户功能,但是这种多用户指的是不在同一时刻登录系统的多用户,这显然离真正的多用户需求差的很远。

当前的windows系统是单用户多任务操作系统,而NT系列是针对网络的操作系统。LINUX是多用户多任务的操作系统,用于软件开发工作。当然了,此前见到过某国企某团队在使用windows做服务器开发,画面感人,不知道他们效率低下否。

总体看来,操作系统的提出和发展都是因为现实的需要,最本质的需求就是提高处理机的资源利用率,满足用户的奇葩要求。随着发展,不仅仅是处理机,文件系统,存储器系统,外设都需要让OS来接盘,人需要做的工作仅仅是看着OS处理这一切。这就是操作系统的功能和意义

二、操作系统的结构

1、无结构阶段

在操作系统发展初期,为了实现处理机使用的高效性,操作系统无结构可言,仅仅是一些逻辑控制机制,一段程序代码。就像我自己写的一段连类都未定义的函数。

2、模块化阶段

当操作系统程序量变大之后,就需要将其根据功能进行模块化,用接口连接,现在大多数非操作系统软件都是模块化的体现,如java里大量的jdk,python里大量的第三方包等等。很好理解,不再多说。

3、分层阶段

分层结构,有点类似于网络体系结构里的分层模型,Docker里也采用了分层模型,其主要特点就是上层不需要满足和服务下层,只需要对自己的上层服务。效率会降低,因为层次众多,但是可以提高系统的可靠性,一旦出现问题,可以只修改某一层及其以上的层,而下层不需要知道,也不需要修改,代码维护方便。

内核、客户机和服务器模式、面向对象模式

现代操作系统一般都有内核,内核主要提供了最基本的功能,如进程、线程管理等等,而把文件管理、网络管理、安全性管理等功能分别交给不同的服务器去处理,这就是客户机和服务器模式,这样一来,服务器和新的计算机的功能很容易获得扩展,而且方便修改代码和功能。内核就是最基本的模块,所谓最基本,不如说它更像是一个内置的库函数,提供了简单的方法给其它服务器实现高级功能,而且内核对自身提供了一定的保护机制,防止自己被占用或侵入。一般的应用程序都运行在用户态,而不能是内核态,目的是为了避免出错。处于内核态的处理机可以访问所有的内存和寄存器,能执行一切机器指令,而用户态的处理机则只能执行特定的指令,访问某些内存和寄存器。也就是说,应用程序无法进入操作系统内核内部,因为操作系统本身提供了这种机制,不允许进入。但是当应用程序所在的进程需要进行调度和切换时,进程就陷入了内核态,调度完毕后,再返回用户态。应用程序即便进入了内核态,但那只是操作系统管理的需要,而非应用程序本身可以访问那些内核态的寄存器。

内核结构的缺点就是效率较低,由于我们在编写和改动上方便了,付出了方便的代价,程序在处理的过程中,一旦出现中断和陷入,则需要从用户态切换到内核态,此时,进程的上下文变量都需要进行保存,频繁地进行状态切换,时间代价是很大的。比如数据库的读取操作,每次都是内存和磁盘的io处理,三分钟读10000多条数据的现象仍然存在,主要缺点就是数据库的SQL语句写的不好,造成了卡顿。这个随后再说。

三、操作系统的基本特性

根据前面所述的操作系统的功能和结构,很容易知道,操作系统具有并发、共享、虚拟和异步等几个特性。

这里主要就是虚拟不太好理解,虚拟主要是指内存太小,需要建立虚拟内存,io设备太少,需要多个程序分时段使用io,这也就对应着spooling技术。总体来说,属于空间对换技术和时分复用技术。

猜你喜欢

转载自blog.csdn.net/dongrixinyu/article/details/78877260