自学内容网 自学内容网

操作系统(上)

操作系统的特征

并发:两个或多个时间同一时间间隔内发生。宏观上是同事发生的,微观上是交替发生的。(并行,指两个或多个时间同一时刻同事发生)

共享:即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。两种资源共享方式(同时往往是宏观上的,微观上这些进程可能是交替地对该资源进行访问的):

·互斥共享:一个时间内只允许一个进程访问该资源。

·同时共享:允许一个时间段内由多个进程“同时”对他们进行访问。

并发和共享互为存在条件。

虚拟:是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体是实际存在的。逻辑上对应物是用户感受到的。虚拟技术:

·空分复用技术:如虚拟存储器技术

·时分复用技术:如虚拟处理器

没有并发行,就没有虚拟性

异步:在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行并不是一贯到底的,而是走走停停,以不可以预知的速度向前推进,这就是进程的异步性。

失去了并发性,系统只能串行地运行各个程序,那么每个程序的执行会一贯到底。只有系统拥有并发行,才有可能导致异步性。

操作系统的运行机制

“指令”就是处理器(CPU)能识别、执行的最基本指令。

CPU中有一个寄存器叫程序状态字寄存器(PSW),又一个二进制位,1表示“内核态”,0表示“用户态”。处于内核态是,说明此时正在运行的是内核程序,此时可以执行特权指令。处于用户态是,说明此时正在运行的是应用程序,只能执行非特权指令。

内核态-->用户态:执行一条特权指令--修改PSW的标志位为“用户态”,这个动作意味着操作系统主动让出CPU使用权。

用户态-->内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权。

中断和异常

“中断”是让操作系统内核夺回CPU使用权的唯一途径。

 中断分为内中断和外中断

内中断(也称异常,例外):与当前执行的指令有关,中断信号来源于CPU内部。

外中断:与当前执行的指令无关,中断信号来源于CPU的外部。

不同的中断信号,需要不同的中断处理程序来处理。当CPU监测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的摆放位置。

系统调用

由操作系统内核对共享资源进行统一的管理,并向上提供“系统调用”,用户想要使用共享资源,只能通过系统调用向操作系统内核发出请求。内核会对各个请求进行协调处理。

凡是与共享资源有关的操作(存储分配、I/O操作,文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。

系统调用的过程

传递系统调用参数->执行陷入指令(用户态)->执行相应的内请求核程序处理系统调用(核心态)->返回应用程序

操作系统的体系结构

操作系统体系主要分为:大内核,微内核,分层结构,模块化,外核

操作系统内核需要运行在内核态,非内核功能运行在用户态。

操作系统的开机过程:

(1)CPU从一个特定的主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机)

(2)将磁盘的第一块--主引导记录读入内存,执行磁盘引导程序,扫描分区表。

(3)从活动分区(又称主分区,即安装了操作系统的分区)读入分区引导记录,执行其中的程序。

(4)从根目录下找到完整的操作系统初始化程序(即启动管理器)并执行,完成“开机”的一系列动作。

虚拟机

虚拟机:使用虚拟化技术,将一台物理机器虚拟化多台虚拟机器(Virtual Machine ,VM),每个虚拟机器都可以独立运行一个操作系统。(一种是直接运行在硬件上,一种是运行在宿主操作系统上)

两种虚拟机的管理程序的差异

处理机管理

进程

程序:是静态的,存放在磁盘里的可执行文件,就是一系列的指令集和。

进程:动态的,是程序的一次执行过程。进程被创建时,操作系统会为该进程分配一个唯一的、不重复的“身份证号”--PID(Process ID)

一个进程实体由PCB、程序段、数据段组成。

进程的特征

动态性,并发性,独立性,异步性,结构性。

进程的状态

进程正在被创建时,状态是创建态,在这个阶段操作系统会为进程分配资源、初始化PCB。创建完成后,进入就绪态,表示已经具备运行条件。如果一个进程在CPU上运行,那么这个进程处于运行态。在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入阻塞态,CPU空闲时,又会选择另一个就绪态进程上CPU运行。一个进程可以执行exit系统调用,请求操作系统终止该进程。此时该进程会进入终止态,操作系统会让该进程下CPU并回收内存空间资源,最后还要回收该进程的PCB。当终止进程的工作完成之后,这个进程就彻底消失了。

