【操作系统】第一章--操作系统引论--深入与解释

深入解释之前可以先看笔记理解→【操作系统】第一章–操作系统引论–笔记与理解

【操作系统】第一章–操作系统引论–深入与解释

结合历史上的操作系统,说明操作系统为什么要有多进程?

  • 六七十年代初,计算机刚刚发展之时,一台计算机只完成一件事情,但由于计算机的处理远远高于人手工的处理,当时的计算机很受人们欢迎;但慢慢地,人们想用少的成本完成更多的事情,便在思考是否可以将两台完成不同操作的计算机用一台计算机来实现。此时,多线程的思想已经慢慢进入人们的思想中。
  • 在上世纪七八十年代,当计算机开始进入多个行业,人们需要让一台计算机干多种事,效率低、耗时长、未充分利用资源的单道批处理系统已经不能满足人们的需求,此时就有人提出在一个程序在执行不需要资源的I/O操作时,将其资源用于另一个程序,同时提高了内存资源以及I/O设备的利用率。而这种思想正是多进程的思想,这是多进程的萌芽。
  • 又过了一段时间,一台计算机完成多种事情又不能满足人们的需求,试想,一家公司,人人都想用计算机做些什么操作,倘若资源只能在一台计算机中进行切换,岂不是又回到了单道批处理系统的思想上,所以人们再次利用多进程的思想,把一台计算机中程序的切换扩展到多台计算机资源的切换,更提高了资源的利用率,这是多进程的发展。

结合历史上的操作系统,说明操作系统为什么引入文件操作?

  • 文件操作是操作系统用于明确磁盘或分区上的文件的方法和数据结构,具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。它的引入很大程度上说明了用户对于自己信息文件管理安全的一种关注,无论是最开始的单机文件系统,还是现在的集群式文件系统。
  • 最早的文件操作是用于操作系统和应用程序的本地存储,也被称作单机文件操作系统。就像是刻在不可移动光盘上的信息一样,这时的文件操作仅限于本地;
  • 这时就有人在想是否可以实现多个机器之间对同一文件进行操作,此时就提出了一种基于现有以太网架构,实现不同服务器之间传统文件系统数据共享(磁盘不共享,文件系统共享,表明文件不可以跨服务器存储),但是它还不够完善,这种网络文件系统并不能在两台服务器上同时访问修改。在网络文件系统的基础上,完善它的功能,弥补它的缺陷,在共享存储基础(集群中所有机器的磁盘共享,文件可以跨服务器存储)上,通过集群锁,实现不同服务器能够共用一个传统文件系统的集群文件系统产生了,它极大地满足了人们对于文件操作的需求。
  • 但随着操作系统以及计算机的不断发展,需要使用更多服务器对同一文件进行操作,而只能应用在最多16台服务器上的集群文件系统已经不能支持用户对于拓展性的要求,便有了通过额外模块实现数据跨服务器分布,并且自身集成raid保护功能,可以保证多台服务器同时访问、修改同一个文件系统的分布式文件系统。与之前的文件操作系统相比,它的性能更优越,扩展性更好,成本也更低廉。
  • 正因为文件操作的引入,linux一切皆文件的思想才得以实现。linux由于文件的类型的不同,从而区别于window系统下的应用:如播放器,EditPlus,浏览器,文件夹等,这些在Linux中都有;window系统下的应用,在Linux中不过是统一用文件来表示,而文件的类型决定了文件的用途。

多进程与文件操作

如何理解模块化结构与分层式结构?

  • 模块化结构程序设计技术基于“分解”和“模块化”的原则来控制大型软件的复杂度,它并不是由众多的过程直接构成的,而是按照其功能精心地划分为若干个具有一定独立性和大小的模块,每个模块之间通过接口实现交互。那如何来理解模块化结构呢,相比于其他我不太了解的行业,我更愿意用编程的思想来理解模块化结构:模块化结构就像是编程语言中的面向对象语言,当我们去实现一种功能时,往往将它分为一个一个的模块,甚至有的比较大的模块会再细分,每一个模块都用来独立实现一种功能,比如我们要写一款“导航系统”,会把他进行模块化,首先在主函数中定义相关接口规则,用来规范各个模块之间的交互,再实现地点信息的创建,实现路径信息的创建,实现两点之间路径的查询等等,当然这些实现的思想都是封装思想,当每个模块都完成后,最后再将其整合起来,形成一个完整的系统。这种设计思想,好就好在可维护性强,在出现错误时,我们只需要去监控负责其功能的模块,而不用依次排查,大大节省了效率。
  • 分层式结构是一种“自底向上”的结构,它将操作系统分为好几个层次,每个层又由若干个模块组成,各层之间只存在着单向的依赖关系,即就是高层仅仅依赖于紧邻它的低层。同样的用编程的思想来理解分层式结构,它就像是一种大型程序或者平台的建立,第一大层便是它的底层服务器的构建,而第二层是业务管理层,业务速度的快慢、是否具有高并发性、在同一时间最大的用户访问数可以达到多少,这些都会取决于第一层底层的搭建,底层搭建的越稳固,用户进行高频率的访问时对平台造成的影响就越小,系统崩掉的可能性就越低。而这种结构的优势就在于它不仅易保证系统的正确性和易维护性,还具有易扩充的特点,当我们要进行系统升级时,不用全盘升级,只需要将其中需要更新升级的一层替换掉。
    分层结构

