操作系统
操作系统:
前言
操作系统实例:Unix,WIn,dos,Linux,实时操作系统
操作系统的启动:OS放到硬盘上,按下电源,BIOS(基本I/O处理系统)让系统检查外设,检查完毕加载软件。接下来BootLoader加载os,把os从硬盘加载到内存,BootLoader也在硬盘它也在硬盘,BootLoader把os加载到内存后,把执行权交给os。
操作系统的Interface:
1.中断,面向I/O
2.面向应用程序:是系统调用和异常
绪论
- 五大功能:处理器管理 存储器管理 文件管理 设备管理 提供用户接口.
- 多用户以交互的方式,为分时操作系统,多个用户将多个作业交给计算机集中处理:批处理,批处理的确定是缺少交互性.用户不能直接干预.
- 操作系统中采用多道程序设计之后,提高了CPU和外部设备的利用率.宏观上是并行,含义是:同时进入系统的几道程序都处于运行状态,他们先后开始了各自的运行,但其实都没有运行完.多道程序设计是指,把一个以上的作业放入主存,并且使之同时处于运行状态,这些作业共享处理器和外设等资源.(用户提交的作业都在外存上行程一个后备队列,然后按照一定的调度算法从后备队列里面选择若干个作业调入内存)
- 操作系统程序的运行状态称为内核态,用户程序的运行状态称为用户态.
冯.诺依曼
提出存储程序的概,以运算器为中心.而现在是以存储器为中心.
组成部分:运算器,存储器,输入设备,输出设备,控制器,(现在分为:CPU,I/O,存储器)并且指令和程序混合存储,按地址访寻,现在大部分都分开了.(笔记:也不是按址寻访)
操作系统的概念:
- 用户观点:使用户更好的单人工作,操作系统的目的就是方便用户使用,资源利用率不是很重要.系统的观点(资源管理的角度)操作系统是计算机系统的资源管理程序,在计算机中
进程观点:把操作系统看成由若干个可以独立运行的程序和一个对这些程序进行协调的核心.
2. 操作系统特征:并发(多个事务在同一时间间隔内发生) 共享(根据资源的性质分为互斥共享和同时访问) 虚拟性(多道程序设计) 异步性(以不可预知的速度向前推进)
进程管理:
用户态和内核态:
用户态切换到内核态的方式:
1.系统调用,是用户态进程主动申请切换为内核态,用户态的进程需要操作系统为他提供某种服务,比如一个printf语句。
2.异常,在CPU运行用户态程序的时候,发生了一些预料之外的异常,就会使当前运行进程切换到处理此异常的内核相关的程序,比如缺页中断。
3.外围设备中断,当外围设备完成用户的请求操作之后,会向CPU发出相应的中断信号,这时CPU会停止当前执行的程序去响应中断,如果之前执行的是用户态的程序,这个转换就发生了用户态到内核态的切换,比如硬盘读写操作完成,系统会切换到硬盘读写操作完成后续操作。
进程和线程:
调度:进程是程序和数据在处理器上的一次执行过程,是一个动态的概念,是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
拥有资源:进程是拥有资源的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
并发性:进程可以并发执行,同一个进程中的多个线程之间可以并发执行。
系统开销:因为处理器给进程分配空间,I/O设备,所以创建进程的开销远远大于创建线程,线程的切换以及多线程之间的同步也更容易。
线程的实现:
1.用户线程:在用户内存空间,OS看不到,只能看到他对应的,由用户线程库管理,缺点:线程发出一个阻塞性的系统调用,会让整个线程等待。用户线程和内核线程又多对一,一对一和多对多的关系。
2.内核线程:OS管理,TCB是放在内核里面的,cpu调度的单位就是线程,只要完成一次线程的切换,就有一次用户态到内核态的切换。
3.轻量级进程:他是内核支持的用户线程,一个进程可以有多个轻量级进程,每个量级进程由一个独立的内核线程来支持。
进程和作业:
作业是用户需要计算机完成一个任务要求计算机做的工作的集合,进程是已提交的作业的执行过程,作业现在外存的后备队列等待执行,进程是完成用户任务的执行实体,一个作业可以由多个进程组成.
进程的状态转换:
进程的基本状态有运行,就绪,阻塞,影响的事件有 时间片用完(运行转就绪),等待事件(运行转阻塞),等待条件发生(阻塞转就绪)以及进程调度(就绪转运行).
进程的控制:
对所有进程实施有效的管理,包括,创建进程,撤销进程,进程的阻塞与唤醒.进程的控制由原语实现,是由机器指令构成的,
P原语(阻塞原语)的功能是将进程由执行状态转为阻塞状态,V(唤醒)原语是将进程由阻塞转为就绪状态。一个进程期待的事件尚未出现时就调用阻塞原语把自己阻塞起来。
阻塞原语操作如下:
停止当前进程的运行,中断处理器。
保存该进程的CPU现场,以便后续从断点开始执行。
停止当前进程的运行,状态由执行转为阻塞,插到相应的等待队列。
转到进程调度程序,从就绪队列中选一个新的执行
对处于阻塞状态的进程,它等待的事件出现后,由发现的人(一般发现者与被唤醒进程是合作的并发进程)调用唤醒原语来唤醒阻塞进程。
唤醒原语操作如下:
将被唤醒的进程从相应等待队列移出。将状态改为就绪并插入相应就绪队列。
进程通信
指进程之间信息的交换。互斥和同步只是一种低级的通信方式,P、V原语也可以称为两条低级通信原语。
高级通信可以分3类:共享存储器系统,消息传递系统,管道通信(一个共享文件)。
处理器调度
- 高级调度(作业调度):按照一定原则从外存上处于后备状态的作业中选择一个或多个,给他们分配内存,输入输出等必要资源,并建立相应进程使该作业具有竞争CPU的权利。
- 中级调度:按照给定的策略,将处于外存对换区中具备运行条件的进程调入内存,或将处于内存中暂时不能运行的进程交换到外存对换区。主要内存管理与扩充。
- 低级调度(进程调度),按照某种策略,从就绪队列中选一个进程分配给它处理器。
进程调度的方法:抢占式和非抢占式.时间片轮转也是抢占式的调度方法.
周转时间:从作业提交到执行完成的时间间隔。带权周转时间:作业周转时间比运行时间
常见调度算法:先来先服务,短作业优先,优先级调度算法,时间片轮转(进程调度独有),多级队列调度(进程调度),多级反馈队列调度(进程)
同步与互斥:
同步的概念:多个相互合作的进程在一些关键点上可能需要互相等待或互相交换信息,这种制约关系是进程同步。
1.两种形式的制约关系:间接相互制约(互斥)
保持进程同步的方法:进程间同步的主要方法有原子操作、信号量机制、管程、会合、分布式系统等。
什么是临界区?如何解决冲突?
(1)如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入;
(2)任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待;
(3)进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区;(4)如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。
临界资源与临界区:临界资源是一种系统资源,需要不同进程互斥的去访问,但需要访问临界资源的进程一般不只有一个,所以需要临界区去控制,临界区是属于对应进程的,是每个进程中访问临界资源的一段代码,临界区还需要进入区和退出区进程检查和恢复。
死锁:
死锁是指多个进程因为竞争资源或者是顺序推进不当而永久阻塞的状态,如果没有外力作用这些进程都无法向前推进。就是两个或多个进程被无限期地阻塞、相互等待的一种状态。
产生死锁的必要条件:(1)互斥(mutualexclusion),一个资源每次只能被一个进程使用;(2)不可抢占(nopreemption),进程已获得的资源,在未使用完之前,不能被其他进程强行夺走;(3)占有并等待(hold andwait),一个进程因请求资源而阻塞时,对已获得的资源保持不放;(4)环形等待(circularwait),若干进程之间形成一种首尾相接的循环等待资源关系。这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
产生的原因:资源不足和不当的推进顺序.
死锁的处理策略:鸵鸟策略、预防策略(破坏四个必要条件中的某几个)、避免策略(在动态分配的过程中,防止系统进入不安全状态)、检测与恢复策略(在检测到之后,可以用强制剥夺资源的方式)。
死锁的预防:不剥夺,对于一个已经获得了一些资源的进程,如果申请的资源得不到满足就立即释放。但是这会造成前段时间做的工作全部白费。 请求和保持,一个进程在运行之前一次性申请完所有需要的资源,未满足之前,不投入运行。 环路等待:将所有资源按序编号,进程申请系统资源时按照序号申请,这样不会产生环路。
死锁的避免:在动态分配的过程中,预知系统是否会进入不安全状态,如果可能产生死锁,则不进行这种分配,银行家算法。
死锁的检测与解除:检测到死锁发生再采取措施。
内存管理
功能:
内存的分配和回收;地址变换,把程序当中的逻辑地址转换成物理地址;内存扩充,为用户提供比内存更大的空间,实现逻辑上扩充内存的目的;内存保护,保证进入内存的各道作业都在自己的存储空间运行,互不干预。
应用程序的编译,链接与装入
编译程序把源代码编译为若干个目标模块,通过链接程序把各个模块以及库函数链接在一起行成完整的装入模块,最后,通过装入程序装入内存。
(多个模块的都是从0号单元开始编地,链接的时候把他们混在一起,从0开头的只有一个)
链接方式:
静态链接:程序运行之前,链接成一个完整 完完整整 的模块,以后都不能再拆开。
装入时动态链接:在装入内存时,边装入边链接。
运行时动态链接:在运行的过程中,需要哪个模块 接哪个。
装入方式:
绝对装入:在编译的时候就产生物理地址。
静态重定位(可重定位装入):根据内存当前的情况,将整个装入模块装到适当位置,地址变换通常在装入时一次完成,之后不再改变。它要求每次都给他分配连续的存储区,如果空间不足就不能执行,而且执行之后不能移动。
动态重定位:装入内存后都保持相对地址,要执行的时候再做转换。依靠硬件地址变换机构。
简单的方法是利用一个基址寄存器,加上这里面的值得到正确的物理地址。
交换技术:暂时不用的程序和数据移到外存,处理器三级调度的中级调度就是采用交换技术,对挂起也可采用交换。
内存的分配 之 连续分配管理方式:
- 单一连续分配:
适用于单用户单任务,把内存分成两个连续存储区,一个分给os,一个分给用户。采用静态分配,适合单道程序,作业一旦进入主存就必须等到结束才能释放。内存中意运行一道作业。
- 固定分区分配:
内存划分为若干固定大小的分区,每个分区装入一道程序,分区大小可以不等,但必须事先确定,在运行时不改变。通常采用动态重定位装入方式内存,不能实现多进程共享存储区,会产生内部碎片。
- 动态分区分配:
也成为可变式分区分配,不在作业装入主存时,根据作业大小动态建立分区,使分区的大小刚好满足作业需要,系统中分区的数目是可变的,大小也是可变的。
动态重定位分区分配加了拼接技术,剩余没有足够大的空间时拼接一个大的。
分区分配算法:
首次适应算法:按照地址递增的顺序串成一个队列,每次从队首查找找到足够大的空闲分区,画出来一块给请求者。保留了高地址的大空闲区,但是低地址有许多外部碎片。
下次适应:也称循环首次适应,缺点是缺少大的分区。
最佳适应:按照容量大小递增串成一个队列,每次都把能满足分配的最小内存分给它,但这样会产生很多外部碎片,好处是保留了大分区。
最差适应:按照容量大小递减串成一个队列,每次划分最大的,但是这样会让真正的大作业到来的时候没办法运行。
总:分区分配的动态管理:
以上说的分配方式都要求作业必须连续存放,比如一个50K的作业,必须放到一个连续的50K空间,即使现在有一个20K和30K的空闲区也不能运行。就需要对分区进行管理了,目前两种分区重定位方式:
拼接技术:把内存中无法利用的小的存储空间拼接成一个大的。
固定分区分配中存在内部碎片,动态分区分配存在外部碎片。
内存的分配 之 非 连续分配管理方式:
基本分页存储管理方式:允许一个作业存放到许多不相邻的分区中,那么就可以避免拼接,从而解决外部碎片。
将程序的逻辑地址空间划分为固定大小的页(page),而物理内存划分为同样大小的页框(page frame)。程序加载时,可将任意一页放人内存中任意一个页框,这些页框不必连续,从而实现了离散分配。该方法需要CPU的硬件支持,来实现逻辑地址和物理地址之间的映射。优缺点:
有点:内存利用率高,实现离散分配,无外部碎片,一个程序不必连续存放。
缺点:需要硬件支持,有内部碎片,共享困难,要求程序全部装入内存,没有足够的内存,程序就不能执行
分段存储管理方式:
把自己的作业按照逻辑关系分为若干个段,每段都是从0开始编号,有自己的名称和长度。
没有内碎片,外碎片可以通过内存紧缩来消除;便于实现内存共享。缺点与页式存储管理的缺点相同,进程必须全部装入内存。
两种方式的比较:
相同:离散的分配方式,且都是通过地址变换机构实现地址变换。
分页仅仅是处于系统管理的需要,页大小固定且由系统决定,段的长度不固定,长度决定于用户所编写的程序,目的是为了满足用户的需要,通常由编译系统在对源程序进行编译时根据信息的性质来划分。
一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。页式系统地址空间是一维的,即单一的线性地址空间,程序员只需利用一个标识符,即可表示一个地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
基本段页式存储管理方式:
作业的地址空间被划分为若干个逻辑分段,每段都有自己的段号,再把各个段划分为若干个大小固定的页,主存空间的管理和分页管理一样,分成若干个和页面大小相同的块,对主存的分配以块为单位。 每个进程由一个段表,每个分段有一张页表。
段页式结合了段式和页式的优点,克服了段式的外部碎片问题,但是 页式存储管理方式下平均一个程序由半页碎片,段页式管理方式下平均一段就有半页碎片,而一个程序往往有很多段,所以平均下来段页式的内部碎片比页式要多很多。
虚拟内存管理:
只将程序的一部分装入内存,其余放在外存上,就可以启动程序,(部分装入),在执行的过程中发现访问的信息不存在时再由操作系统调入内存,另一方面,可以将不使用的内容放到外存上,从而腾出空间,存放要调入的信息。
根据程序局部性原理:效果很好。
请求分页存储管理方式:
在普通分页的基础上加了,部分装入和缺页中断的功能,注意普通的是必须一次性装入主存才能运行的。
页面置换算法:先进先出,最近最少使用,时钟置换,
交换技术:
当内存空间不够时或有不够的危险时换出。交换区的大小必须足够大来存放所有用户进程的所有内存进程的拷贝。
覆盖于交换的区别:覆盖只发生在相互之间没有调用关系的程序模块之间,因为程序员必须给出程序内的各个模块之间的逻辑覆盖结构,交换是以内存中的程序大小为单位来进行的。
如何实现内存保护:
防止地址越界,对进城产生的地址必须加以检查,发生越界时产生中断,由操作系统处理。
防止操作越权,对属于自己的信息可读可写,未授权的信息,不可读不可写。
中断处理的相应过程:请求中断,响应中断,关闭中断,保留断点,中断源识别,保护现场,中断服务子程序,回复现场,返回中断。
- 进程的基本特征: 动态性, 并发性, 独立性, 异步性 结构特征.
- 程序段和数据段称为进程的实体,用PCB描述实体的存在和变化,进程三部分.
- 进程调度算法中采用等时间片轮转法时,如果时间片太大,就成了先来先服务,太小,就会在进程切换时消耗过度的系统资源,效率低.
- 短作业优先调度算法的平均等待时间最短.
- 同时只能一个进程使用的资源是临界资源,在进程中,访问临界资源的代码成为临界区,为保证进程互斥访问临界资源,应在进程的临界区之前设置进入区,在临界区之后设置退出区.
- 访问临界资源准则:空闲让进,忙则等待,有限等待,让权等待.
- 同步是指,不同进程之间的相互合作,相互等待,互斥是指同类进程需要互斥使用资源. 这是进程之间两种不同的制约关系.
- 信号量的物理意义:>0表示可用资源的数目,<0表示该信号量上等待进程的个数.
- 用 P V 操作管理临界区时,任何一个进程在进入临界区之前应调用P,退出临界区用V.
- 某系统中有三个并发进程,都需要同类资源4个,该系统不会发生死锁的最少资源个数是10.
- 不让死锁发生的策略有静态和动态两种:死锁避免属于动态.
- 预先分配破坏了死锁产生必要条件的请求个保持,资源剥夺和撤销进程的方法破坏了不剥夺,资源的按顺分配破坏环路等待.