作业系统 (operating system)
是控制电脑整体运作的软体,提供使用者储存和读取档案的路径、提供介面让使用能执行程式和提供程式执行所需要的环境。
最着名的作业系统是微软开发的 Windows
他广泛地用在个人电脑中,另一个享有盛名的是 UNIX
广泛用于大型电脑系统或个人电脑,UNIX 也是两个很受欢迎的作业系统的核心,Mac OS
是 Apple 开发的作业系统,还有还有一种作业在大型电脑系统或个人电脑中常见的 Linux
是由一群电脑爱好者所开发的非商业性作业系统。
作业系统的历史
初期的作业系统仅只是为为简化程式设定和精简工作过度流程,早期的作业系统是将使用者
与设备
分离开来以减少人员进出电脑室的次数,要达到此目的就需要电脑操作人员来操作电脑,想要执行程式的人将程式和所需要的资料及程式执行所需要的说明提交操作人员,操作人员把程式和资料在载入到电脑的储存设备中,接着作业程序的城市会读取并执行这些程式,每次只执行一个这也就是所谓的批次处理 (batch processing)
,亦即先把所有要执行的工作集合成一批在一个一个的处理,期间使用者将不会进行电脑的操作。
在批次处理的作业系统中,位于储存设备中的设备在工作的工作伫列 (job queue)
中等着被执行,伫列 (queue)
是一个储存系统,遵照着先进先出 (first-in, first-out FIFO)
的顺序执行。
但实际上大部分的工作并没有严格的执行 FIFO 的顺序,因为大多数的作业系统考量到工作的优先权,因为较高优先权的工作可以挤掉在工作伫列中等待执行的工作。
在早期批次处理的作业系统中每个工作都盼随着一组指令,用于说明电脑执行该程式时需要做的準备工作,这些指令是经过编码以系统所知的工作控制语言 (job control language, JCL)
撰写,并与工作一起储存在工作伫列中,当程式要执行时作业系统会命令印表机影印出这些指令让操作人员可以照这些指令进行操作。
使用批次处理的作业系统的缺点就是一但将工作交给操作人员后就无法与他们的工作有互动,所以为了顾及互动的需求于是开发了新的作业系统,允许程式在执行时可以让的使用者透过远程终端机与程式进行互动,这种功能称为交谈式处理 (interactive processing)
。
交谈式处理的成功要素就是需要动作够快,所以电脑比需要在某个时间前将工作执行完毕,因次所谓的及时处理 (real-time processing)
的程序就是指需要及时完成的程序,若电脑能够即时执行某个工作表示该电脑能很快的在时限内完成该动作,但交谈式系统一次只能服务一个使用者
,所以无法解决需要满足多人使用的功能。
这个问题的解决办法就是设计能够同时服务多人的作业系统
: 系统要有分时 (time-sharing)
的特性,有一种实践分时概念的方法称为多程式化 (multiprogramming)
,亦即时间被切割取多区域而每个工作只允许执行一个区段的时间
,在区段时间结束时正在执行的工作就会暂时放在一边,另一个工作会在下一个时间区段执行,藉由这种快速交错执行可以产生许多工作同时执行的错觉。
到了现代作业系统地不断演进,多处理器电脑的发展让作业系统能够藉由支配不同工作给不同处理器的方式而有分时/多工
处理的能力,这类的作业系统必须处理像负载平衡 (load balancing)
和 分割 (scaling)
这类的问题,负载平衡是只能够动态分配工作到不同处理器
,使得所有处理器都能有效率的被利用到,而分割是指将工作分割为数个小工作
,让所有处理器可以同时处理。
作业系统架构
为了了解一般作业系统架构,先来看看一般电脑系统中的软体类型
软体概观
电脑软体区分为两大类: 应用软体 (application software)
和 系统软体 (system software)
,应用软体包含特定用途
的软体比如资料库系统
, 排版系统
, 会计系统
...。
而系统软体一般用于电脑共通的工作上,系统软体提供了应用软体所需要的基础环境
,而系统软体又可以分为两类,一类是作业系统本身
另一类是公共软体 (utility software)
,多数公共软体用于电脑基础硬体设备的运作
上但不包含作业系统,从某种意义上来说公共软体所包含的软体是用于扩充作业系统的效能。
作业系统的元件
为了执行电脑使用者所要求的工作,作业系统必须要能够与使用者进行沟通,而作业系统处以沟通的元件称为使用这介面 (user interface)
,旧得使用者介面称为外壳 (shells)
是利用键盘
和萤幕
透过文字讯息
的方式与使用者进行沟通; 而较新的系统使用图形使用者介面 (graphocal user interface, GUI)
则是利用物件的方式来处理和使用者的沟通,虽然作业系统的使用者介面扮演着重要的角色,但也仅是作为使用者与作业系统之间的中介者。
相对于作业系统的使用者介面,作业系统内部称为核心 (kernel)
,它包含着哪些负责执行电脑基本功能的软体。
作业系统的核心元件是装置驱动程式 (device drivers)
,也就是用来沟通控制器的软体元件,让连接于电脑的周边设备能够正常运作,而每个装置驱动程式都是针对特定
型态的装置所设计的,并将电脑装置的操作请求转呈装置内部的特定程序。
作业系统的另一个核心元件是记忆体管理员 (memory manager)
负责协调主记忆体的使用,在多人多工的还境下电脑在同一时间需要服务多人或执行多个程式,这种情况下记忆体管理员就非常重要了,多个程式和资料区块同时存在主记忆体中,因此主记忆体必须要为了这些程式和资料只配记忆体空间并确保每个程式的运作都只局限在各自分配到的记忆体空间中,随着程式和资料的来来去去,记忆体管理员就必须追蹤这些记忆体的使用状况。
若是主记忆体所需要的空间超过电脑实际的空间的话,记忆体管理员就会将程式和资料在主记忆体和储存装置中来回搬动以製造还有额外记忆体的假象,这种技术称为分页处里 (paging)
,分页技术所製造出来的虚假记忆体空间称为虚拟记忆体 (virtual memory)
。
启动作业系统
作业系统的启动是透过开机程序 (boot strapping)
来完成简单来说就是开机 (booting)
,每当电脑打开后就会自动执行,这是将作业系统从硬体或其他储存装置载入到主记忆体中(当电脑打开时,主记忆体并未储存任何内容),当电脑第一次开启时记忆体内需要有一个程式,但每当电脑关闭时储存在记忆体的内容就会跟着消失,为了解决这个问题 CPU 会从电脑主记忆体的某个区块读取初始程式,这个初始程式放置于种特殊非挥发
的记忆体中称为唯读记忆体 (read-only memory, ROM)
。
一般电脑中有个启动载入器 (boot loader)
的程式储存于 ROM
中,他就是当电脑第一次开启时的初始程式,会引导 CPU 将作业洗桶从预先设定好的位置仔入到记忆体中,新式的启动载入器可以从任何位置将作业系统载入到主记忆体中,所以执行启动载入器
和启动作业系统
就称为电脑的开机 (booting)
。
协调电脑的内部运作
本章要介绍作业系统如何协调应用软体、公共软体以及作业洗桶元件之间的执行工作。
处理程序的概念
现代作业系统最基本的概念之一是程式与执行程式的区别,程式是静态的指令集合,执行程式是动态的运作,程式的执行是在作业系统的控制下运作
称为处理程序 (process)
,与处理程序相关连的是该程式执行的状态称为处理状态 (process state)
,一般分时多工的电脑会执行许多处理程序,所有的处理程序会彼此竞争电脑资源,所以作业系统会负责管理这些处理程序,让每个处理程序能够得到它需要的资源。
处理程序管理
协调处理程序的工作是由作业系统核心内的排程器 (scheduler)
和调度器 (dispatcher)
负责。
排程器 (scheduler)
排程器 (scheduler) 纪录着电脑执行中的所有处理程序,并加入新的处理程序或移除已完成的处理程序,排程器为了要追蹤所有处理程序就需要在主记忆体中佔用一块区域,称之为处理程序表 (process table)
,每当有程式要求执行就会在这里新增一个项目以加入到新的程序中,如果是可以执行的状态则该程序会定义为就绪 (ready)
,如果需要延迟则定义为 等待中 (watiting)
。
调度器 (dispatcher)
调度器 (dispatcher) 是作业系统核心元件之一,主要负责监控已排成的处理程序,在多时多工的系统中透过多程式化 (multiprogramming)
还处理已排程的程序,换句话说就是把时间分割为小片段,每个片段称为时间片段 (time slice)
可以让 CPU 在不同处理程序间转换,每个处理程序只能执行一个时间片段,CPU 在处理程序之间切换的动作称为处理程序交换 (process seitch)
或数据交换 (context switch)
。
每个调度器给予一个处理程序一个时间片段就会启动一个计时器电路,他在时间片断结束时会送出一个讯号称为中断 (interrupt)
,CPU 收到后会暂停目前进行的工作并记录工作中的阶段以便稍后可以返回该进度然后再处理中断的事情,所以当 CPU 收到中断讯号会先完成目前的机械週期,保存状态最后才执行中断处置气 (interrupt handler)
的程式,因此中断讯号造成的效应是将目前执行的处理程序暂停
,然后将控制转给调度器此时调度器会从处理程序表中选择一个最高优先权且已就绪
的处理程序让他执行。
执行程序间的竞争关係
作业系统的一项重要工作就是配置电脑资源给系统中的处理程序。
信号标
当作业系统需要追蹤某设备是否已经被使用,有一种方法是使用旗标
,他是指记忆体上某个位元,状态通成为有 (set)
和 无 (clear)
,一个无旗标代表设备可以使用反之代表有设备正在被使用,但这种检查和设定旗标可能需要数个机械指令来完成,因此可能在侦测到无旗标后以及设定旗标值之前产生一个中断讯号,比如说要使用某个设备前检测他的旗标发现是无,正要使用这个设备时他的时间片断到期时,换了一个处理程序但他也是要使用该设备,所以他也会监测到此设备的旗标为无,所以就会开始使用这个设备,但当他的时间週期也结束切回一开始的处理程序时,他会遵照刚刚收到某设备旗标为无的结果使用该设备,这样就会导致两个不同的处理程序同时使用同一个设备。
解决办法就是坚持不让检查与设置旗标的工作被中断,有两种方法:
使用机械语言的指令: 使用多数机械语言提供的中断去能 (interrupt disable)
和中断赋能 (interrupt enable)
两个指令,若作业系统开始旗标值检查会启动中断去能指令以防止动作被中断,当检查完后就会使用中断赋能重新让中断功能恢复。使用测试及设定指令 (test-and-set): 引导 CPU 去读取旗标值接收到旗标值后设置旗标值,这些动作可以在一个机器指令中完成,好处是 CPU 会在收到中断讯号前完成整个指令。死结 (deadlock)
资运配置会遇到另一个问题就是死结 (deadlock)
,当两个以上的处理程序由于彼此都在等待一个已配置给对方资源而无从取得进展,比如说一个处理程序已获得设备 A 的存取权限但在等待设备 B 的存取权限,但另一个处理程序则是获得了设备 B 的存取权限但在等待设备 A 的存取权限,这样就会造成死结 (deadlock),要符合三种情况才可能发生死结:
死结侦测与修正法会
侦测死结是否发生并强制取回某些以配置的资源
已修正死结问题,例如使用这可以使用 kill
强制删除某些处理程序,死结避免法
则是让每个处理程序一次请求所有的资源或是将不可共用的资源转换为可共用资源,简单来说就是将某个资源的请求全部同意并存放在一个位置中先保留起来等时机成熟后再输出,这种技巧称为排存 (spooling)
。
多核心作业系统: 传统分时多工系统利用人力无法察觉的切换速度达到可以处理多个处理程序的错觉,但现在的多核处理器则是真正能做到同时处理多个处理程序的功能,所唷对一个多核心的作业系统来说,排程器与调度器比须安排那个处理程序在哪个核心就会变得更複杂。
安全性
由于作业系统会监控电脑中发生的任何事件,所以很自然的也要维护着电脑的安全性。
外部攻击
作业系统的一项重要任务就是防止电脑资源被未授权者进行存取,再多人共用的情况下,通常会对使用者建立使用者帐号 (account)
,所以在系统中每个帐号其实都是一笔纪录,包含了使用者名称、密码和使用者权限等等,这样作业系统就可以依据帐号内容掌控使用者对系统的存取。
这些使用这帐号通常是由超级使用者 (super user)
或管理员 (administrator)
所建立,他们拥有整个系统的最高权限,一但登录系统就可以修改作业系统的设定值、变更重要软体元件、调整使用者权限和执行许多系统维护工作,这些是一般使用者无权执行的。
所以身为系统的最高权限者也可以监控系统中的所有事件,以找出任何破外系统的行为,所以为了辅助这些安全性的监控,所以发展出许多多稽查软体 (aduiting software)
,能够纪录并分析电脑系统所发生的事件,简单来说他可以侦测使用不正确密码登录的行为也可以找出使用者与平常活动不相符的行为,比如说某个使用者常常只会用文书软体或试算表,但某天突然开始使用高技术性的应用工具等等。
内部攻击
一但入侵者得到的系统的权限,就会开始取得想要的资讯或是破坏系统的设置,如果是一般的使用者被入侵就必须要骗过系统以获取更高的权限,但现今的 CPU 都经过强化可以阻挡类似的攻击,比如处理程序被严格限制仅能存取记忆体管理员所配置的记忆体区块,若没有这样的限制则处理程序就可以存记忆体删除整个作业系统进而控制整个电脑。
多程式化系统的 CPU 会在两种特权等级 (privilege level)
其中之一运作,一种是特权模式
另一种是非特权模式
,在特权模式下 CPU 能够执行所有机械语言下达的指令,相反的非特权模式中就只能执行有限的指令。
能在特权模式下执行的指令称为特权指令 (privileged instructions)
,当 CPU 在非特权模式下运行时,如果尝试执行一个特权指令的话会导致一个中断程序
,他会将 CPU 的运行模式转换为特权模式
并且将控制权交给作业程序里的中断处置器。
当电脑开启时 CPU 会处于特权模式,因此在开机程序后启动作业程序时所有指令都能执行,然而每次作业系统允许处理程序使用其时间片段时,他会执行变更特权模式
将 CPU 转为非特权模式,这样的好处是如果这个处理程序想要执行一个特权指令时,系统就会被告知。