多道批处理中的并发进程是否越多越好,为何在其思想基础上又有多进程到多线程的引进?

  1. 并不是越多越好。多道批处理是多个作业并行工作,相对多作业串行工作的单道批处理而言,减少了“等待”时间,提高了资源的利用率,但是一个计算机系统中的CPU、外设等资源是有限的,只能容纳适量的作业,当作业过多、进程过多时,就会产生“僧多粥少”的情况,会出现对计算机系统资源的激烈竞争,系统的开销将会增加,反而会导致作业的执行速度减慢,计算机系统的效率下降。另一方面,不同作业之间也会产生对系统资源需求的冲突问题,要提高资源利用率,就必须对多个并行工作的作业进行资源的合理调度,假如三个作业都是I/O需求密集的作业,那么CPU可能仍然会有相当多的空闲时间,因此需要把对不同资源有不同需求的程序放在一起并行执行,这样才能最大提高资源利用率。
  2. 进程提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。但进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。如果把我们上课的过程看成一个进程的话,那么我们要做的是耳朵听老师讲课,手上还 要记笔记,脑子还要思考问题,这样才能高效的完成听课的任务。而如果只提供进程这个机制的话,上面这三件事将不能同时执行,同一时间只能做一件事,听的时 候就不能记笔记,也不能用脑子思考,这是其一;如果老师在黑板上写演算过程,我们开始记笔记,而老师突然有一步推不下去了,阻塞住了,他在那边思考着,而 我们呢,也不能干其他事,即使你想趁此时思考一下刚才没听懂的一个问题都不行,这是其二。

中断机制大讨论

中断

什么是中断?
  • 中断是指计算机运行过程中,CPU对中断信号的一种响应,cpu能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。中断是多道程序得以实现的基础,进程之间的切换是靠中断来完成的。
  • 类比的话,假如说我一心一意爱学习,我在做题时有小伙伴来找我,可我一心沉迷学习,等我把正在做的题的计算过程写完开始写答语的时候,我才顾得上抬头问问我伙伴找我啥事,小伙伴说有超级学霸要给大家讲一道很难的题,我马上在刚做完的题那块做了一个记号,然后跟着小伙伴去听学霸讲题,等结束后我再回来找到之前标记的地方继续做我的题。
  • 其中,小伙伴来找我去听学霸讲题就是中断发生,我停止做题就是CPU暂停正在执行的程序,我标记了一下做题做到哪儿了就是保留现场,跟着小伙伴一起去膜拜学霸就是转去执行相应事件的处理程序。学霸讲完题就是把事件处理完成,回来接着做题就是CPU返回到断点继续执行被打断的程序。
为什么引入中断?
  1. 提高计算机系统效率。最初引入硬件中断,只是为了优化性能。计算机系统如果没有中断,则处理器与外部设备通信时,它必须询问cpu是否忙碌状态若忙碌则会一直等待,并重新咨询cpu是否完成。我们知道,计算机内部的处理机的运行速度远远高于其他的外围设备的速度,而中断可以很好地将处理机与外围连接起来,有信息交换时进行发送、接收、响应、处理等步骤,无信息传递时,处理机和外围相对独立地并行工作;
  2. 维持系统可靠正常工作。在程序运行的过程中,有种种的特殊情况以及错误混乱的程序出现,而计算机为了保护其自身的安全性以及完整性,禁止程序员进行人为的操作干预,此时为了避免计算机继续处于一种危险状态,设置了一种可以监控程序运行,并且可以让程序员通过操作系统进行人为阻止的方式,即中断;
  3. 满足实时处理要求。在实时系统中,各种情况都有可能发生,为确保可以及时的处理响应,各种监测和控制装置随机地向处理机发出中断请求,处理机随时响应并进行处理,提高了计算机内部程序的安全性以及处理及时性;
  4. 为了支持CPU和设备之间的并行操作。当CPU启动设备进行输入/输出后,设备便可以独立工作, CPU会转去处理别的事情;当设备完成输入输出后,向CPU发中断信号,使得CPU回来继续执行输入输出之后的工作。此时的中断就是在模仿人的思维,使事件处理变得高效而又不错过重要的事情。
  5. 提供故障现场处理手段。处理机中设有各种故障检测和错误诊断的部件,一旦发现故障或错误,立即发出中断请求,进行故障现场记录和隔离,就像是在正在施工的道路上放一个标志符,提醒其他程序此程序需要进行隔离,延缓其故障以及程序危险,帮助处理机的进一步处理。