为了对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来(链式方式或者索引方式)。

进程的控制

进程的控制通过“原语”来实现,原语的执行具有“原子性”,一气呵成,期间不可以被中断。可以用“关中断指令”和“开中断指令”这两个特权指令事实现原子性。CPU执行关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查。

进程的终止

进程的阻塞和唤醒,阻塞原语必须成对使用(因何事阻塞,就应由何事唤醒)。

进程的切换

进程间的通信

进程间通信(Inter-Process Communication,IPC)是指两个进程之间产生数据交互。 

进程是分配系统资源的单位,因此各进程拥有的内存地址空间相互独立。

三种进程通信方式:共享存储,消息传递,管道通信。

共享存储

基于存储区的共享:是指操作系统在内存中划出一块存储区,数据的形式、存放位置都由通信进程控制,而不是操作系统,多个进程都可以共享共享区的数据(为避免出错,各个进程对共享区的访问应该是互斥的)。

基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。

消息传递

进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两原语进行数据交换。

消息传递方式分为直接通信方式和间接通信方式

直接通信方式:消息发送进程要指明接收进程的ID。

间接通信方式:通过“信箱”间接地通信。

管道通信

“管道”是一种特殊的共享文件,又名匹配文件。即在内存中开辟一个大小固定的内存缓冲区(以循环队列形式读写)。

管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,需要设置两个管道,各进程要互斥的访问管道,进程写完或者读空时,写读进程将堵塞,直到写读数据重新恢复即可唤醒进程 。

线程

有的进程可能需要“同时”做很多事情,而传统的进程只能串行地执行一系列程序。为此,引入了“线程”来增加并发度,线程为程序执行流的最小单位(线程之间也可以并发的执行)。进程只作为除CPU之外的系统资源的分配基本单元,线程资源调度的基本单位。线程间的切换不需要切换进程环境,所以开销小很多。

线程的属性

线程的实现方式

用户级线程是在应用程序层面实行的(属于逻辑上的多线程),内核级线程是在操作系统层面上实现的(物理层面上的多线程)。操作系统只看得见内核级线程,因此只有内核级线程才是处理机分配的单位。

线程的状态转换和组织控制

线程的状态转换和进程间的状态转换几乎一致

处理机调度

调度是指当有一堆任务要处理的时候,由于资源有限,这些事情没法同时处理。这就需要某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。

高级调度(作业调度):按照一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,掉出一次。调入时创建PCB,调出时撤销PCB。

低级调度(进程调度):按照某种策略从就绪队列中选取一个进程,将处理机分配给它。  

中级调度(内存调度):按照某种策略决定将哪个处于挂起状态的进程重新调入内存。

挂起态与七状态模型:挂起状态将进程映射到外存里面,阻塞态还在内存里面。

进程调度的时机和切换方式

进程调度(低级调度),按照某种算法从就绪队列中选择一个进程为其分配处理机。

进程调度分为两种,一种是当前运行的进程主动放弃处理机,还一种是当前运行的进程被动放弃处理机。 

进程调度的方式分为非剥夺调度方式(非抢占方式,只允许进程主动放弃处理机)和剥夺调度方式(抢占方式,可以优先调度处理机处理更加紧迫的任务)

进程切换的过程主要完成了:

1 对原来运行进程各种数据的保存

2 对新的进程各种数据的恢复 

调度算法

调度算法的评价指标:CPU利用率,系统吞吐量,周转时间,等待时间,响应时间。

先来先服务(FCFS)

短作业优先(SJF)

短作业优先算法分为抢占式的和非抢占式的。抢占式的(最短剩余时间优先算法)是每当进程加入就绪队列时就需要调度如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。当一个进程完成时也需要调度。

 

高响应比优先(HRRN)

高响应比优先算法是非抢占式的调度算法,只有当前运行的进程主动主动放弃CPU时,才需要进行带调度,调度时计算所有就绪进化的响应比,选响应比最高的进程上处理机。

