操作系统随笔(一)
你好朋友,当你点进来这份读书笔记时,我相信你不是无意中点进来就是对这一部分饶有兴趣,可惜的是,我也只是个普通的大学生,有时候对知识的见解获取没有屏幕前的你那么有天赋,所以在阅读完这篇文章的同时点个赞,并对文中的知识提出疑问是我最开心的事。
如果你已经看完了这一篇随笔,请移步到下一篇→操作系统随笔(二)_尘鱼好美的小屋-CSDN博客
引论
现代计算机系统组成由一个或多个处理器、主存、磁盘、打印机、鼠标、键盘、显示器、网络接口以及其他I/O设备组成。
操作系统是计算机安装的一层软件
,其任务是为用户程序提供一个更好、更简单、更清晰的计算机模型,并管理上面提到的所有设备。
我们通常使用的Windows、Linux、Mac也是操作系统,但需要注意的是,我们使用的通常都是其图形用户界面(Graphical User Interface)
,实际上它们并不是操作系统的一部分。
对于多数计算机来说其都有两个运行模式:即内核态
和用户态
。软件中最基础的部分是操作系统,它运行在内核态(也叫管态、核心态)。在这个模式中,操作系统具有对所有硬件的完全访问权,可以执行机器能够运行的所有指令
。
而其余软件则运行在用户态下,用户态下只能使用机器指令中的一个子集。那些会影响机器的控制或可进行I/O操作的指令在用户态是禁止使用的。
用户接口程序(shell或者GUI)处于用户态程序中的最低层次,允许用户允许其他程序,这些程序也大量使用操作系统。
而操作系统如图中所示,它运行在裸机之上,为所有其他的软件提供基础的运行环境。
操作系统和普通软件(用户态)之间最主要的区别是:如果你不喜欢一个播放器,你可以换一个;但是对于内核程序例如时间中断处理程序,这个程序是由硬件保护的,防止用户试图对其修改。但是需要注意的是,在有些操作系统,这个区别是模糊的,例如嵌入式系统(该系统没有内核态)
和解释系统(如基于java的操作系统,它采用解释方式而非硬件方式区分组件)
。
相比于普通的应用程序来说,操作系统的寿命是很长的,因为编写一个操作系统需要500万行甚至更多的代码。
1.1 什么是操作系统
操作系统是很难给出准确定义的。
1.1.1 作为扩展机器的操作系统
如果是不用操作系统的话,我们对资源的管理就涉及到对底层管理;比如你想创建一个文件,就需要考虑把他放在磁盘的哪个分区哪个扇区。这显然不应该是程序员该干的事;而操作系统就是帮我们提供硬件的抽象:文件。使用该抽象,可以在软件层面去管理资源,而无需考虑底层细节。
1.1.2 作为资源管理者的操作系统
把操作系统看做向应用程序提供基本抽象的概念,是一种自顶向下的观点。从硬件上看,操作系统的任务就是在相互竞争的程序之间有序的控制好各个硬件的分配。
而一台计算机有多个用户的话,合理解决用户对资源的共享也是操作系统该干的事情,即为不同的程序和用户调解互相冲突的资源请求。
资源管理包括用以下两种不同方式实现多路复用(共享)
资源,即时间上的复用和空间上的复用。
时间复用技术
当一个资源在时间上复用时,不同的程序或用户轮流使用它。至于轮流的排序,和每个程序或用户的使用时间安排,则是操作系统的任务。最好的例子就是打印机的共享,当有多个打印作业在一台打印机上排队等待打印时,必须决定将轮到打印的是哪个作业。
空间复用技术
每个客户得到资源的一部分从而来取代客户排队。通常在若干运行程序之间分割内存,这样每个运行程序都可以同时入驻内存。
使用空间复用技术还有磁盘。在许多系统中,一个磁盘为许多用户保存文件,分配磁盘空间并记录谁正在使用哪个磁盘块,是操作系统的典型任务。
1.2 操作系统的历史
1.2.1 第一代操作系统
操作系统已经存在许多年了。
第一代是1945-1955,使用的是真空管和穿孔卡片。第一代操作系统对应的计算机只能做一些简单的计算,如正弦余弦对数表或者计算炮弹弹道等。
1.2.2 第二代操作系统
第二代是1955-1965,使用的是晶体管和批处理系统。
在批处理系统还没出现的时候,如果要运行一个作业,程序员必须先将程序写在纸上,然后穿孔成卡片,再将卡片盒带入输入室,交给操作员,操作员就输入后坐等输出。
由于当时计算机的成本,人们很自然想要减少计算机时长的浪费,如果还是使用上述的方法,那么人不忙的时候机器忙,机器不忙的时候人忙着打孔做纸带。通常采用的解决方法就是
批处理系统
。其思想是在输入室收集所有的作业,然后把作业的内容读到磁带上,最后用磁带来带到机器面前输入。当时比较常用把作业的内容印在磁带上的机子是IBM1401。在收集了大约一个小时的批量作业后,纸带上的作业被读入磁带,磁带送到机房。操作员用一个特殊的程序来监督,这个特殊的程序是操作系统的前身,它从磁带上读入第一个作业就开始运行,它帮第一个作业的所有输出写到第二个磁带上,而不打印;当有多个作业的时候以此类推。当一批作业完全结束的时候,操作员取下输入和输出磁带,将输入磁带换成下一批作业,并且把输出磁带拿到IBM1401上进行脱机打印。
输入作业的结构一般长得像卡片一样,卡片上面的内容相当于是shell指令,上面写明了作业的最大运行时间、程序员名字、计费账号、编译器、源程序和结束控制。这种作业结构是很典型的FMS作业结构。
第二代计算机相比于第一代,能够计算一些比较繁琐的计算。其主要用于科学和工程计算,可用来解偏微分方程。
1.2.3 第三代操作系统
第三代是1965-1980,使用的是集成电路和多道程序处理。
在第三代操作系统中,弥补了第二代缺少的几项关键技术。最重要莫过于是多道程序处理,即多道批处理。在原来的单道批处理中,一次只能进入一个磁带,如果当前作业因等待磁带或者其他I/O操作而暂停,CPU就只能简单地等待I/O操作完成。对于CPU操作密集的科学计算问题,I/O操作比较少,因此浪费的时间很少。但是对于数据处理的问题,需要大量使用到I/O操作,此时CPU空闲。对此开发的多道批处理操作系统就是为了防止CPU的空闲时间浪费。
解决方案是内存分为几个部分,每一部分存放不同的作业。当一个作业正在执行I/O操作,那么另外一个作业可以使用CPU。如果内存中可以同时存放足够多的作业,那么CPU的利用率可以解决百分百。
第三代操作系统很适合大型计算和数据处理,但是本质上仍然是批处理系统。在第一代操作系统中,程序员可以一对一把控自己的需求,一旦临时有事可以暂时先停止,也可以中间换一个作业处理,但是对于第三代,批处理的作业一般涉及多个程序员,也就是说一旦开始不能随便停止,这样的话程序员控制缺乏;更重要的是如果其中一个程序员出了问题,大家都白干,因为可以会导致全员编译失败。
为了解决这个问题,分时操作系统
应运而生。实际上其为多道批处理系统的变体。
分时操作系统中,每个用户都有一个联机终端。假如如果有20个用户都在登录使用分时操作系统,但是17个休息,那么分时操作系统会把CPU分配给剩下的三个轮流执行。这样的好处是提供了
交互式服务
。而且由于一般调试程序的用户没有大工程,所以一般计算机处理每个用户的任务都很快。需要注意的是,这个时候已经引入了时间片
的概念,如果如上所说有三个用户在工作,那么操作系统是采取并发地形式快速地服务于每一个用户,每个用户服务的轮换时间都是相等的,这就导致了一旦有用户出现紧急需求想要立马处理手头的任务,也必须等到其对应时间片的到来。
1.2.4 第四代操作系统
第四代是1980至今,主要指的是个人计算机。
在早期微型计算机的CP/M、MS-DOS和其他操作系统,基本上都是没有鼠标只有个键盘,坐在电脑屏幕前敲指令。后来在斯坦福研究院的Doug Engelbart发明了图形用户界面,顺带发明了窗口、图标、菜单和鼠标。这对于不懂计算机的用户来说体验十分友好。
但是对于老牌程序员来说,它们更喜欢基于命令的界面而不是GUI,但是基本上所有的UNIX系统都是只会MIT开发的 X Window的视窗系统的。基于此系统之上,开发了Gnome和KDE,使得后来如Ubuntu的界面都可以做到和windows别无二致。
在这个时候分布式系统
和网络操作系统
也出现了。
1.2.5 第五代操作系统
第五代是1990至今,主要指的是移动计算机。
这个时候出现了如IOS、Android等主流操作系统,而SymbianOS(塞班系统)在智能手机出现的第一个十年站稳了脚跟,但是终究被安卓和苹果带来的浪潮所淹没在历史的海洋中,在此比较可惜的是坚守塞班系统的诺基亚,当智能手机最开始出现安卓的时候没能把握转型,现在诺基亚已经基本没什么人用了。
1.3 计算机硬件
从概念上来看,一台简单的个人计算机可以抽象成如下图所示:
其用一条总线
连接多台设备,使得各个硬件之间能够相互通信。但是对于现代个人计算机结构更加复杂,包含多重总线
。
1.3.1 处理器
1.3.1.1 处理器结构
计算机的大脑是CPU,它从内存中取出指令并且执行。
每个CPU都有一套可执行的专门指令集。但是如果每个CPU都是访问内存找指令或数据,那么所花时间要远远大于执行指令,这不符合其工作。为了解决这个问题寄存器
出现了。寄存器位于CPU内部。
寄存器中种类 | 作用 |
---|---|
通用寄存器 | 用来保存一些关键变量和临时数据 |
程序计数器 | 保存下一条指令的内存地址 |
堆栈指针 | 其指向内存中当前栈的顶端 |
程序状态字(PSW) | 其包含了条件码位、CPU优先级、模式(用户态或核心态),以及各种其他控制部位 |
为了改善CPU性能,CPU设计师放弃了以往的读取、解码、执行一条指令的简单模型,而采用了同时取出多条指令的机制。当执行指令n时,同时对指令n+1进行解码,并且读取指令n+2,这种机制被称为流水线
,如图所示:
比流水线更先进的设计时超标量CPU
,在这种设计中,有多个执行单元,例如一个CPU用于整数运算,一个CPU用于浮点算数运算。两个或多个指令被同时取出、解码并装入暂存缓冲区。如果简单打个比方就是,我们吃瓜子一般都是倒一堆在桌子上,而吃瓜子可以看成是执行指令,当指令执行完了,CPU会打开瓜子袋看看有没有瓜子,有就取出继续执行。
对于多数CPU来说,都有两种模式,即内核态和用户态。在PSW中有一个二进制位控制这两种模式。为了获得操作系统的服务,用户程序必须使用系统调用(system call)
启用陷入内核指令(trap)
来调用操作系统。trap指令把用户态切换为内核态,并且启用操作系统,当活干完了就把系统调用后面的指令控制权还给用户程序。
需要注意的是有时陷入指令的发送并非是用户程序请求操作系统服务,大多数情况下都是由于硬件出毛病了,普通软件处理不了了只能叫操作系统支援。
1.3.1.2 多线程和多核芯片
摩尔定律指出,芯片中晶体管的数量每18个月就要翻一番。可是大量的晶体管导致了CPU很难处理。为了解决这个问题,英特尔公司引入了多线程(超线程)
机制。多线程运行CPU芯片保持两种不同的线程状态,并且在纳米级的时间尺度中来回切换。
多线程对操作系统来说意义非常大,因为每个线程可以看成是单个CPU,在线程没有出现之前,进程看做单个CPU,这就导致了如果一台计算机只有一个四核CPU的话那其只能同一时刻开四个进程。这里讲到了多核CPU,那么多核CPU又是什么?
多核CPU芯片可以看做是一个大芯片里面套了好几个小芯片,每个小芯片都可以看做是一个独立的CPU,对于Intel Xeon Phi(中文名为
英特尔至强融核处理器
)来说,其上面甚至集成了60多个核。
虽然多核CPU很牛,但是说到多核,可能没有比GPU
更牛的了,GPU指的是成千上万个微核组成的处理器,其适用于大量的并行简单计算,还有图像处理,但是其不太适应串行任务,而且对于编程及算法的实现难度过高,所以一般操作系统还是运行在CPU上比较好。
1.3.2 存储器
在任何计算机中,第二种主要部件都是存储器。
存储器对于外行人来说一听就认为是磁盘,实际上不是的,存储器有很多种,常见的有以下几种:
存储器 | 说明 |
---|---|
寄存器 | 寄存器处于CPU内部,它们用CPU相同的材料制成,所以和CPU一样快。 |
高速缓存 | 简称缓存,把频繁使用的内容放于缓存,可以提高使用的速度。 |
主存 | 通常指随机访问存储器(RAM),高速缓存不能得到访问的请求都会转到主存做请求。 |
磁盘 | 传统的为机械硬盘,现在出现了固态硬盘 |
主存通常指随机访问存储器(RAM),一般分为两种,一种是易失性随机访问存储器,如RAM(磁芯存储器)、CMOS;另外一种是非易失性随机访问存储器,它们和RAM不同,遇到突然的外界因素不会丢失其内容。例如:ROM(只读存储器)、EEPROM(电可擦除可编程ROM)、闪存。
其中闪存常用于便携式电子设备中,速度介于RAM和磁盘之间。但是闪存如果擦除的次数太多会有损耗。
传统机械磁盘的结构类似于老式唱片机,磁盘中的磁盘片上有许多同心圆轨道,称为
磁道
;读写头叫做磁头
;提供多个磁头的力臂叫磁头臂
。所以磁道合并起来组成一个柱面
。每个磁道划分为若干扇区,一个扇区典型值为512字节。磁头在读写操作的时候,必须要找到对应内容所在扇区的磁道才能进行读写。
而对于固态硬盘(SSD)来说,其数据存储在闪存中,与磁盘相似的地方是即使突然断电也不会丢失数据。
目前来说,许多计算机支持虚拟内存
,其可以使得期望内存大于物理内存。比如你的电脑运行内存是4G,那么实际可以运行的程序可能远远大于4G。虚拟内存的原理是把程序放在磁盘上,而将主存作为一种缓存,用来保存最频繁使用的部分程序。举个例子就是:通过对程序的切割,少用的部分放于磁盘,多用的部分放于缓存。这实际上就是1.1.2谈到的空间复用技术
。
通过映像内存地址,可以把磁盘中的程序抽离出来,这种映像是由CPU中名为存储器管理单元(MMU)的部件来完成的。所以如果你想在多程序操作系统中频繁地切换进程,那么操作系统每次都要修改MMU,这种操作我们叫做上下文切换
,代价是否昂贵。
1.3.4 I/O设备
对于不同的设备,存在不同的设备控制器,而对于不同的设备控制器,又存在不同的软件去进行控制,我们称这类软件为设备驱动程序
。
使用设备驱动程序涉及到设备管理,所以CPU必须在内核态下才能运行。当然也有很少的一部分现代系统可以在用户态驱动。
实现输入输出的方式有三种。最简单的方式莫过于系统调用
。操作系统内核将系统调用翻译为一个对应设备驱动程序的过程调用,然后设备就会重复检查自己的工作是否做好,做好了就把控制权还给操作系统。这种方式叫做忙等待
。其缺点是要占据CPU,CPU一直在问驱动设备:你搞完没有?
第二种方式是中断,驱动设备完成操作后,必须发出一个中断,提示操作系统任务完成。
第三种方式是使用一种特殊的直接存储器访问芯片(DMA)。
中断常常发生,而且一般发生没有好事;对于多个中断,中断控制器会对优先级高的中断优先处理,而对于没法优先处理的,CPU可以先关掉中断但是保持中断信号,等下再帮他开中断。
1.3.5 总线
总线有很多如PCIe、PCI、ISA、USB、SCSI。
其中我们熟悉的USB一般用于慢速I/O设备的连接,比如键盘和鼠标。而SCSI是高速总线,一般用在高速硬盘、扫描仪和其他需要较大带宽的设备上。目前,SCSI用于服务器和工作站。
1.4 其他的操作系统
在1.2中,我们谈论了许多操作系统,那是针对于历史来说的,在现代,有很多操作系统百花齐放。
1.4.1 大型机操作系统
这类操作系统一般长得像房间那么大,可以在一些大型公司的数据中心见到,其拥有巨大的IO处理能力,可以实现批处理、事务处理和分时三种操作系统。
1.4.2 服务器操作系统
服务器可以是个人计算机、工作站、大型机,我们常说的服务器操作系统有:Solaris、FreeBSD、Linux、WindowsServer201x。
1.4.3 多处理器操作系统
这种操作系统一般是为了提高计算能力,采用多个CPU连接单个系统。一般根据连接方式和共享方式的不同,分为:并行计算机、多计算机、多处理器。
在前面我们提到多核CPU,也就是说,其本质也是一个多处理器。目前许多操作系统如Windows和Linux都可以应用在多核处理器上。
1.4.4 个人计算机操作系统
这个就不用我说了吧,玩了这么多年电脑了还玩不明白吗。
1.4.5 掌上计算机操作系统
常见的就是那几个了,安卓、IOS、鸿蒙。
1.4.6 嵌入式操作系统
这类操作系统是用来控制设备的,一般所在的计算机不是一般意义的计算机,这种操作系统不允许用户
安装软件,如微波炉、智能灯、智能音箱、电视机、电饭煲。主要的嵌入式操作系统有Linux、QNX、VxWorks。
1.4.7 传感器操作系统
和嵌入式系统一样,该操作系统不允许用户安装软件,所有程序都是提前装好的,如TinyOS。
1.4.8 实时操作系统
这类操作系统看重时间
。其主要优点就是能够优先响应一些紧急任务,某些紧急任务不需时间片排队。在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要严格的时限内处理完事件。实时操作系统的主要特点是及时性
和可靠性
。
实时操作系统分为两大类:硬实时系统
和软实时系统
。硬实时系统必须在绝对严格的规定时间内完成处理,例如导弹控制系统、自动驾驶系统。而软实时系统能接受偶尔违反时间规定,如12306火车订票系统,偶尔没有及时更新火车票的信息也没什么问题。
1.4.9 智能卡操作系统
在智能卡上的操作系统是最小的,里面只包含一块CPU芯片。需要知道的是,有些智能卡是面向Java的,也就是说,其ROM里面有一台JVM。Java小程序可以下载到智能卡中。
文章来源: blog.csdn.net,作者:ArimaMisaki,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/chengyuhaomei520/article/details/122736050
- 点赞
- 收藏
- 关注作者
评论(0)