操作系统(一)
操作系统
操作系统概述
操作系统的概念
操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。即:
- 操作系统是系统资源的管理者
- 提供的功能:处理机(CPU)管理,存储器管理,文件管理,设备管理
- 目标:安全、高效
- 向上层提供方便易用的服务(GUI、命令接口)
- 联机命令接口 = 交互式命令接口 ,输入一句,执行一句,不断交互
- 脱机命令接口 = 批处理命令接口,输入一堆,执行一堆
- 程序接口:可以在程序中进行系统调用来使用程序接口。普通用户不能直接使用程序接口,只能通过程序代码间接使用。如:C语言printf()函数
- 是最接近硬件的一层软件
操作系统的特征
并发、共享、虚拟、异步
并发
- 并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。
- 与之易混概念 并行:指两个或多个事件在同一时刻同时发生。
- 操作系统的并发性:指计算机系统中“同时”运行着多个程序,这些程序宏观上看是同时运行着的,而微观上看是交替运行的。
- 操作系统就是伴随着“多道程序技术”而出现的。因此,操作系统和程序并发是一起诞生的
- 单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行
- 多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行
共享
- 共享:即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。
- 共享分为:互斥共享方式和同时共享方式
- 互斥共享:系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源
- 同时访问:系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问
- 并发性和共享性互为存在条件(如果失去并发性,则系统中只有一个程序正在运行,则共享性失去意义;如果失去共享性,则多个程序不能同时访问硬盘资源,也就无法并发)
虚拟
- 虚拟:是指一个物理上的实体变成若干个逻辑上的对于物。物理实体是实际存在的,而逻辑上的对应物是用户感受到的。
- 如虚拟内存技术:将部分程序和数据存储到硬盘上,而不是全部存储到内存中,来拓展可用的内存空间,当需要访问被存储在硬盘上的数据时,操作系统会将其加载到内存中。
- 时分复用技术(如虚拟处理器):每个进程被分配一个时间片,在这个时间片内执行,然后切换到下一个进程,使得多个进程可以共享处理器,看起来是同时运行的。
- 空分复用技术(如虚拟存储器技术):虚拟内存将物理内存空间与逻辑地址空间分离,允许多个进程同时在内存中运行。每个进程认为它拥有整个地址空间,但实际上,只有当前需要的部分被加载到物理内存中。
- 如果失去并发性,则一个时间段只需要允许一个程序,那么就失去了虚拟性的意义。
异步
- 异步:在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停的,以不可预知的速度向前推进。
- 如果失去并发性,那么系统只能串行的运行各个程序,异步性就失去意义。
操作系统的发展与分类
手工操作阶段:手工操作纸带机,缺点:手工装/取纸带和从纸带机读/写浪费大量时间,计算机利用率太低,而且用户独占资源
单道批处理阶段:引用脱机输入/输出技术,并由监督程序负责控制作业的输入、输出。相较于手工阶段,输入输出速度加快,但依然只能运行一道程序,CPU大量时间依然空闲。
多道批处理系统:操作系统正式诞生,用于支持多道程序并发运行,当前一个程序使用CPU计算时,下一个程序同时进行输入,类似于流水线,使得CPU能够保持忙碌状态,提高利用率。
缺点:用户响应时间长,没有人机交互功能,无法调试程序,和运行时输入参数等。
分时操作系统:计算机以时间片为单位,轮流为各个用户/作业服务,各个用户可以通过终端与计算机进行交互。
优点:用户请求可以被即是响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机操作相互独立,感受不到别人的存在
缺点:不能优先处理一些紧急任务。操作系统对各个用户/作业完全公平,循环的为每位用户/作业服务一个时间片,不区分任务的紧急性。
实时操作系统:计算机系统接受到外部信号后及时进行处理,并且要在严格的时限内处理完事件。特点:及时性可靠性
优点:能够优先响应一些紧急任务,某些紧急任务不需要时间片排队
- 硬实时系统:必须下绝对严格的规定时间内完成处理,如:导弹控制系统、自动驾驶系统
- 软实时系统:能接受偶尔违反时间规定,12306
操作系统的运行机制
普通程序员写的程序就是“应用程序”
微软、苹果等负责实现操作系统的,他们写的是“内核程序”,由很多内核程序组成了“操作系统内核”,简称“内核(Kernel)”,内核是操作系统最重要最核心的部分,也是最接近硬件的部分。
一个操作系统只要有内核就足够了,GUI就不是在内核中
程序运行的过程其实就是CPU执行一条一条的机器指令的过程
操作系统内核作为“管理者”,有时会让CPU执行一些“特权指令”,如:内存清零指令。这些指令影响重大,只允许“管理者”——即操作系统内核来使用
应用程序只能使用“非特权指令”,如:加法指令等
CPU有两种状态“内核态”(核心态、管态)和“用户态”(目态),CPU有一个寄存器叫程序状态字寄存器(PSW),其中有个二进制位,1表示“内核态”,0表示“用户态”
- 处于内核态时,说明此时运行的是内核程序,此时可以执行特权指令
- 处于用户态时,说明此时运行的是应用程序,此时只能执行非特权指令
内核态—>用户态:执行一条特权指令,修改PSW的标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权
用户态—>内核态:由“中断”引发,硬件自动完成变态过程,处罚中断信号意味着操作系统将强行夺回CPU的使用权
- 中断信号:除非法使用特权指令外,其他凡是需要操作系统介入的地方都会触发中断信号
中断
中断:是一种由硬件或软件生成的信号,用于通知处理器需要执行特定的操作或处理特殊的事件。中断的出现打破了正常的程序执行流程,使得处理器可以迅速地响应并处理紧急事件,而无需等待当前指令执行完毕。
中断的作用:中断是让操作系统内核夺回CPU使用权的唯一途径,如果没有中断机制,那么一旦应用程序得到CPU的使用权,就会一直运行这个应用程序,那么就不能做到并发运行了
中断分为:内中断和外中断
内中断(异常):与当前执行的指令有关,中断信号来源于CPU内部
如:在应用程序执行一些非特权指令中混入一条特权指令;或者应用程序想请求内核的服务就会执行一个陷入指令,故意引发内部中断。
外中断(中断):与当前执行的指令无关,中断信号来源于CPU外部
如:时钟中断(时间片)
中断机制的基本原理:不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号时,会根据中断信号的类型去查中断向量表,以此来找到相应的中断处理程序在内存中的存放位置
系统调用
系统调用是操作系统提供给应用程序(程序员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序通过系统调用来请求获得操作系统内核的服务
普通应用程序 可直接进行系统调用,也可以直接使用库函数 编程语言 向上提供库函数。有时会将系统调用封装成库函数,隐藏系统调用的一些细节,方便编程 操作系统 向上提供系统调用,使得上层应用能请求内核的服务 裸机 使用系统调用的意义:
- 场景:WPS和Word同时请求打印机,如果两个进程可以随意地、并发的共享打印机资源,两个打印内容可能会混合在一起
- 解决办法:由操作系统内核对共享资源统一管理,并向上层提供系统调用,进程想使用打印机这种资源,只能通过系统调用的方式向操作系统内核发出请求,内核会对各个请求进行协调处理
系统调用 功能 设备管理 完成设备的/请求/释放/启动等功能 文件管理 完成文件的读/写/创建/删除等功能 进程管理 完成进程的创建/撤销/阻塞/唤醒等功能 进程通信 完成进程之间的消息传递/信号传递等功能 内存管理 完成内存的分配/回收等功能 凡是与共享资源有关的操作,都必须通过系统调用的方式向操作系统内核提出服务请求,由内核代为完成,保证系统的稳定性和安全性,防止用户进行非法操作
系统调用过程:传递系统调用参数—>执行陷入指令(用户态)—>执行相应的内核请求程序处理系统调用(内核态)—>返回应用程序
(陷入指令 = trap指令 = 访管指令)
操作系统体系结构
- 内核是操作系统最基本、最核心的部分,实现操作系统内核功能的那些程序就是内核程序
- 时钟管理:实现计时功能
- 中断处理:负责实现中断机制
- 原语:是一种特殊的程序;处于操作系统最底层,最接近硬件的部分;这种程序的运行具有原子性——其运行只能一气呵成,不可中断;运行时间较短,频繁调用。
- 对系统资源进行的管理功能:进程管理、存储器管理、设备管理
- 操作系统体系结构分两种:大内核和微内核
- 大内核是包括:时钟管理、中断处理、原语以及对系统资源的管理功能
- 优点:高性能
- 缺点:内核代码庞大,结构混乱,难以维护
- 微内核包括:时钟管理、中断处理、原语
- 优点:内核功能少,结构清晰,方便维护
- 缺点:在微内核中,对系统资源的管理功能在用户态下完成,所以需要不停的切换状态,会降低系统性能
- 典型大内核:Linux、UNIX
- 典型微内核:Windows NT
- 大内核是包括:时钟管理、中断处理、原语以及对系统资源的管理功能
操作系统引导
- 操作系统引导(Bootstrapping)是计算机系统启动过程的关键阶段。当计算机上电或重新启动时,首先执行的是一个称为引导加载程序(Boot Loader)的特殊程序,它负责加载操作系统的核心部分,即内核,使操作系统能够运行。
- 计算机主存由RAM和ROM组成,通常所说的内存大小即为RAM,ROM中集成了一个BIOS(Basic Input/Output System)程序,其中包含ROM引导程序,即自举程序
- 操作系统引导过程如下:
- CPU从一个特定主存地址开始取值令,执行ROM中的引导程序(先进性硬件自检,再开机)
- 将磁盘的第一块——主引导记录读入内存,执行磁盘引导程序,扫描分区表
- 从活动分区(又称主分区,即安装了操作系统的分区)读入分区引导记录,执行其中的程序
- 从根目录下找到完整的操作系统初始化程序(即启动管理器)并执行,完成“开机”的一系列动作
虚拟机
通常一个物理设备只能使用一个操作系统,会造成物理设备的浪费
虚拟机:使用虚拟化技术,将一台物理机器虚拟化成多台虚拟机器(Virtual Machine ,VM)每个虚拟机都可以独立运行一个操作系统
虚拟机管理程序分两种:一是直接运行在硬件上,另一种是运行在宿主操作系统上
- 第一类VMM中的虚拟操作系统运行在用户态,但会认为自己是在内核态,所以如果要使用特权指令,需要通过虚拟机管理程序进行操作
- 第二类VMM如使用Virtual Box、VMware
第一类VMM 第二类VMM 对物理资源的控制权 直接运行在硬件之上,能直接控制和分配物理资源 运行在Host OS之上,依赖于Host OS为其分配物理资源 资源分配方式 在安装Guest OS时,VMM要在原本的硬盘上自行分配存储空间,类似于“外核”的分配方式,分配未经抽象的物理硬件 Guest OS拥有自己的虚拟磁盘,该盘实际上是Host OS文件系统中的一个大文件。Guest OS分配到的内存是虚拟内存 性能 性能更好 性能更差,需要Host OS作为中介 可支持的虚拟机数量 更多,不需要和Host OS竞争资源,相同的硬件资源可以支持更多的虚拟机 更少,Host OS本身需要使用物理资源,Host OS上运行的其他进程也需要物理资源 虚拟机的可迁移性 更差 更好,只需要导出虚拟机镜像文件即可迁移到另一个Host OS上,商业化应用更广泛 运行模式 第一类VMM运行在最高特权级(Ring 0),k可以执行最高特权的指令 第二类VMM部分运行在用户态,部分运行在内核态。Guest OS发出的系统调用会被VMM截获,并转化为VMM对Host OS的系统调用
进程管理
进程
进程的概念、组织
- 程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。
- 进程(Process):是动态的,是程序的一次执行过程。(同一程序多次执行会对应多个进程)
- 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
- PCB(Process Control Block,进程控制块)包含:
- PID(进程唯一ID)、UID(进程所属用户)
- OS给进程分配了哪些资源(如:内存,I/O设备,文件等)
- 记录进程运行情况(如:CPU使用时间,磁盘使用情况,网络流量使用情况)
- 但凡管理时所需要的信息,都会被放在PCB中
- PCB是进程存在的唯一标志,当进程被创建时,操作系统为其创建PCB,当进程结束时,会回收其PCB
- 进程实体(进程映像)的组成:PCB、程序段(程序代码)、数据段(运行中产生的各种数据),PCB给OS用,程序段和数据段给进程自己用
- 进程是动态的,进程实体是静态的(某一时刻状态)
进程的特征
动态性、并发性、独立性、异步型、结构性
- 动态性:进程是程序一次执行过程,是动态地产生、变化和消亡的
- 并发性:内存中有多个进程实体,各进程可并发执行
- 独立性:进程是能够独立允许,独立获取资源、独立接受调度的基本单位
- 异步型:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题
- 结构性:每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成
进程的状态
- 进程正在被创建时,它的状态是”创建态”,在这个阶段操作系统会为进程分配资源、初始化PCB
- 当进程创建完成后,便进入“就绪态”,处于就绪态的进程已经具备运行条件,但由于没有空闲CPU,就暂时不能运行
- 如果一个进程此时在CPU上运行,那么这个进程处于“运行态”。CPU会执行该进程对应的程序。
- 在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态”
- 一个进程可以执行 exit 系统调用,请求操作系统终止该进程,此时该进程会进入“终止态”,操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB。
- 运行态—>阻塞态:申请某种资源,是进程自身做出的主动行为
- 阻塞态—>就绪态:申请的资源被分配,不是进程自身能控制的,被动行为
- 运行态—>就绪态:时间片到,或者处理机被抢占,但其他资源依然拥有
- 进程不能由阻塞态直接转换成运行态,也不能由就绪态直接转换为阻塞态
进程的组织
- 链接方式:
- 索引方式:
进程的控制
- 进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能
- 进程控制需要使用“原语”来实现,即需要一气呵成,不能中断,否则可能会导致操作系统中某些关键数据结构信息不统一的情况
- 原语具有“关中断”和“开中断”两个特权指令,正常情况下,CPU每执行完一条指令都会检查是否有中断信号,但当执行“关中断”后,就不在检查中断信号,直到执行完“开中断”后才会检查。这样就实现了“原子性”
- 进程的创建
- 创建原语:申请空白PCB、为新进程分配所需资源、初始化PCB、将PCB插入到就绪队列
- 引起进程创建的事件:用户登录、作业调度、提供服务、应用请求
- 进程的终止
- 撤销原语:从PCB集合中找到终止进程的PCB、若进程正在运行,立即剥夺CPU,将CPPU分配给其他进程、终止其所有子进程、将该进程拥有的所有资源归还给父进程或操作系统、删除PCB
- 引起进程终止的事件:正常结束、异常结束、外界干预
- 进程的阻塞
- 阻塞原语:找到要阻塞的进程对应的PCB、保护进程运行现场,将PCB状态信息设置为”阻塞态“,暂时停止进程进行、将PCB插入相应事件的等待队列中
- 引起进程阻塞的事件:需要等待系统分配某种资源、需要等待互相合作的其他进程完成工作
- 进程的唤醒
- 唤醒原语:在事件等待队列中找到PCB、将PCB从等待队列中移除,设置进程为就绪态,将PCB插入就绪队列,等待被调度
- 引起进程唤醒的事件:等待的事件发生
- 进程的切换
- 切换原语:将运行环境信息存入PCB、PCB移入相应队列、选择另一个进程执行,并更新其PCB、根据PCB恢复新进程所需的运行环境
- 引起进程切换的事件:当前进程时间片到、有更高优先级的进程到达、当前进程主动阻塞、当前进程终止
进程的通信
- 进程间通信:是指两个进程之间产生数据交互。(从微博分享到微信)
- 进程所拥有的内存地址空间相互独立,只能访问自己的
- 三种进程通信:共享存储、消息传递、管道通信
- 共享存储:有一个共享存储区,可以多个进程共享,可以通过共享存储区来交换数据。
- 需要保证各个进程对共享区的访问是互斥的,不然会出错。通过操作系统内核提供的同步互斥工具(如P、V)
- 基于存储器的共享存放在共享区的数据形式、存储位置都由进程来决定,而不是操作系统。这种共享方式很快,是一种高级通信方式
- 基于数据结构的共享:比如共享空间只能放一个长度为10的数组,这种共享方式速度慢、限制多,是一种低级通讯方式
- 消息传递:进程间的数据交换是以格式化的消息为单位。
- 进程通过操作系统提供的“发送消息/接受消息”两个原语进行数据交换
- 直接通信方式:点名道姓的消息传递,我要传给谁,谁要接受
- 间接通信方式:以“信箱”作为中间实体进行消息传递
- 管道通信:(单向通信)有个特殊的共享文件pipe,管道文件,在内存中开辟了一个大小固定的内存缓冲区(以循环队列方式写/读数据)
- 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置了两个管道。
- 各个进程要互斥访问管道
- 当管道写满时,写进程阻塞,直到读进程将管道中的数据取走,即可唤醒写进程
- 当管道读空时,读进程将被阻塞,直到写进程往管道中写入数据,即可唤醒读进程
- 管道中的数据一旦被读出,就彻底消失。因此当多个进程读同一个管道时,可能会错乱,通常有两种方案:
- 1、一个管道允许多个写进程,一个读进程
- 2、允许有多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据(Linux方案)
- 共享存储:有一个共享存储区,可以多个进程共享,可以通过共享存储区来交换数据。
线程
线程的概念
- 传统的进程只能串行地执行一系列程序,而有些进程可能需要“同时”做很多事情,因此引入线程来增加并发度,如QQ既要发送文件,又要视频聊天
- 引入线程后,线程就成了程序执行流的最小单位,也是一个基本的CPU执行单位,不仅进程之间可以并发,进程内的线程之间也可以并发,从而提升了系统的并发度,进程是资源分配的基本单位,线程是调度的基本单位,系统开销减小
- 线程的属性:
- 线程是处理机调度的单位
- 多CPU计算机中,各个线程可占用不同的CPU
- 每个线程都有一个线程ID、线程控制块(TCB)
- 线程也有就绪、阻塞、运行三种基本状态
- 线程几乎不拥有系统资源
- 同一进程的不同现成间共享进程的资源
- 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
- 同一进程中的线程切换、不会引起进程切换
- 不同进程中的线程切换,会引起进程切换
- 切换同进程中的线程,系统开销很小
- 切换进程,系统开销很大
线程的实现方式
- 用户级线程:早期操作系统(Unix)只支持进程,不支持线程。当时的“线程”由线程库实现,如:while循环实现三段代码逻辑
- 线程的管理由应用程序完成,线程切换由用户态完成,不需要CPU,操作系统意识不到用户级线程的存在
- 优点:用户级线程的切换试下用户空间即可完成,不需要切换到内核态,线程管理的系统开销小,效率高
- 缺点:当一个用户级线程被阻塞,整个进程都将被阻塞,并发度不高,多个线程不可在多核处理机上并发运行
- 内核级线程:Windows、Linux
- 内核级线程的管理工作由操作系统内核完成,线程调度、切换都在内核态完成,操作系统为每个线程建立TCB,统一管理
- 优点:当一个线程被阻塞,别的线程还可以继续执行,并发能力强,多线程可在多核处理机上并行执行
- 缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到内核态,系统开销大
多线程模型
- 在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型
- 一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程
- 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可以在多核处理机上并行执行
- 缺点:一个用户进程会占用多个内核级线程,线程的切换有操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
- 多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程
- 优点:用户级线程的切换在用户空间完成,不需要内核态,系统开销小,效率高
- 缺点:当一个用户级线程被阻塞,整个进程都会被阻塞,并发度不高,多个线程不可在多核处理机上运行
- 多对多模型:n用户级线程映射到m个内核级线程(n>=m),每个用户进程对应m个内核级线程
- 克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点
调度
处理机调度
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是调度要研究的问题。
调度的三个层次:高级调度,中级调度,低级调度
高级调度(作业调度):
- 按照一定原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只能调入一次,掉出一次。作业调入时会创建PCB,掉出时才撤销PCB。
- 作业:一个具体的任务
- 由于内存空间有限,有时无法将用户提交的作业全部放入内存,就需要作业调度
中级调度(内存调度):
- 按照某种策略决定将哪个处于挂起状态的进程重新调入内存
- 内存不够时,可以将某些进程的数据掉出外存,等内存空闲或者进程需要重新运行时再重新调入内存。
- 暂时掉到外存等待的进程状态为挂起状态。被挂起的进程PCB会被组织成挂起队列。
- 一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。
低级调度(进程调度/处理机调度):
- 按照某种策略从就绪队列中选取一个进程,将处理机分配给它
- 进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度
- 进程调度的频率很高,一般几十毫秒一次
三层调度的联系和对比
调度发生在哪 发生频率 对进程状态的影响 作业调度 外存—>内存(面向作业) 最低 无—>创建态—>就绪态 内存调度 外存—>内存(面向进程) 中等 挂起态—>就绪态 进程调度 内存—>CPU 最高 就绪态—>运行态













