当前位置: 首页 > Linux

操作系统学习(一)--从发展历程看懂操作系统的设计要求

时间:2023-04-06 22:52:28 Linux

这是操作系统系列的第一篇。操作系统发展史虽然不是研究操作系统的重点,但是在这个发展过程中衍生出很多与操作系统相关的重要概念。如果知道这些概念出现的背景和出现的原因,在后面的学习中,就不会觉得有些概念突兀了。另外,了解操作系统的发展历史,了解设计需求,有助于我们站在计算机的角度思考问题。ENIAC和串行处理计算机的发展可以追溯到1946年,世界上第一台通用计算机“ENIAC”诞生于这一年的2月14日(这一天恰好是情人节)。图为ENIACENIAC长30.48米,宽6米,高2.4米。占地面积约170平方米,拥有30个作业平台,重30吨,耗电量150千瓦,造价48万美元。从那一年到20世纪50年代中期,操作系统还不存在。毕竟那时候还没有操作系统的概念。程序员要运行一个程序,就得在纸带上打机器码(这不仅是脑力活,而且是个细心的活,打错洞还得从头再来。想象一下,让你不用退格键写一篇文章,更不用说从中间插入了……当时的程序员太难了),然后通过输入设备,比如纸带阅读器载入电脑.计算机一步步运行。运行后,打印出结果。PS:在过去的十几年里,编程语言也有了很大的发展。在这个阶段后期,已经出现了高级语言——FORTRAN。编译、链接、函数库的概念也已经实现。所以这个时间段的电脑并没有你想象的那么落后!在此期间,如果用户需要使用电脑,必须提前预约一段时间,然后才能上电脑(将磁带放入机器和控制机器的工作是也是自己做的。作为程序员,你要和硬件打交道)。在这种模式下,会出现一个问题:如果用户申请了1小时,但他的任务只需要运行35分钟,那么多出来的25分钟就被浪费了。如果一个小时到了,用户的程序还没有运行完,程序就会被强行停止——这相当于浪费了整整一个小时的计算资源。但是延长时间是不可能的,后面还有人在排队,万一你的程序死循环了怎么办。在简单的批处理系统计算资源匮乏的情况下,上述串行处理造成了巨大的资源浪费,这是科学家们无法接受的——必须提高计算机的利用率。于是,批处理系统诞生了。图为IBM7090,上面运行着最著名的批处理系统IBSYS。这也是世界上第一个全晶体管计算机批处理系统。中心思想是使用一种称为监视器的软件。刚才说了,串口加工需要用户自己上机,时间段是固定的,现在只需要将作业提交给电脑操作员,操作员会把这些作业按顺序组织成一个批次,然后整个批次job放置在输入设备上,供监控程序使用。监控程序已经有了操作系统的含义,其工作过程也很容易理解:大多数监控程序都是常驻内存的,这部分称为常驻监控程序。一开始,监控程序控制了计算机(废话,此时用户作业还没有加载),它会从输入设备中读取一个作业,读取后将作业放入用户程序区,并获得控制权。作业完成后,控制再次返回到监视器。有了监控程序,提高了电脑的利用率——一个作业完成后马上开始下一个作业,没有空闲时间,很少有作业未完成就终止的情况(基本解决了问题串行处理的问题)。监控程序的正确运行取决于硬件。这个时期,为了系统的可靠性,电脑厂商为电脑提供了几个重要的功能:内存保护:这个很好理解。监控程序的内存空间不能被用户访问。程序可以随意更改——无论是有意还是无意。不过当时黑客群体还没有发展起来。毕竟电脑既稀有又昂贵,不可能“飞入寻常百姓家”。一旦硬件检测到用户程序试图做坏事,它就会将控制权直接转移到监控程序并取消这项工作。定时器:该功能是为了防止某个作业独占系统,当作业接管控制权后,定时器会自动开启。如果计时器超时但作业尚未??完成,程序将被杀死。特权指令:一些机器指令会被设置为特权指令(如I/O指令),只能由监控程序执行。用户程序不能直接使用这些指令。当然,用户程序可以请求监控程序为自己执行这个操作。特权指令是为了限制用户程序的“权限”而设置的。毕竟,老板和员工不可能拥有同等的话语权。监控程序的内存布局,蓝色部分为受保护的内存区域。在这些功能中,内存保护和特权指令引入了操作模式的概念。我们知道这两个功能在现代操作系统中仍然保留着——足以看出它们的地位。简单的批处理系统已经具备了基本的任务调度能力,但还有很大的提升空间。虽然一个简单的批处理系统为机器提供了一个自动的作业顺序,但是处理器经常处于空闲状态,因为I/O设备比处理器慢很多,处理器需要I/O操作完成才能继续工作.例如:CPU利用率=1/31=3.2%CPU利用率太低。有什么办法可以解决这个问题吗?多通道批处理系统IBMSystem360搭载了多通道批处理操作系统OS/360,被公认为划时代的操作系统。刚才我们说了,利用率低的主要原因是CPU需要等待I/O操作。那我们可以让CPU一直忙吗?多通道批处理系统是让CPU保持忙碌的秘诀。方法听起来很简单——在内存中多放几个用户程序,一旦一个作业需要等待I/O,就立即切换到另一个可能不需要等待I/O的作业。这种处理称为多道程序设计或多任务处理。我们来看看这种方法是如何提高CPU利用率的:图a:只有程序A在运行图b:内存中有用户程序A和B,当A在等待I/O操作时,B开始运行。(为了便于理解,我们假设两个程序A和B竞争的IO资源是不同的。)图c:用户程序A、B、C同时存放在内存中。我们可以直观的看到,在相同的时间段内,CPU运行时间有了很大的提升,符合我们的预期。与简单的批处理系统一样,多程序批处理系统必须依赖某些计算??机硬件功能。最显着的特性之一是支持I/O中断(Interrupt)和直接内存访问(DirectMemoryAccess,DMA)。(DMA也需要中断的支持)中断这个词第一次听到可能会觉得有点神秘。如果翻译成“中断”,就更容易理解了(就是不好听)。当一个作业开始一个I/O操作时,CPU会切换到另一个作业,那么操作系统如何知道I/O操作何时结束呢?答案是I/O中断。I/O操作结束后,DMA模块(是哪个模块取决于系统实现)会向CPU发送一个信号,CPU必须停止当前的东西来处理这个信号。在批处理系统中,控制似乎被转移到操作系统的中断处理程序。这个过程就是I/O设备中断(Interrupt)CPU正在做的事情,转而去做另一件事。因此,中断是操作系统完成各种复杂操作的前提。多通道批处理系统显然比它的前辈复杂得多。从这个操作系统衍生出几个比较有意思的话题:作业管理:内存空间是有限的,也就是说一次性加载到内存中的程序数量也是有限的,那么如何从中选择一个合适的作业呢?替代作业并将其加载到内存中是一个问题,这就是作业管理。内存管理:选择作业后,需要为作业分配空间。从空闲区的哪一部分为作业分配空间,是内存管理需要解决的问题。进程调度:进程是一个正在进行的程序。通常,我们将加载到内存中的作业称为进程,以区别于未加载的作业。进程调度是指当??需要进行进程切换时,通过一定的算法从进程队列中取出一个合适的进程,获得CPU的执行。在现代,由于内存容量的提升,作业在后台排队的情况已经很少见了,所以作业管理以后只会用少量的笔墨来介绍。但是内存管理和进程调度会是我们以后研究的重点。分时系统UNIX是最著名的分时操作系统。多通道批处理系统可以说是现代操作系统的雏形。也满足了处理器在处理批处理作业时的利用率。对于作业,多路批处理系统似乎不能如愿以偿。互动作业的出现很容易理解。毕竟,我们现在几乎所有的应用程序都是交互式的。如果你滑动屏幕,这篇文章会上下滑动,点击一个分享,会出现各种选项等等。在交互式工作中,难免要等待用户进行操作,但不可能让处理器停下来等你一个人。毕竟很多人都在使用同一台电脑,所以分时系统就应运而生了。顾名思义,分时系统就是n个用户作业,操作系统控制每个用户程序在短时间内交替执行。因为人的反应比机器慢得多,如果控制得当,你会感觉好像独占了这台电脑。还有一点,分时系统的切换过程依赖于我们在批处理系统中强调的中断。不同的是,这里的中断是时钟中断——时间到时向CPU发送中断信号。如果我们把多个用户运行的交互程序看成是一个用户运行的多个交互程序,那么我们现在使用个人电脑就很容易理解现代操作系统:多个进程共享一个处理器,每个进程被分成一个时间片,而在电脑前,仿佛有多个进程在并行运行。一个执行I/O操作的进程会被操作系统阻塞,在阻塞队列中等待I/O操作结束,才有机会使用CPU。多个进程存储在内存中,操作系统需要防止进程向其他进程的内存空间写入信息。特别是,操作系统本身的内存空间必须受到保护。用户程序运行在用户态,无权使用特权指令,因此需要向操作系统提出请求。说到这里,我们已经了解了操作系统的发展。其实还有一些其他的操作系统,比如实时操作系统、网络操作系统、分布式操作系统等等,但是这些操作系统和我们的生活并没有什么关系。(实时操作系统对于嵌入式来说还是很重要的),本文略过,有兴趣的可以参考相关资料。希望阅读本文后,您能够对操作系统的设计理念有一个简单的印象。如果这篇文章能引起您对操作系统的兴趣,那再好不过了。感谢阅读,我们很快就会回来!免责声明:原创文章,未经授权禁止转载