前言:
本篇博客是以《操作系统原理和应用》为基准学习后而写的学习笔记,操作系统这门课程是计算机专业中的基础课程之一,同时也是考研,软考等重要考试的考点之一。那么仅仅是因为操作系统要考才去学习它吗?即使是计算机专业的学生,不学操作系统也照样可以编程写软件。那我们为什么要学呢?当然我们有一千个理由要学,但这里仅列出了几个:
- 操作系统的功能应用于很多领域。如果开发并发程序:Wed Service、分布式系统和网络,你会发现,这些领域大量使用了操作系统的概念和技术。如果你学好了操作系统,你就会对你做的事情更加有信心
- 操作系统的技巧也应用于很多领域,如抽象、缓存、并发等。操作系统简单来说就是实现抽象:进程抽象、文件抽象、虚拟存储抽象等。而很多领域也要使用抽象。如数据结构和程序设计就大量使用了抽象,记得抽象数据类型吗?记得抽象类吗?很多地方都要用到缓存。你开发Web应用要不要缓存呢?这些你都需要
学好它不仅能让我们更加深入理解操作系统的运行过程和是实现过程,还能为我们以后的学习打好基础,让我们增大成为一个设计者的可能,不再是一个代码的搬运工。现在就让一起来学习它吧(当中若有错误或纰漏,请指正)
附课后习题答案: 传送门
持续更新中……
操作系统目前没有统一的理解。个人理解:操作系统是起着资源管理器功能,负责系统中的硬件及软件资源的管理的系统软件
一般认为的操作系统的定义:管理计算机系统软件、硬件资源,控制程序执行,改善人机界面,并合理组织计算机工作流程和为用户提供简便使用环境的系统软件
在多任务和多用户环境下分配管理计算机系统中硬件资源和软件资源。将计算机底层的细节对用户抽象化,大大降低使用计算机的门槛
操作系统在计算机系统中所处的位置:
软件(Software): 是一系列按照特定顺序组织的计算机数据和指令的集合。一般软件分为系统软件、应用软件、以及介于二者之间 的软件。例如:常用的部落冲突、微信都属于应用软件,操作系统属于系统软件,而GUI图形用户界面是介于二者之间的软件。
硬件(Hardware):是计算机硬件的简称,是指计算机系统中由电子,机械和光电元件等组成的各种物理装置的总称。 例如:常见的有显卡、鼠标、键盘等属于硬件。
发展阶段 | 特点 |
---|---|
手工操作阶段 | (1)用户独占全机,(2)CPU等待人工操作 //上机用户独占计算机全部资源,手工操作时,用户必须熟悉计算机各器件的所有细节,若某一环节出错,所有操作需重新开始 |
监督程序阶段 | (1)对重复操作实现自动控制,(2)可以识别和装入所需程序,(3)能处理作业间的自动过度和自动定序,(4)可同时提交多个作业 //磁带需要人工装卸,批处理过程中出错,用户无法干预,只能重新执行 |
执行系统阶段 | 借助通道和中断技术扩大了原有的监督程序,提供了输入和输出的控制功能 |
多道程序系统阶段 | (1) 多道性。 内存中同时有多个作业并发执行 (2) 宏观上并行。同时进入系统的多道程序都处于运行过程总,它们或与不同时刻开始,或在不同时刻结束,但在某段时间内总体上来看是同时运行的 (3)微观上串行。在内存中的多个作业的运行顺序与其进入内存的顺序无关(4)多道技术会延长作业周转时间 |
批处理系统的基本设计思想:操作员将若干用户的作业中相似的操作合并成一批,例如:输入、输出操作,在设备准备好后,启动一个常驻于内存的程序——监督程序(Monitor),然后由监督程序自动控制完成这批作业的执行
多道批处理系统的基本设计思想:将用户的作业先在外排队,形成一个后背队列,有作业调度程序按照一定的策略从中选择若干作业进入内存,这写进入内存中的作业共享系统中的所有资源,交替使用处理器(CPU)。相对批处理系统,可以提高CPU的利用率,充分发挥计算机硬件的并行性。
拓展:计算机的发展史:
第一代计算机(1945——1955):电子管和手工操作
第二代计算机(1955——1965):晶体管和批处理系统。1956年诞生最早的批处理操作系统 GM-NAA I/O。
第三代计算机(1965——1980):集成电路芯片和多道程序设计技术
第四代计算机(1980——1990):大规模集成电路芯片和传统操作系统
批处理操作系统 Batch Processing Operating System
定义:采用批处理方式工作的操作系统通常称为批处理操作系统(Batch Processing Operating System)。批处理操作系统根据程序的执行方式可以分为 单道批处理操作系统(也称早期批处理)和多道批处理操作系统。
目标:高效率
特点:
批处理操作系统的特点:(1)系统资源利用率高(2)作业吞吐量大(3)交互性能差。作业周转时间较长,且不允许用户任意改动,不利于程序的开发和调试
单道批处理操作系统的特点:(1)单道性。一次只能将一个作业装入内存中(2)顺序性。磁带上的一批作业是按其顺序装入内存的(3)自动性。在监督程序的控制下作业自动执行,无需人工干预。//经历:联机批处理–>脱机批处理
多道批处理操作系统的特点:相对单道批处理操作系统的特点 单道性变为了多道性
分时操作系统 Time Sharing Operating System
实时操作系统 Real-Time Opearting System
通用操作系统
网络操作系统
分布式操作系统
为什么引入进程这个概念?
多道程序在执行时,需要共享系统资源,从而导致各程序在执行过程中出现相互制约的关系,程序
的执行表现出间断性的特征。这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本
身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面
上看出它何时执行,何时停顿,也无法看出它与其它执行程序的关系,因此,程序这个静态概念已不能如
实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质,人们引入“进程(Process)”概
念。
程序执行的方式分为两种:顺序执行和并发执行
操作系统初期全部是采用顺序执行的方式去处理作业,但是这种执行方式并不能充分利用CPU,从而诞生出并发执行这种作业处理方式。在提高CPU利用率的同时也带来了一系列资源分配问题,以及间断性1、失去封闭性2、不可在现性3
定义:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。
它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。进程是资源分配和调度的基本单位。进程就是一个正在执行的程序。拓展:进程和线程的区别
进程的组成:代码+数据+环境
顺序执行的特点:
并发执行的特点:
并发和并行的区别:并发是多个进程轮流占用CPU,并行是多个CPU同时运行多个进程。
程序和进程的区别和联系:
进程的状态:
新建。新创建一个进程,此时进程还未加载到主存中。操作系统为该进程分配系统资源、初始化PCB。
运行。该进程正在被执行。进程拥有了 CPU资源 和 其他所需资源 。
就绪。进程做好了运行准备,只要获得CPU就能够被执行。进程拥有了其他所需资源,但还没拥有CPU资源。
阻塞(又称等待)。进程在等待某些事件,如:I/O操作。进程 既没有CPU资源 也 没有其他所需资源 。
消亡(又称终止)。进程被执行完毕,或者是进程被撤销,或者由于某种原因自动停止,如:进程所需的系统资源不足
进程的标识:PCB 进程控制块(Process Control Block)也称进程表(Process Table)
PCB是进程存在的唯一标识,是操作系统对进程进行控制、管理和调度的依据,它在进程创建时产生,在进程撤销或进程消亡后消失
进程控制是实现进程各状态间的转换
对系统中的 所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能
通过原语实现进程控制(利用原语进行的操作叫做原子操作,也称原子操作)
拓展:
原语的定义:
原语是系统态下执行的一种特殊的系统程序,通过系统调用的方式提供原语接口,采用开/关中断来实现。
原语的特点:
- 原语由内核完成。因为开/关中断指令的权限很大
- 原语的执行不能被中断。因为原语是以系统调用的方式提供原语接口,采用屏蔽中断的方法实现的。屏蔽中断指令属于内核指令,是不会被中断的(除停电外),系统调用指令是能够被中断的。
原语的分类:
- 创建原语。用于创建进程
申请空白的PUB,为新进程分配所需资源,初始化PCB,将PCB插入到就绪状态。
- 阻塞原语。将新建或运行状态中的进程加入到等待队列,使之成为阻塞态
从PCB集合中找到需要阻塞进程的PCB,保护进程运行现场,将其PCB状态信息修改为“阻塞态”,主动放弃CPU,暂停进程的运行,同时将其PCB插入到相应的等待队列中。
- 唤醒原语。将阻塞状态中的进程转换成就绪状态
从PCB集合中找到需要唤醒进程的PCB,将他从等待队列中移除,将其PCB状态修改为就绪态,并将该PCB插入到就绪队列中。
- 撤销原语。
从PCB集合中找到需要终止进程的PCB,(若进程正在运行,立即剥夺其CPU,将CPU分配给其他进程,同时终止其所有子进程)将该进程拥有的所有资源归还给父进程或操纵系统,最后删除它的PCB。
操作系统中进程状态的转换示意图创建原语操作系统分配完资源进程被调度撤销原语阻塞原语唤醒原语时间片用完终止态引起进程撤销的事件运行态就绪态创建态引起进程创建的事件阻塞态CPU的状态:
系统态(又叫管态、内核态、核心态、特权态):能执行一切指令,访问所有的寄存器和存储区
用户态 (又叫目态、普通态):具有较低特权的执行状态,仅能执行规定的指令,访问指定的寄存器和存储区;一般情况下,应用程序只能在用户态运行,不能去执行OS指令和访问OS区域,这样可以防止应用程序对OS的破坏
临界区和临界资源
进程的互斥和同步
为什么要引入互斥和同步概念?
因为现代操作系统具有并发性的特点,导致操作系统中的进程具有异步性的特征。异步性是指:各并发执行的程序一各自独立的、不可预知的速度向前推进。这就导致我们不能认为的控制并发执行中进程的先后顺序,但是对于一些事物,如:写数据,和读数据是必须具有顺序的,只有先进行写的操作,才能执行读的操作,而同步就是专门解决这类问题而必须引入的概念。
同时现代操作系统具有共享性的特点,这就导致多个进程都需要进入临界区使用临界资源,而临界资源只能被其中一个进程使用,需要等其中一个进程使用完后释放该资源后,下一个进程才能继续使用,于是我们就引入互斥这一概念来描述进程使用临时资源时的这一行为。
这些概念的引入,其实就是为了更好地描述某种关系或者规律,解决某类问题,从而能够制造出更好用的操作系统
定义:
经典的互斥和同步问题:
- 哲学家进餐问题:相邻哲学家之间存在互斥。互斥表现在:相邻哲学家不能同时取筷子
- 读者和写者问题:两者之间存在同步。同步表现在:要先读入数据,才能修改数据,两者具有先后顺序且需要共同协作
- 生产者和消费者问题:两者既存在互斥又存在同步。互斥表现在:当缓冲区为满时,消费者进程在取数据的同时生产者进程不能产生数据;当同步表现在:当缓冲区中有生产者进程产生的数据,消费者进程才能取数据(体现时序关系),且它们要共同协作才能完成任务
信号量
什么是信号量
信号量是荷兰数学家Dijkstra于1965年设计THE操作系统是提出的概念。
信号量(Semphore)是用来管理临界资源的,可以代表资源的实体数。它表示系统中某一类可用资源的数量,是一个整型量。
信号量的作用: (设信号量Semphore的值用value表示)
可以用来实现进程间的同步和互斥
可以用来记录当前可用资源的实体数(当value≥0时,value表示当前可用资源的实体数)
可以用来记录当前等待进程的个数(当value<0时,|value|表示当前等待使用该资源的进程数)
信号量的操作:
同年在Dijkstra提出信号量概念的同时,它也相应的提出信号量的相关操作定义,有两种操作,P、V取自荷兰语passeren(经过)和verhogen(增加)的首字母
信号量实现互斥时应当注意:
信号量实现同步时应当注意:
定义:指进程间的数据传输(或信息的交换)。
分类:
拓展:
- 消息缓冲机制通信技术由Hansen提出,基本思想是:根据“生产者——消费者关系”原理,利用公用消息缓冲区实现进程间的通信。使用该机制通信时应注意:
- 在发送进程将消息写入缓冲区时和把缓冲区的消息挂入消息队列时,应禁止其他进程对缓冲区消息队列的访问;同理在接收进程取消息时,也需要禁止其他进程对缓冲区消息队列的访问
- 当缓冲区没有消息时,接收进程不能接收到任何消息
- 邮箱机制:通过把消息抽象成一封封信,将一个共享数据结构抽象成邮箱,每个邮箱由一个唯一的标识符,当两个或两个以上的进程有一个共享的邮箱是,它们就能够进行通信。使用邮箱机制时应注意:
- 发送进程发送消息时,邮箱至少有一个空格来存放该消息
- 接收进程接收消息时,邮箱至少有一个消息来发送
- 高级通信有三种模式:共享内存模式(也属于间接通信)、消息传递模式、共享文件模式。并发进程因共享资源而相互发送消息属于低级通信(利用信号量实现的通信也属于低级通信)
Linux中的IPC通信
Linux中IPC通信的种类:
线程:
定义:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位
作用:保证进程并发,减少对并发进程的管理和切换开销,让用户使用相对简单
线程和进程的关系:
线程的分类:
核心级线程: 指由内核管理的线程。
用户应用程序通过API和系统调用(system call)来访问。
用户级线程: 指不需要内核支持而在用户程序(用户空间)中实现的线程。
其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
用户级线程相较于核心级线程的优缺点:(核心级线程的优缺点于它恰恰相反)
优点:
1)线程切换开销小。同一线程间的切换不需要内核的干预
2)可操作性高。用户级线程的调度可以由用户自己单独设置一个调度算法,于操作系统的调度算法无关
3)应用范围更广。用户级线程可以在一个不支持线程的操作系统上运行
缺点:
1)并发性低。将其中一个线程被操作系统阻塞时,会导致该进程中的其他线程也被阻塞
2)不适用于多处理器系统上运行
线程的标识:线程控制块(Thread Control Block,TCB)是线程存在的唯一标识。它是与进程的控制块(PCB)相似的子控制块,只是TCB中所保存的线程状态比PCB中保存少而已。
注:核心级线程和 核心线程 的区别!核心线程是指它所属进程是 核心进程 的线程。核心级线程是包括核心线程的。
管程:
Dijkstra在1965年引入了信号量这个概念,很好的解决了进程同步和互斥的描述性问题,但是不够完美,因为信号量的大量操作分布在各个进程中不便于管理,于是他又于1971年提出了秘书进程这一概念,用来集中管理信号量实现不同进程对同一临界资源的互斥使用。后来经过完善总结,在1974年和1977年由Hore和Hansen提出了管程
定义:指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象(若无外力作用,它们都将无法推进下去)。死锁的根本原因是系统资源的不足
死锁产生的必要条件:
其中,互斥是资源的固有特性,要想解决死锁需要从其它三个方面出发。
解决死锁的方法:
死锁的预防
死锁的避免
主要使用算法来实现,推荐文章<^_^> => 银行家算法的实现和详解
死锁的检测和修复
原理:让操作系统设置专门的机构,该机构能够及时检测死锁,并且在死锁发生后能通过外力破坏死锁的某个必要条件,从而使陷入死锁中的进程得到修复
死锁修复的方法:
1)撤销产生死锁的所有进程。(实现很简单,但弊端也很明显,会浪费掉已执行进程的时间,还有可能会因为异常进程的退出导致系统的瘫痪)
2)逐个撤销死锁的进程,直到解除死锁解除为止。(撤销顺序可以按死锁进程占有资源的多少来确定)
3)逐个剥夺死锁进程所占有的资源,重新分配给其他进程,直到解除死锁为止
引言:
在操作系统中,处理机包括中央处理器,主存储器,输入-输出接口,加接外围设备就构成完整的计算机系统。处理机是处理计算机系统中存储程序和数据,并按照程序规定的步骤执行指令的部件。程序是描述处理机完成某项任务的指令序列。指令则是处理机能直接解释、执行的信息单位。早期的操作系统都是单一进程,随着科技的发展,和为了提高资源的利用率,现代操作系统普遍采用并发执行,同时进程数量也多于CPU的数量,这就导致各进程需要互斥的使用处理机,所以处理机的好坏决定了计算机的性能
定义:是用户借助计算机系统所做的一个计算机问题或一次事物处理的完整过程
作业的状态:
注:后备队列是作业调度的中间过程,此时的作业正在等待被就调度程序调度;就绪队列是进程调度的中间过程,此时进入内存中的作业被创建进程、分配完资源等着进入CPU(可以回看第二章进程控制的基本概念加深理解)
作业的标识:作业控制块(Job Control Block,JCB)功能类似PCB,JCB是作业存在的唯一标识,是操作系统对作业进行控制、管理和调度的依据,它在作业提交时产生,在作业完成或撤销时消失
作业和进程的关系:
作业调度包括了进程调度,进程调度发生在作业的执行态;进程调度包括线程调度,线程调度(只针对于具有多线程的进程而言)发生在进程调度的整个过程期间
调度算法
相关计算和基础概念可以参考:调度算法相关计算 好文值得推荐
FCFS:
PS:
SJF:
HRN:
SPF:
RR:
优点:CPU利用率很高
缺点:不稳定(时间片的选取要合理,时间片过大,退化成FCFS;时间片过小,进程频繁切换系统开销大)
拓展;
多级反馈调度算法(Round Robin With Mulitiple Feedback,RRMF):将不同优先级的队列分成若干组,每组具有相同的时间片,然后按RR算法进行调度。优点:既能使高优先级的作业得到响应又能使短作业(进程)迅速完成;缺点:实现复杂
磁盘调度算法 | 优点 | 缺点 |
---|---|---|
FCFS算法 | 公平、简单 | 平均寻道距离大,仅应用在磁盘I/O较少的场合 |
SSTF算法 | 性能比“先来先服务”好 | 不能保证平均寻道时间最短,可能出现“饥饿”现象 |
SCAN算法 | 寻道性能较好,可避免“饥饿”现象 | 不利于远离磁头一端的访问请求 |
C-SCAN算法 | 消除了对两端磁道请求的不公平 | 实现较为复杂 |
如果现在并发执行两个不同程序的A操作和B操作,两个不同程序的A操作和B操作根本没啥关系,但是它们是并发执行的,执行了A操作,但是B因为其他原因没有执行完毕,则A操作对应的那个程序也无法继续向下执行,必须等待B操作执行完毕。 ↩︎
并发执行的程序,系统中的资源都是共享的,而这些资源的状态也由这些程序来改变,致使其中一个程序运行时,其环境必然受到其他程序影响。 ↩︎
因为程序运行的速度不同,程序的运行对环境也相互影响,则程序多次执行,虽然它们的初始条件相同,但是运行的结果却个不同。 ↩︎