为什么要有操作系统
现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入,输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现的细节,并且管理优化这些部件是一件挑战性极强的工作。所以,我们需要为计算机安装一层软件,成为操作系统,任务就是用户程序提供一个简单清晰的计算机模型,并管理以上所有设备。
定义也就有了:操作系统是一个用来协调、管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间。(程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。)
操作系统的发展历史
手工阶段
早期的程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
手工操作方式有两个特点:
批处理阶段
出现了批处理系统,它是加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
为了解决上面手工阶段的问题,所以产生了批处理系统,而批处理系统又分为单道批处理和多道批处理。
单道批处理
系统对作业的处理是成批进行的,但内存中始终保持一道作业。该系统主要特征如下
1)自动性:无需人工干预
2)顺序性:磁带上的各道作业顺序进入内存,作业完成顺序与其进入内存的顺序,在正常情况下应完全相同
3)单道性:内存中只允许存在一道程序运行
多道批处理
多道程序设计技术允许多个程序同时进入内存,并在操作系统的控制下交替运行。内存中的程序共享系统中各中硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。其主要特点如下:
1)多道:计算机内存中同时允许多道相互独立的程序
2)宏观并行:同时进入系统内存的多道程序都处于运行过程中,宏观上在并行运行
3)微观串行:内存中多道程序流轮流占有CPU,交替执行
多道批处理系统的优点是资源的利用率高,系统吞吐量大,CPU和其他资源都处于忙碌状态。缺点是用户响应时间较长。不提供人机交互能力,用户既不了解自己程序的运行情况,也不能控制计算机。
分时系统
由于CPU速度不断提高和采用分时技术,一台计算机可同时连接多个用户终端,而每个用户可在自己的终端上联机使用计算机,好象自己独占机器一样。
分时技术:把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。
若某个作业在分配给它的时间片内不能完成其计算,则该作业暂时中断,把处理机让给另一作业使用,等待下一轮时再继续其运行。由于计算机速度很快,作业运行轮转得很快,给每个用户的印象是,好象他独占了一台计算机。而每个用户可以通过自己的终端向系统发出各种操作控制命令,在充分的人机交互情况下,完成作业的运行。
具有上述特征的计算机系统称为分时系统,它允许多个用户同时联机使用计算机。
特点:
(1)多路性。若干个用户同时使用一台计算机。微观上看是各用户轮流使用计算机;宏观上看是各用户并行工作。
(2)交互性。用户可根据系统对请求的响应结果,进一步向系统提出新的请求。这种能使用户与系统进行人机对话的工作方式,明显地有别于批处理系统,因而,分时系统又被称为交互式系统。
(3)独立性。用户之间可以相互独立操作,互不干扰。系统保证各用户程序运行的完整性,不会发生相互混淆或破坏现象。
(4)及时性。系统可对用户的输入及时作出响应。分时系统性能的主要指标之一是响应时间,它是指:从终端发出命令到系统予以应答所需的时间。
分时系统的主要目标:对用户响应的及时性,即不至于用户等待每一个命令的处理时间过长。
分时系统可以同时接纳数十个甚至上百个用户,由于内存空间有限,往往采用对换(又称交换)方式的存储方法。即将未“轮到”的作业放入磁盘,一旦“轮到”,再将其调入内存;而时间片用完后,又将作业存回磁盘(俗称“滚进”、“滚出“法),使同一存储区域轮流为多个用户服务。
多用户分时系统是当今计算机操作系统中最普遍使用的一类操作系统。
实时操作系统
虽然多道批处理系统和分时系统能获得较令人满意的资源利用率和系统响应时间,但却不能满足实时控制与实时信息处理两个应用领域的需求。于是就产生了实时系统,即系统能够及时响应随机发生的外部事件,并在严格的时间范围内完成对该事件的处理。
实时系统在一个特定的应用中常作为一种控制设备来使用。
实时系统可分成两类:
(1)实时控制系统。当用于飞机飞行、导弹发射等的自动控制时,要求计算机能尽快处理测量系统测得的数据,及时地对飞机或导弹进行控制,或将有关信息通过显示终端提供给决策人员。当用于轧钢、石化等工业生产过程控制时,也要求计算机能及时处理由各类传感器送来的数据,然后控制相应的执行机构。
(2)实时信息处理系统。当用于预定飞机票、查询有关航班、航线、票价等事宜时,或当用于银行系统、情报检索系统时,都要求计算机能对终端设备发来的服务请求及时予以正确的回答。此类对响应及时性的要求稍弱于第一类。
实时操作系统的主要特点:
(1)及时响应。每一个信息接收、分析处理和发送的过程必须在严格的时间限制内完成。
(2)高可靠性。需采取冗余措施,双机系统前后台工作,也包括必要的保密措施等。
内核态和用户态
操作系统结构
操作系统的发展大致经历了无结构操作系统(第一代),模块化的操作系统(第二代),分层式结构(第三代),这些称为传统操作系统结构。而微内核操作系统是现代操作系统结构,他是在C/S(客户端/服务器)这种架构方式上发展起来的。传统操作系统的内容,大家只需要了解就可以了。重点在微内核操作系统。
微内核操作系统
微内核操作系统往往采用的是C/S模式,它把操作系统分为微内核和多个服务器。微内核主要用于(1)实现与硬件紧密相关的处理,(2)实现一些较基本的功能,(3)负责客户和服务器之间的通信。
内核的功能
- 进程(线程)管理 (进程或者线程的调度)
- 低级存储器管理 (用户程序逻辑空间到内存空间的物理地址的变换)
- 中断和陷入管理 (中断和陷入)
由于微内核结构的存在,那么程序就运行在两种不同的地方,内核态和用户态,内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系。
特权级
对于任何一个操作系统来说,创建一个新的进程都属于核心功能,因为它要做很多底层细致的工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等,这些显然不能随便让哪个程序就能去做,于是就自然引起了特权级别的概念,显然,最关键性的权力必须由高特权级别的程序来执行,这样才能做到几种管理,减少有限资源的访问和使用冲突。特权级别显然是非常有效的管理和控制程序的执行手段,因此在硬件对特权级别做了很多支持,就Intel的x86架构的CPU来说,一共由0~3四个特权级,0为最高,3为最低,硬件上在执行每条执行的时候都会对指令所具有的特权级做相应的检查,相关概念有CPL,DPL和RPL,这里不在多阐述,硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用这个问题,这属于操作系统要做的事情,对于Unix/Linux来说,只使用了0级特权和3级特权。也就是说在Unix和Linux中,一条工作在0级特权的指令具有CPU能提供的最高权力,而一条工作在3级特权的指令具有CPU提供的最低或者说最基本的权力。
内核态和用户态
根据上面说的特权级,来理解用户态和内核态就比较好理解了,当程序运行在3级特权的时候就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进行运行的特权级,大部分用户之间面对的程序都是运行在用户态;反之,当程序运行在0级特权级上时,就可以称之为是运行在内核态。虽然用户态下和内核态下工作的程序有很多差距,但是更重要的差别就在于特权级的不同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。
内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。其他的属于用户态。用户程序运行在用户态,操作系统运行在内核态.(操作系统内核运行在内核态,而服务器运行在用户态)。用户态不能干扰内核态.所以CPU指令就有两种,特权指令和非特权指令.不同的状态对应不同的指令。特权指令:只能由操作系统内核部分使用,不允许用户直接使用的指令。如,I/O指令、置终端屏蔽指令、清内存、建存储保护、设置时钟指令(这几种记好,属于内核态)。 非特权指令:所有程序均可直接使用。
所以:
系统态(核心态、特态、管态):执行全部指令。
用户态(常态、目态):执行非特权指令。
用户态和内核态的转换
用户态切换到内核态的3种方式
- 系统调用
- 系统调用这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
- 异常
- 当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
- 外围设备的中断
- 当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
具体的切换操作
从触发方式上看,可以认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一致的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本上也是一致的,关于它们的具体区别这里不再赘述。关于中断处理机制的细节和步骤这里也不做过多分析,涉及到由用户态切换到内核态的步骤主要包括:
- 从当前进程的描述符中提取其内核栈的ss0及esp0信息。
- 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令。
- 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。
常见的内核态常见总结
前文已经提到,内核的功能:
(1)进程(线程)管理 (进程或者线程的调度)
(2)低级存储器管理 (用户程序逻辑空间到内存空间的物理地址的变换)
(3)中断和陷入管理 (中断和陷入)
具体的:
(1) I/O指令、置终端屏蔽指令、清内存、建存储保护、设置时钟指令。
(2) 中断、异常、陷入,比如缺页中断等
(3)进程(线程)管理
(4)系统调用,比如调用了设备驱动程序
(5)用户内存地址的转换(逻辑---> 物理映射)
并行和并发
关于并行与并发说有很多,这里列举一些常见的说法:
- 解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
- 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
- 解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群
简单理解就是:
并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
来个比喻:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。
同步与异步
同步和异步通常用来形容一次方法调用。
- 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
- 异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。