软件中最基础的部分是操作系统,它运行在内核态(也称为管态、核心态)。在这个模式中,操作系统具有对所有硬件的完全访问权,可以执行机器能够运行的任何指令。软件的其余部分运行在用户态下。在用户态下,只使用了机器指令中的一个子集。特别是那些会影响机器的控制或可进行I/O的操作指令,在用户态中的程序是禁止的。
作为资源管理者的操作系统:负责对系统的硬软件资源实施有效的控制和管理,提高系统资源的利用率。
资源管理包括用一下两种不同方式实现多路复用(共享)资源:
在时间上复用:当一种资源在时间上复用时,不同的程序或用户轮流使用它。
在空间上复用:每个客户都得到资源的一部分,从而取代了客户排队。
3. 作为扩展机器的操作系统:是计算机硬件的首次扩充,掩盖了硬件操作的细节,使用户或程序员与硬件细节隔离,从而方便了用户的使用。
操作系统的作用
从一般用户的观点来看,操作系统是用户与计算机硬件系统之间的接口。用户并不直接与计算机硬件打交道,而是通过操作系统提供的命令,系统功能调用以及图形化接口来使用计算机。
从资源管理的观点来看,操作系统使计算机资源的管理者。处理机的分配和控制,内存的分配和回收,I/O设备的分配和处理,文件的存取,共享和保护工作都是由操作系统完成的。
从虚拟机的观点来看,操作系统是扩充裸机(没有配置软件的计算机)功能的软件。在裸机上覆盖操作系统后,裸机将变成一台功能更强大使用更方便的虚拟机。
从任务组织的观点来看,操作系统是计算机工作流程的组织者。它负责在众多作业间切换处理机,并协调它们的推进速度,从而进一步提高系统的性能。
操作系统的设计目标
方便性:操作系统使计算机系统更易于使用
有效性:操作系统使计算机资源的使用更有效,即使资源的利用率更高
可扩充性:操作系统必须能方便地开发,测试和引进新的系统功能,以适应计算机硬件和体系结构的迅速发展以及应用不断扩大的要求
开放性:操作系统必须能提供统一开放的环境,以使其应用在不同的系统中具有可移植性,并使不同的系统能够通过网络进行集成,从而能正确,有效地协同工作
计算机硬件介绍
1. 处理器CPU
计算机的大脑是CPU,它从内存中取出指令并执行。在每个CPU基本周期中,首先从内存中取出指令,解码以确定其类型和操作熟,接着执行之,然后取指、解码并执行下一条指令。
寄存器:在CPU内部用来保存关键变量和临时数据。种类:程序计数器、堆栈指针、程序状态字
2. 存储器
寄存器:它们用与CPU相同的材料制成,所以和CPU一样快,访问没有延时
高速缓存:其作用是为了更好的利用局部性原理,减少CPU访问主存的次数。简单地说,CPU正在访问的指令和数据,其可能会被以后多次访问到,或者是该指令和数据附近的内存区域,也可能会被多次访问。因此,第一次访问这一块区域时,将其复制到cache中,以后访问该区域的指令或者数据时,就不用再从主存中取出。现代CPU中设计了两个缓存:L1缓存和L2缓存,两者的差别在于时序,对于L1缓存的访问,不存在任何延时;而对于L2缓存的访问,则会延时1或2个时钟周期。
主存:也称为随机访问存储器(RAM),所有不能在高速缓存中得到满足的访问请求都会转往主存。
磁盘:磁盘唯一的问题是随机访问数据时大约慢了三个数量级。其低速的原因是因为磁盘是一种机械装置。
3. 输入/输出设备
I/O设备一般包括两个部分:设备控制器和设备本身。
控制器:它是插在电路板上的一块芯片或一组芯片,这块电路板物理的控制设备。它从操作系统接收命令。例如,从设备读取数据,并且完成数据的处理。每类设备控制器都是不同的,所以,需要不同的软件进行控制。专门与控制器对话,发出命令并接受响应的软件,称为设备驱动程序
实现输入和输出的方式有三种:忙等待、中断、直接存储器访问
4. 总线:系统中有很多总线,每条总线的传输速度和功能都不同
什么是进程?
狭义定义:进程本质上是正在执行的一个程序,程序一旦运行就是进程
广义定义:进程是具有独立功能的程序关于某个数据集合的一次运行过程。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。进程由程序、数据和进程控制块(PCB)三部分组成。
进程的特征:
1.在某一个瞬间,CPU只能运行一个进程。但在1秒钟内,它可以运行多个进程,这样就产生并行的错觉。真正的CPU在各个进程之间来回切换,称为多道程序设计。
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
2.进程的三种基本状态
就绪状态:进程已获得除处理器外的所需资源,等待分配处理器资源,只要分配了处理器进程就可执行(可运行,但因为其他进程正在运行而暂时停止)
运行状态:进程占用处理器资源,处于此状态的进程的数目小于等于处理器的数目(该时刻进程实际占用CPU)
阻塞状态:由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理机分配给该进程,也无法运行(除非某种外部事件发生,否则进程不能运行)
3.进程的创建和终止
导致进程创建的事件:系统初始化;正在运行的程序执行了创建进程的系统调用;用户请求创建一个新进程;一个批处理作业的初始化
在UNIX系统中,只有一个系统调用可以用来创建新的进程:folk
导致进程终止的事件:正常退出(自愿的);出错退出(自愿的);严重错误(非自愿);被其他进程杀死(非自愿)
什么是线程?
1.定义:线程是进程的一个实体,是进程的一条执行路径
2.线程同步的方式
互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
3.多线程:指从软件或者硬件上实现多个线程的并发技术
优点:使用多线程可以把程序中占据时间长的任务放到后台去处理,如图片、视屏的下载;发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好
缺点:大量的线程降低代码的可读性;更多的线程需要更多的内存空间;当多个线程对同一个资源出现争夺时候要注意线程安全的问题
4.线程的状态:运行、阻塞、就绪、终止
什么是程序?
程序是为了实现一个特定的目标而设计的一组可操作的工作步骤,对于计算机而言,程序就是系统可以识别的一组有序的指令,能指挥计算机执行我们想要它做的动作。程序储存在磁盘上,在执行时从磁盘到内存再到寄存器,最后被CPU执行。
进程与线程的区别
进程本质上是正在执行的一个程序;线程是进程的一个实体,是进程的一条执行路径
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行;一个进程可包含多个线程,线程属于进程
基本单位:进程是资源分配的基本单位,线程是CPU调度和分派的基本单位
地址空间:进程拥有独立的地址空间,同一进程中的线程共享相同的地址空间
健壮性:多进程比多线程程序要健壮。一个线程死掉整个进程就死掉了,但是在保护模式下,一个进程死掉对另一个进程没有直接影响
有了进程为什么还要线程
使用线程可以减少程序的响应时间
与进程相比,线程的创建和切换开销更小
使用多线程能简化程序的结构,使程序便于理解和维护
一个非常复杂的进程可以分成多个线程来执行
同步和互斥
进程(线程)之间的两种关系:同步与互斥
1. 区别:
所谓互斥,是指在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。
所谓同步,是指在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。
2. 联系
同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个线程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)。
进程和程序的区别
程序是永存的,是静态的,本身只是一组有序指令的集合,保存在硬盘上,除非手动删除掉,否则永远存在;进程是暂时的,是动态的,进程是程序在数据集上的一次执行,有创建有撤销,具备生命周期,存在是暂时的
进程能并发执行,而程序不能并发执行
进程和程序不是一一对应的:一个程序可对应多个进程;一个进程可以执行一个或几个程序
进程间通信(IPC Inter Process Communication)
定义:是指在不同进程之间传播或交换信息
进程间的通信方式:管道、消息队列、信号量、共享内存以及套接字
管道:管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
消息队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号量:
主要作为进程间以及同一进程不同线程之间的同步手段。
共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
套接口:更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
管道
1. 管道,通常指无名管道,是UNIX系统IPC最古老的形式。
特点:它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
2. 命名管道FIFO
特点:FIFO可以在无关的进程之间交换数据,与无名管道不同。
FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
消息队列
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
特点:消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
信号量
信号量是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
特点:信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作。
每次对信号量的PV操作不仅限于对信号量值加1或减1,而且可以加减任意正整数。
支持信号量组。
共享内存
共享内存,指两个或多个进程共享一个给定的存储区。
特点:共享内存是最快的一种IPC,因为进程是直接对内存进行存取。
因为多个进程可以同时操作,所以需要进行同步。
信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。
套接字
socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。也因为这样,套接字明确地将客户端和服务器区分开来。
几种常见的操作系统调度策略
批处理系统中的调度
1. 先来先服务FCFS
先来先服务调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
2. 短作业(进程)优先
短作业(进程)优先调度算法,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
3. 最短剩余时间优先
使用这个算法,调度程序总是选择剩余运行时间最短的那个进程运行。再次提醒,有关的运行时间必须提前掌握。当一个新的作业到达时,其整个时间同当前进程的剩余时间做比较。如果新的进程比当前运行进程需要更少的时间,当前进程就被挂起,而运行新的进程。
交互式系统中的调度
1. 时间片轮转法
一种最古老、最简单、最公平且使用最广的算法是轮转调度。每个进程被分配一个时间段,称为时间片,即允许该进程在该时间段中运行。如果在时间片结束时该进程还在运行,则将剥夺CPU并分配给另一个进程。如果该进程在时间片结束前阻塞或结束,则CPU立即进行切换。
2. 优先级调度
轮转调度做了一个隐含的假设,即所有的进程同等重要,而拥有和操作多用户计算机系统的人对此常有不同的看法。优先级调度的基本思想很清楚:每个进程被赋予一个优先级,允许优先级最高的可运行进程先运行。
实时系统中的调度
实时系统是一种时间起着主导作用的系统。典型地,一种或多种外部物理设备发给计算机一个服务请求,而计算机必须在一个确定的时间范围内恰当地做出反应。
实时系统通常可以分为硬实时(hard real time)和软实时(soft real time),前者的含义是必须满足绝对的截止时间,后者的含义是虽然不希望偶尔错失截止时间,但是可以容忍。
实时系统的调度算法可以是静态或动态的。前者在系统开始运行之前作出调度决策;后者在运行过程中进行调度决策。只有在可以提前掌握所完成的工作以及必须满足的截止时间等全部信息时,静态调度才能工作,而动态调度算法不需要这些限制。