时间片轮转(RR)

轮流让各个进程执行一个时间片,不管有没有结束,直接剥夺处理机资源。

优先级调度算法 

为每个作业和进程设置一个优先级,调度时选择优先级最高的作业/进程。也分为抢占式和非抢占式,抢占式需要在就绪队列发生变化时,检查是否会发生抢占。  也可以动态的调整任务的优先级。

多级反馈队列优先级算法

设置多集就绪队列,各级队列优先级从高到低,时间片从小到大,新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,才会为k+1级队投的进程分配时间片。

多级队列调度算法

按进程类型设置多个优先级,进程创建后插入某个队列。

进程同步与互斥

同步也称直接制约关系。它是指为完成某种任务而建立的两个或多个进程这些进程需要在某些位置上协调他们的工作次序二产生的制约关系。进程间的直接制约关系就是源于他们之间的互相合作。

互斥也称间接制约关系。进程互斥指当一个进程访问某临界资源时。另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。

进程互斥软件实现算法

单标志法

两个进程访问完临界区后把临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。核心是设置一个允许进入临界区的进程号。可以实现同一时刻“最多只允许一个进程访问临界区”。(违背了空闲让进的原则)

双标志先检查 

设置一个布尔型的数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比flag[0]=true意味着0号进程现在想进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。(违反了忙则等待原则  )

双标志后检查

与先检查的区别是,后检查法,先给进程上锁,在检查。(违背了空闲让进和有限等待的原则,会产生饥饿现象)

Peterson算法

结合双标志和单标志的思想。如果双方都争着想进去临界区,那可以让进程尝试让步。

进程互斥硬件实现方法

 

中断屏蔽法

利用“开/关中断指令”实现(与原语相同,即某进程开始访问临界区到访问结束为止都不允许被中断,也不能发生进程切换,就不会发生两个同时访问临界区的情况)不适用于多处理机,不适用于用户进程,只适用于操作系统进程。

TestAndSet(TS指令/TSL指令) 

TSL指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。 

Swap指令(XCHG指令)

信号量机制

用户进程通过使用操作系统提供的一对原语(wait(s)原语和signal(s)原语)来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。

信号量就是一个变量,可以用一个信号量来表示系统中某种资源的数量。分为整形信号量和

整形信号量

用一个整数型的变量,用来表示系统中某种资源的数量。对信号量的操作只有三种,初始化,P操作和V操作

记录型信号量

即记录型数据结构表示的信号量

信号量机制实现互斥

1分析并发进程的关键活动,划定临界区

2设置互斥信号量mutex,初值为1,不同临界区需要设置不同的互斥信号量。

3在进入区P(mutex)--申请资源

4在退出区V(mutex)--释放资源

信号量机制实现进程同步

1分析什么地方需要同步关系,必须保证一前一后执行的两个操作

2设置同步信号S,初始化为0

3在“前操作”之后执行V(s)

4在“后操作”之前执行P(s)

管程

管程是一种特殊的软件模块:

1.局部于管程的共享数据结构说明;

2.对该数据结构畸形操作的一组过程;

3.对局部于管程的共享数据设置初始值的语句;

4.管程有一个名字。

管程的基本特征:

1.局部于管程的数据只能 被局部于管程的过程访问;

2.一个进程只有通过调用管程内的过程才能进入管程访问共享数据;

3.每次只允许一个进程在管程内执行某个过程

死锁

在并发的环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞都无法向前推进的现象,就是“死锁”

产生死锁的条件

互斥条件:至于对必须互斥使用的资源则争夺才会导致死锁

不剥夺条件:进程所获的的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。

循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的紫云啊同时被下一个进程所请求。

死锁的预防

破坏互斥条件:

把只能互斥使用的资源改造为允许共享使用(并不是所有的资源都可以改造)。

破坏不剥夺条件:

(1)但某个进程请求新的资源得不到满足时,它必须要立即释放保持的所有资源,待以后需要时重新申请。