中断什么时候发生?
  • 中断在每条机器指令执行周期的最后时刻发生。
    在每条指令执行前都会检查是否有中断发生,因为中断都放在中断寄存器中,所以每条指令的最后时刻都会扫描一遍中断寄存器,如果有中断且允许中断则跳转到中断处理程序,若无中断,则继续执行指令。
中断发生时CPU做什么,中断处理机制做什么?
  1. CPU:发出中断响应信号;保留断点;给出中断入口,转入相应的中断处理程序。
  2. 中断处理机制:中断机制包括硬件的中断装置、操作系统的中断处理服务程序和相关软件。在中断机制中的硬件中断装置的作用就是在CPU每执行完一条指令后,判断是否有“事件”发生,如果没有“事件”发生,CPU继续执行;若有事件发生,中断装置中断原先占用CPU的程序的执行、保存现场、进行PSW的交换,操作系统的中断处理服务程序占用CPU对事件进行处理,处理完后,相关软件清除中断标记、恢复现场、恢复PSW,让被中断的程序继续占用CPU执行下去。
中断与系统调用有什么异同?
  • 相同:在处理机制上都是进行系统的来回切换
  • 不同:
    1. 中断是程序正在执行的过程中,随时被打断,而正在执行的程序可以是用户态也可以是内核态;而对于系统调用来说,只有在用户态程序才可以调用程序调用;
    2. 从原因来说,中断是由外设引起的;系统调用是应用程序请求操作系统接口提供相关服务。
为什么说中断机制是一种C/S模式?
  • 中断机制实际上是一种发出中断请求、响应中断请求的过程,外设向中断控制器发出中断请求(请求),CPU处理器通过中断控制器接收到中断请求并作出相应(服务)。所以中断的本质就是C/S模型的,程序(client)发送中断请求,中断处理程序(server)处理请求并给出响应(是屏蔽中断信号还是执行中断指令)。
认识感悟
  1. 中断是时时刻刻存在的,我本来以为中断作为一种C/S模型的机制,请求与响应都需要时间,况且我们程序员也可以通过中断指令对处理机实施监控以及处理危险的行为;但是在用$ cat /proc /stat 命令在终端窗口执行后,在intr一栏发现中断次数已是我不能想象的,毕竟我才打开终端不过数十分钟,中断机制的处理次数已达到近200亿。
  2. 中断处理的速度非常快,能在极短的时间处理了近200亿的中断指令。其速度也是非常快的,再细想,这里所呈现的中断次数仅仅是处理过的中断次数,中断寄存器中还有很多的中断指令准备被执行,我在终端中相隔五秒再次输入$ cat /proc /stat命令,发现其处理过的中断已经在原基础上增加了1亿次,可想中断处理的速度之快;
  3. 中断机制中存在优先级问题,在某一时刻有几个中断源同时发出中断请求时,处理器只响应其中优先权最高的中断源。当处理机正在运行某个中断服务程序期间出现另一个中断源的请求时,如果后者的优先权低于前者,处理机不予理睬,反之,处理机立即响应后者,出现了不同的中断请求时,处理机会对其优先级进行一个比较考量,处于高优先级的,程序会先行被处理,观察CPU0和CPU3就可以看出显著去区别。
  4. 中断有硬中断和软中断之分。
    1. 硬中断:硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。硬中断主要是用来通知操作系统外设状态的变化。硬中断可以直接中断CPU。它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程,中断代码本身也可以被其他的硬中断中断。
    2. 软中断:软中断是由当前正在运行的进程所产生的。通常,软中断是一些对I/O的请求,这些请求会调用内核中可以调度I/O发生的程序。软中断并不会直接中断CPU。
    • 硬中断发生的时间是随机的,而软中断发生的时间是由程序控制的。硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。
  5. 中断必须有处理函数,并且中断处理函数必须运行非常快。它最基本的工作就是告诉硬件已经收到了它发出的中断,但通常还执行大量其他的工作。为此,一般中断服务程序分为两半,一半是中数据恢复处理函数,称为上半部,它只执行那些可以很快执行的代码,如向硬件确认已经收到中断号等,其他的工作要延迟到下半部去执行。
  6. 有些中断很常用,会发生很多次,比如鼠标、键盘、时钟等,有些很少或基本不发生。此外中断大多数时候发生在某个CPU中,其他CPU不会被中断,其它cpu也没有处理事物处于待机状态,为了优化系统性能,可以将中断进行负载均衡,比如Linux可以调用优化模块irqbalance来实现自动的优化调节。

猜你喜欢

转载自blog.csdn.net/weixin_44321600/article/details/107339038