(2)当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强行剥夺。(只适用于易于保存和恢复的资源

破坏请求和保持条件:

静态分配方法:

即进程在运行前一次性申请完它所有需要的全部资源(资源利用效率低

破坏循环等待:

采用顺序资源分配法,给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源(实际使用资源的顺序和编号递增的顺序不一致)。

死锁的避免

安全序列,指如果按照这种序列分配资源,则每个进程都能顺利完成,只要能找到一个安全序列,系统就是安全状态,找不到一个系统就进入不了安全状态。

如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁。

银行家算法

死锁的检测和解除 

死锁的检测:

死锁的解除:

1.资源剥夺法。挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。、

2.撤销进程法。强制撤销部分、甚至全部死锁进程(代价非常大)

3.进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。

可以根据进程优先级,已执行多时间,还需要多长时间,已经使用了多少资源,进程是交互式还是批处理式的来决定使用方法。

内存

 ​​​​​​​

内存管理

覆盖技术

覆盖技术的思想:将程序分为多个段。常用的段常驻内存,不常用的段在需要时调入内存。

必须由程序员声明覆盖,对用户不透明,增加变成负担。

交换技术

将进程中某些进程暂时唤出外存,把外存中某些已具备条件的进程换入内存。 

内存空间的分配和回收

连续分配管理方式

单一连续分配

在单一连续分配方式中,内存被分为系统区和用户区,内存区只能有一道用户程序,用于程序独占整个用户区。

固定分区分配

把整个用户空间划分为若干个固定打戏哦啊的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式。

操作系统需要建立一个数据结构--分区说明表,来实现各个分区的分配与回收。每个表对应一个分区,包括对应分区的大小,其实地址,状态。

缺点:应用程序太大时,肯能所有的分区都不能满足,会产生内部碎片。

动态分区分配

动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的带下动态地建立分区,并使分区的大小正好适合进程的需要。

动态分区算法

首次适应法:

每次从低地址开始查找,找到第一个能满足大小的空闲分区。

最佳适应算法:

尽可能多留下大片的空闲区,优先使用更小的空闲区 ,空闲分区按照容量递增次序链接(每次更新链表)。

最坏适应算法:

分配时优先使用最大的连续空闲区,空闲区按照容量那个递减次序链

临近适应算法:

在首次适应算法的基础上,每次从上次查找结束的位置开始检索。

非连续分配管理方式
基本分页存储管理

分页存储将内存空间分为一个个大小相等的分区,每个分区就是一个“页框”。每个页框有一个编号,即“页框号”,页框号从0开始。

把进程的逻辑地址也分为与页框大小相等的一个个部分,每个部分称为一个“页”或“页面”。每个页面也有一个编号即“页号”。

操作系统以页框为单位为进程分配内存。进程的页面与内存的页框一一对应的关系。

页号 = 逻辑地址/页面长度

页内偏移量 = 逻辑地址%页面长度  

基本地址变换机构:系统中会设置一个页表寄存器(PTR),存放页表在内存中的起始位置F和页表长度M。进程未执行时,页表的起始地址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。

快表的地址变换机构

快表,又称联想寄存器(TLB),是一种访问速度比内存快很多的告诉缓存,用来存放最近访问的页表项的副本,可以加速地址变换的速度。内存中的页表称为慢表。

分段管理

操作系统按照自身逻辑关系划分若干个段,每个段都有一个段名,每段从0开始。  

分段和分页的区别

页是信息的物理单位,对用户不可见,分页的用户进程空间是一维的。

段是信息的逻辑单位,对用户是可见的。分段是二维的。

分段比分页更容易实现共享(让各个进程段表向只想同一个段)和保护。

段页式管理方式

虚拟内存

程序装入时,讲程序中很快用到的部分装入内存,暂时用不到的部分留在外存,就可以让那个程序开始执行,当访问的信息不在内存时,有操作系统负责将所需信息从外存调入内存,然后继续执行程序,内存空间不够时,由操作系统负责将内存中暂时用不到的信息换出外存,这就是虚拟内存。

​​​​​​​


原文地址:https://blog.csdn.net/hthutao/article/details/142438229

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!