[TOC]
第一章 操作系统
计算机系统
系统及其结构部分
- 计算机系统的最外层是使用计算机的人,最内层便是硬件。
- 人与计算机硬件之间的接口便是计算机软件。
- 系统软件
- 支撑软件
- 应用软件
- 计算机上配置的各种软件中,操作系统是最重要的,他将各种软、硬件资源管理并优化起来为上层应用提供接口和方便,在计算机系统中起到指挥管理的作用
计算机硬件部分
- 计算机系统由一个或多个CPU和若干设备控制器通过共同的总线互相连接。该总线实现了对共享内存的访问。
- 每个设备控制器负责一种的顶类型的设备。
冯诺依曼计算机由 运算器、存储器、控制器、输入、输出五部分组成
冯诺依曼结构
从逻辑结构上讲,经典的冯诺依曼计算机是以运算器为中心的,而现代计算机已经转换为以存储器为中心
计算机各部件的功能
- 运算器用来完成算数运算和逻辑运算,并将运算的中间结果暂存在运算器内。
- 存储器用来存放数据和程序。
- 控制器用来控制、指挥程序和数据的输入、运行以及处理运算的结果。
- 输入设备用来将人们熟悉的信息形式转换为机器能识别的信息形式,常见的有键盘、鼠标、扫描仪等。
- 输出设备可将机器运算结果转换为人们熟悉的信息系统形式,如显示器输出、打印机输出等。
中央处理器 CPU
- 中央处理器是计算机的大脑,在很大程度上决定了一台计算机的性能。
- CPU从内存中提取指令并执行他们。
- CPU在每个工作的基本周期中首先从内存中提取指令,然后对其进行解码以确定其类型和操作数,最后执行。
- 重复该过程取指、解码并执行下一指令直至所有指令执行完毕
CPU内部结构
存储器
- 存储器是计算机系统中的记忆设备,用来存放程序和数据。存储器系统采用了分层结构基于不同的处理方式来进行存储如图所示
- 途中从顶层至底层,价位越来越低,速度越来越慢,通量越来越大,CPU的访问频度也越来越少
高速缓存器Cache不止存在于cpu,其他设备均存在
I/O系统
I/O系统由I/O软件和I/O硬件两部分组成
- I/O软件将用户编制的程序(数据)输入主机,将运算结果输送到用户,其间最重要的任务是实现输入输出系统与主机工作的协调
- I/O系统的硬件组成是多种多样的,在带有接口的I/O系统中,一般包括接口模块及I/O设备两大部分。
总线
总线是连接多个部件的信息传输线,是各部件共享的传输介质。
如图为以存储为中心的双总线结构。
计算机启动
- 启动BIOS ,它检查RAM数量、键盘和其他设备是否正常安装并启动,接着扫描ISA和PCI总线并找出连接其上的所有设备莫若现有设备不同于上次启动,则配置新设备。
- BIOS依照CMOS存储器中的设备清单,决定启动何种设备,默认情况从硬盘启动。启动设备上的第一个扇区被读入内存并执行,启动时按照分区表检查程序,将活动分区的第二个启动装载模块读入操作系统并执行。
- 操作系统询问BIOS,获得配置星系,当获得全部的设备驱动程序后,操作系统将其调入内核,初始化相关表单,创建需要的进程并在每个终端上启动图形用户界面。
CPU指令
指令执行
- cpu执行的程序是由一组保存在存储器中的指令组成的。
- 最简单的指令处理包括两个步骤:
- 处理器从存储器中一次读取一条指令,然后执行每条指令。
- 程序执行是由不断重复的取指令和执行指令的过程组成的。指令执行可能涉及很多操作,这取决于指令自身。
程序执行是由不断重复的取指令和执行指令的过程组成的,cpu之所以能不断重复这一过程,主要是因为cpu内部pc指令计数器寄存器始终保持着下一条指令的地址
cpu取指后,计数器+1类似循环中的步长,以使得循环取指并执行
中断
- 程序中断
- 由指令执行的结果产生,如算术溢出,除数为0等 在程序中的体现我想大概就是异常?
- 时钟中断
- 由处理机的计时器产生,允许操作系统以一定的规律执行函数。即当cpu指令计数器达到预设数量要溢出时,进行中断,即为时钟中断
- I/O中断
- 由I/O控制器产生,用于通知处理机一个操作的完成状态(正常或者错误)
- CPU发送启动I/O设备的命令,将I/O接口中的B触发器置1,D触发器置O。
- 设备开始工作,需要向CPU传送数据时,将数据送入数据缓冲器中。
- 输入设备向I/O接口发出“设备工作结束”的信号,将D触发器置1,B触发器置0。标志着I/O设备已就绪。
- CPU在每条指令执行即将结束时,发出中断查询信号。中断查询信号可以让那些接口中D触发器置1且中断屏蔽触发器(MASK)置0的设备的I/O接口
- 由I/O控制器产生,用于通知处理机一个操作的完成状态(正常或者错误)
- 硬件故障中断
- 由诸如掉电或存储器奇偶错误之类的故障产生
所有计算机都提供了允许其他模块(I/O、存储器)中断处理器正常处理过程的机制
上述为常见的中断类别
中断与指令周期
当cpu发生中断后,需要处理很多事件,包括处理器硬件中的事件和软件中的事件
疑问1:cpu发送中断应答信号给谁?接收方是谁?
1 |
|
疑问2:是否可以以上述代码理解中断处理过程,首先取指令并执行,当发生中断时,结束指令,取出发生中断的指令再次执行,也就是对应图中根据中断处理器加载新的pc值
疑问3:中断的意义是什么,如果说按照疑问2的逻辑,那么中断发生后,cpu将会再次执行该指令,若指令错误岂不是会死循环,是否是在收到中断信号后会根据中断信号做出相应的逻辑处理,例如除数为0 则不进行计算,直接响应
中断的意义:在系统需要的时候进行暂停当前的程序以处理中断
- 为适应中断产生的情况,在指令周期中要增加一个中断阶段,如下图,在中断阶段中,处理器检查是否有中断发生,即检查是否出现中断信号。如果没有中断信号那么处理器继续运行,并在取指阶段取当前程序的下一条指令,如果有中断,处理器挂起当前程序的执行,并执行一个中断处理程序,这个中断处理程序通常是操作系统的一部分,他确定中断的性质,并执行所需要的操作。
疑问1: 中断阶段或者说中断信号检测这一过程,是cpu执行完指令时,检测该指令是否允许中断,若允许中断则进入中断信号检测,还是说是在cpu执行指令的同时进行该指令中断检测的判定。换句话说就是 指令是否允许中断 是与执行指令同步执行的还是异步执行的
操作系统
特征:
- 高效资源管理
- 方便用户使用
操作系统的设计目标
- 高效性
- 方便性
- 可扩充性
- 开发性
- 安全性
操作系统的发展历史
- 1946年 第一代计算机,没有操作系统
- 1955年 第二代计算机,有了监控系统
- 1965年 第三代计算机,出现多道批处理系统
- 1974年 第四代计算机,成熟的商用操作系统
- 1990年 第五代计算机,操作系统向多元化发展
1950年代
1956年
- [GM-NAA I/O](https://baike.baidu.com/item/GM-NAA I%2FO)
1959年
- SHARE Operating System
1960年代
1960年
1961年
- CTSS
- MCP (Burroughs Large Systems)
1962年
1965年
1966年
- DOS/360(IBM)
- MS/8
1967年
1969年
- TENEX
- Unix
1970年代
1970年
DOS/BATCH 11(PDP-11)
OS/8
1972年
1973年
1974年
- MVS(MVS/XA)
1975年
1976年
- CP/M
- TOPS-20
1978年
- [Apple DOS 3.1](https://baike.baidu.com/item/Apple DOS 3.1)(苹果公司第一个操作系统)
- TripOS
- VMS
- Lisp Machine(CADR)
1979年
- POS
- NLTSS
1980年代
1980年
1981年
1982年
- Commodore DOS
- SunOS(1.0)
- Ultrix
1983年
- Lisa OS
- Coherent
- [Novell NetWare](https://baike.baidu.com/item/Novell NetWare)
- ProDOS
1984年
- Macintosh OS(系统 1.0)
- MSX-DOS
- QNX
- UniCOS
1985年
- AmigaOS
- Atari TOS
- MIPS OS
- Oberon operating system
- Microsoft Windows 1.0(Windows第一版)
1986年
1987年
1988年
1989年
- NeXTSTEP(1.0)
- RISC OS
- [SCO Unix](https://baike.baidu.com/item/SCO Unix)(第三版)
1990年代
1990年
- Amiga OS2.0
- BeOS(v1)
- OSF/1
- Microsoft Windows 3.0
- [Windows NT 4.0](https://baike.baidu.com/item/Windows NT 4.0)
- Linux2.0
- AROS
- Mac OS 8
- Microsoft Windows 98 Second Edition
2000年代
- AtheOS
- [Mac OS 9](https://baike.baidu.com/item/Mac OS 9)
- MorphOS
- [Windows 2000](https://baike.baidu.com/item/Windows 2000)
- Microsoft Windows Me
- Amiga OS4.0 (2001年5月)
- Mac OS X 10.1
- [Windows XP](https://baike.baidu.com/item/Windows XP)
- z/OS
- [Windows XP 64-bit Edition](https://baike.baidu.com/item/Windows XP 64-bit Edition)
- Syllable
- Mac OS X 10.2
- [Windows Server 2003](https://baike.baidu.com/item/Windows Server 2003)(2003年3月28日)
- [Windows XP 64-bit Edition](https://baike.baidu.com/item/Windows XP 64-bit Edition)- 以Microsoft Windows Server 2003为基础,同一天发布。
- Mac OS X 10.3
- [Windows XP Media Center Edition](https://baike.baidu.com/item/Windows XP Media Center Edition)
- [Windows XP Professional x64 Edition](https://baike.baidu.com/item/Windows XP Professional x64 Edition)
- Mac OS X 10.4
- Microsoft[Windows Vista](https://baike.baidu.com/item/Windows Vista)
- Mac OS X 10.5
- Mac OS X 10.6
- Microsoft[Windows 7](https://baike.baidu.com/item/Windows 7)
2010年代
2011年
——Mac OS X 10.7
2012年
——Windows 8
——Mac OS X 10.8
2013年
——Windows 8.1
——Mac OS X 10.9
2014年
——Mac OS X 10.10
2015年
——Windows 10
——Mac OS X 10.11
2016年
——Mac OS X 10.12
2017年
——Mac OS X 10.13
2018年
——Mac OS X 10.14
2019年
——Mac OS X 10.15
第一代计算机的操作系统
人工操作
在第一台计算机上没有操作系统,对计算机的操作完全是人工操作方式(卡片打孔),这种操作方式有两个缺点:
- 用户完全独占计算机,也就是说,及算你的全部资源直供一个用户使用。
- 计算机等待人工操作。当用户操作时计算机要等待CPU空闲
第二代计算机的操作系统
监控系统(dos)
第二代计算机主要用于科学和工程计算,程序大多用FORTRAN语言书写,该语言适用于作数值运算,当时主机上用的控制程序称之为健康程序Monitor,其功能相对简单,监控程序是操作系统的雏形。
- 单道批处理系统
- 将所有的作业用一台相对比较便宜的计算机输入到磁带上,此计算机称为输入/输出机,实施数值运算、速度较快的计算机称为主机。大批的作业在输入/输出机的控制下输入到磁带后,用一个特殊的程序来控制作业的读入和运行,这个特殊的程序用作业控制语言(JCL,Job Control Language)书写,他能控制程序的运行。
操作系统的内部矛盾
- 主机与外设速度的不匹配 Vcpu-Vp
- 方案一,提供多台外设,以提高外设运算速度(产生多道程序设计—第三代计算机)
- 方案二,提高外设速度
- 硬件方面—-使用 通道、中断技术(第三代计算机)
- 软件方面
- 使用缓冲区技术(Buffer)
- 使用脱机输入/输出技术
- 计算机与人速度的不匹配 Vcomputer-Vperson
- 操作员方面—-对操作员进行分工 (第二代计算机开始分工)
- 减少干扰方面—-使用早期批处理技术
- 作业控制卡
- 作业控制语言JCL
- FORTRAN语言(第二代计算机开始)
- 合作配合—-配备多个操作员,分时系统产生(第三代计算机开始)
脱机输入/输出技术
程序和数据的输入都不是在主机的控制之下,二十在一台专门输入、输出的计算机的控制之下进行,或者说,输入/输出工作是在脱离主机的情况之下进行的,故称为脱机输入/输出(OffLine I/O)
操作系统的多元化发展
- 随着大规模集成电路(在每平方厘米的芯片上集成数千个晶体管)的发展,计算机向着微型化、网络化和智能化的方向发展。
- 个人计算机的时代到来。
- 个人计算机连成了网络。因此运行其上的网络操作系统和分布式操作系统就开始崛起。
安卓!=网路操作系统
操作系统的发展与分类
- 成熟的系统
- 批处理系统
- 分时系统
- 实时系统
- 发展中的系统
- 网络操作系统
- 分布式操作系统
- 个人操作系统
- 嵌入式操作系统
- 多处理机操作系统
批处理操作系统
- 批处理操作系统
- 批处理操作系统(Batch Processing Operating System)的工作流程为:用户将作业交给操作人员,系统操作人员将多个用户的作业组成一批输入磁带,然后启动批处理操作系统。系统自动从磁带上加载作业到内存执行,最后把执行结果输出。
- 根据系统一次加载作业的道数,批处理操作系统分为单道批处理操作系统和多道批处理操作系统。
- 单道批处理操作系统每次只加载一道作业到内存中执行
- 多道批处理操作系统每次加载多道作业到内存中并发执行,各个作业轮流使用处理机和其他系统资源,最终依次完成。
- 批处理系统适合处理大批无交互的作业。
运行程序经过三部分
输入—-计算—-输出
这三部分称为交互
批处理不进行交互,直接使用作业控制语言(JCL)
疑问1:批处理到内存中的指令优先级如何?
多道批处理系统的特点
多道批处理系统的特点
- 多道批处理系统中引入了多道程序设计技术
- 基本思想:
- 在内存中同时存放多道相互独立的程序,这些程序共享系统资源,并在操作系统的控制下交替在CPU上执行。
- 特点:
- 宏观上来看,内存中的多道程序都已经开始执行都尚未结束
- 微观上来看在单处理器系统中,某一个时刻只有一个程序获得CPU的执行
- 多道程序交替执行的方式常称为程序的并发执行,采用多道程序设计技术的系统被称为多道程序系统。
单道与多道程序
单道与多道程序
当一段程序执行时,系统发起了IO中断请求,cpu启动io监控程序,待io完成后,结束中断请求,继续执行程序
批处理系统的优缺点
- 批处理操作系统优点:作业逐批进入系统并逐批进行处理,系统资源利用率高、作业吞吐量大;作业之间的过渡由操作系统完成,无需人工干预,减少擦错的出现。
- 批处理操作系统的缺点:作业周转时间长;用户不能和正在执行的程序进行交互;不利于程序的开发和调试。
分时操作系统
- 分时操作系统是指将多个用户程序装入内存,系统把CPU的运行时间分成一个个的时间段,每个时间段称为一个时间片。时间片大小通常为几十毫秒,用户程序轮流获得CPU的时间片。当系统分给用户程序的时间片用完后,系统强行收回CPU,该用户程序等待下一次获得时间片时再继续执行。
- 简单分时系统
- 具有前后台的分时系统
- 多道分时系统
分时操作系统的特点
- 同时性
- 交互性
- 独占性
- 及时性
时间片的选取:
过长会使终端用户不能及时得到响应,过短会造成CPU频繁切换,增大系统开销。操作系统设计者应对系统中的各种因素进行综合分析,选取适中的时间片。
CPU 切换时间片需要代价-时间
实时操作系统
- 所谓 “实时” ,即立即、及时的意思。实时操作系统能及时响应外部事件请求并在规定的时间内处理完毕。
- 实时任务按截止时间分为:
- 硬实时任务
- 软实时任务
- 实时操作系统为了保证系统能够及时、准确的做出响应,一般都具备实时时钟中断频率,实现精确计时,这可保证实时任务及时被执行。
特殊要求
- 高可靠性
- 过载保护
- 对截止时间的要求
网络操作系统
- 网络OS模式
- 客户/服务器模式 Client/server
- 对等模式 Peer to Peer
- 网络OS功能
- 网络通信
- 网络管理
- 资源共享管理
- 互操作能力
- 网络服务
分布式操作系统
分布式操作系统是由若干个计算机经互联网络连接而成的,这些计算机既可以独立工作,又能协同工作。可实现系统内的资源管理,任务动态分配,并能并行地运行分布式程序。
分布式OS特点
- 多机合作
- 健壮性
- 透明性
- 共享性
分布式系统催生了区块链
个人操作系统
- 个人操作系统是面向个人计算机应用而研制的一种操作系统。它是为没有计算机专业知识的个人计算机用户编写的、运行在个人计算机上的操作系统。
- 个人操作系统的特点主要有:
- 具有良好的图形用户接口
- 管理性能较高,引入了许多过去在小型机中采用的技术如虚拟内存技术、多线程技术等
- 具有较好的可扩充性和兼容性,方便不同系统之间的互连和分布式处理
- 具有丰富的应用软件
操作系统的主要功能
- 操作系统作为系统的资源管理者,并作为计算机和用户间的接口,它的主要功能如下:
- 处理机管理
- 存储器管理
- 设备管理
- 文件管理
- 用户接口管理
主要功能
- 系统调用是操作系统提供服务的唯一途径。在最底层,系统调用允许运行程序直接向操作系统发出请求。
- 系统调用提供基本功能,如进程控制、文件操作和设备管理等。
- 操作系统中,由命令解释程序或系统程序来完成的高级别请求需要转换成一系列的系统请求。
处理机管理功能
- 操作系统采用的处理及管理策略决定了操作系统的主要性能。正是由于操作系统对处理机的管理策略的不同,其提供的作业处理方式也就不同。例如,批处理方式、分时处理方式、实时处理方式等。从而,呈现在用户面前,称为具有不同处理方式和不同特点的操作系统。
任务
- 对处理及的分配和运行实施有效管理。
- 在多道程序环境下,处理及的分配和运行以进程为单位,因此对处理机的管理即对进程的管理。
功能
- 进程控制
- 进程同步
- 进程通信
- 进程调度
存储器管理功能
- 由于内存容量有限,如何在内存中装入更多的并发执行进程以及如何运行比内存容量大得多的进程,这也是需要存储器管理解决的问题。操作系统通常采用虚拟存储技术来提高内存利用率和系统并发程度。如何保证内存中多道程序互不干扰,这也是内存管理的主要功能之一。
任务
- 方便用户使用内存
- 提高内存的利用率
- 从逻辑上扩充内存
功能
- 内存分配
- 地址映射
- 内存保护
- 内存扩充
设备管理
- 计算机中所配置的I/O设备多种多样,他们的工作原理、I/O传输速度、传输方式千差万别。为了方便方便用户操作这些I/O设备,操作系统通常采用统一界面来管理I/O设备,使用户感觉不到差异。操作系统将I/O设备本身的物理特性差异交给设备驱动程序去处理,提高了其适应性。
任务
- 完成用户程序请求的I/O操作,为用户程序分配I/O设备
- 提高外部设备的利用
- 尽可能地提高输入/输出的速度
- 方便用户使用外部设备
功能
- 设备分配
- 设备控制
- 设备无关性
文件管理
文件管理主要管理计算机系统中的信息资源。操作系统对用户文件和系统文件进行有效
的管理,有助于提高系统資源利用率和用户满意度。
操作系统的文件管理模块是最接近用户的部分,也是用户比较熟悉的部分。
现代计算机系统中,文件的存情介质主要是磁盘。不同的操作系统对文件的磁盘存储结
构有不同的组织方式,文件在磁盘上以何种结构进行组织和存放直接影响文件存取速度。
任务
- 大量的信息以文件的形式放在外存,对信息的管理也就是对文件的管理。
功能
- 文件存储空间的管理
- 目录管理
- 文件的读、写管理
- 文件的存取控制
用户接口管理功能
- 操作系统向用户提供了各种使用接口:
- 命令接口:
- 联机命令接口
- 脱机命令接口
- 图形用户界面(命令接口的改版)
- 程序接口 也称系统调用
- 命令接口:
操作系统的主要特征
并发执行
并发性是指两个或多个事件在同一时间间隔内发生。因为有了并发性,内存中可同时存放操作系统程序和若干个用户程序,各个程序轮流切换地使用CPU
区分两个概念:并发和并行
若在一个时间段内发生了一个以上的事件,则称这几个事件具有并发性而并行性指的是多个事件在同一时刻点发生
并发性能有效地提高系统资源利用率和作业吞吐率。并发性同时也给操作系统带来了系列问题,使操作系统的设计和实现变得异常复杂。
并行强调同时,并发强调切换
资源共享
- 操作系统中的共享,指的是多个并发执行的程序按照一走的规则共同使用操作系统所管理的软硬件资源。
- 操作系统所管理的软硬件资源按照使用方式可分为:
- 同时访问方式(同时型共享)
- 互斥访问方式(互斥型共享)
- 共享性和并发性相辅相成。由于并发所以实现了资源共享,但一味追求共享,管理不好就会影响并发性的实现,甚至会导致进程的运行结果错误。这些内容在后续章节中会有详细讲解
一切皆虚拟
虚拟”的概念在操作系统中随处可见。操作系统中的“虚拟″是指通过某种管理技术把一个物理实体变为若千个逻辑上的对应物,或把物理上的多个实体变成逻辑上的一个对应物。物理实体是客观存在的,逻辑上的对应物是虚构的,只是用户主观上的一种想象
现代操作系统中主要有两种虚拟技术:时分复用技术和空分复用技术
1)时分复用技术,即分时使用技术。把硬件设备的使用时间分割成小的时间片,供多个用户程序“轮流”、“切换”使用。
2)空分复用技术,即通过空间的划分,把一个物理存储设备改造成为逻辑上的多个存储设备。
- 工作模式不同的各个设备所使用的映射方法不同。
- 虚拟存储器技术
- 虚拟处理器技术
- 虚拟设备技术
- 虚拟特性的实现主要依靠分时共享和多道程序设计技术,在它们的帮助下,操作系统可以将一个设备映射为多个,将一个设备的能力均分到不同的逻辑设备上,以便多用户共享资源。
- 虚拟方法不会造成多个用户长期等待他用户操作完成,同时能够极大地提高資源利用率。
异步性
- 异步性指在多道程序设计环境下,系统中每道程序的推进时间、顺序以及完成时间由于受其运行环境的影响是不确定的、不可预知的。程序的执行是以“走走停停”的方式运行
- 有的文献也称异步性为不确定性、随机性。
- 例:两个程序共享一个全局变量N,程序A中设N=5;程序B中设N=3,并打印N。A和B并发执行,可能会出现以下3种情况:
- 先执行A,再执行B,打印语句在N=5与N=3后执行,打印结果为3
- 先执行N=3,然后切换执行A,打印语句在N=5之后执行,打印结果为5
- 先执行B,再执行A,打印结果为3。
答疑:操作系统中的异步是程序设计中异步的基础,程序设计中采取了某种方式使得操作系统中的异步获得确定性,二者相同的地方在于单纯讨论异步这个操作,从宏观上来说他是同时进行的,从微观上来说他实际上是类似分时操作系统中切片的机制交替执行的
- 异步性的产生是由现代操作系统的并发性引起的。
- 在并发执行的多个进程间,何时能够获得所需资源,在什么时刻等待哪些进程放資源,以及当前占有資源的进程何时释放资源等因素都是不确定的,因此用户是无法预知各个进程的执行时间
- 异步性增加了操作系统的设计与实现难度,操作系统设计者必须采取一定的措施保证系统不出现结果随机性
操作系统的结构
- 使用软件工程思想设计操作系统时,除了要满足操作系统的基本设计目标外,还要根据用户需求分析采用哪种形式的操作系统结构更适用。
- 较有代表性的OS结构
- 无结构操作系统
- 模块化结构操作系统
- 分层式结构操作系统
- 虚拟机結结构操作系统
- 微内核结构操作系統(客户/服务器模型)
模块化结构操作系统
- 模块化结构又称为整体结构,它采用结构化程序设计技术,将复杂的OS需求分解后根据相关性分类,毎个类别使用一个或几个模块实现。
- 模块-接口法:整体结构OS的各模块分别具有特定管理功能,且相互之间使用规定好的接口通信。各模块进一步划分为子模块和通信接口。子模块还可以进一步细分为更小的模块
特点
- 内娶度低;耦合度高
- 新加入的系统功能可以独立设计、编码和调试后再与原系统连接形成新的整体
- 各模块独立开发,缩短系统开发周期
- 独立开发的各模块无法基于确定前趋模块完成,这种无序性将会导致设计的基础无法保证可靠
分层式结构操作系统
- 便于保证系统正确性
- 便于进行功能扩充和系统维护
- 各层间都要定义通信机制,这样当一个用户请求需要使用较低层次的功能时,需要多次穿越层边界,这样的做法会增加通信开销,导致系统效率降低
虚拟机结构操作系统
微内核结构操作系统
- 数据可以分布式处理和存储
- 重要数据可放在受到严密保护的服务器所在的局域网内,便于集中管理,以保证数据安全
- C/S结构有较好的灵活性和可扩充性
- 易于修改用户程序
操作系统的运行环境
时钟
- 为了让计算机的各项操作功能在不同时间段有序、分布完成,计算机必须提供系统时钟。系统时钟通常安装在主机板上,像节拍器一样规律性地控制计算机工作
- 系统时钟通常分为两种控制方式:同步时序控制方式和异步时序控制方式。
处理机状态及状态转换
- 计算机系统根据运行程序对资源和机器指令的使用权限把处理机的执行状态分成两类。
- 核心态(又称为管态、待权状态、系统模式)
- 核心态是指操作系统运行时,处理机所处的状态。处理机处于核心态时,其上运行的程序可以执行包括特权指令和非特权指令在内的全部机器指令,能访问所有系统資源并具有改变处理机状态的能力。
- 用户态(又称目态、目标状态用户模式
- 用户态是指用户程序运行时处理机所处的状态。处理机处于用户态时只能执行硬件机器指令的一个子集,即非特权指令。
特权指令和非特权指令
- 待权指令是只能在核心态下执行的指令,这些指令的执行不但能影响程序本身,还会影响其他程序甚至整个操作系统。例如:启动物理设备指令、设置时钟中断指令、控制中断屏蔽指令、存储保护指令等。
- 非待权指令是在核心态和用户态下都能执行的指令,这些指令的执行只与运行程序本身有关,不会影响其他程序。例如:数据传送指令、图形显示指令等。
- 操作系统能使用特权指令和非特权指令,用户程序只能使用非特权指令。若用户程序直接使用特权指令,可能引起系统冲突或由于某些意外造成系统错误,威胁系统安全
控制和状态寄存器
程序状态字(PSW)寄存器
程序状态字用来指示处理机状态、控制指令执行顺序并保留与运行程序有关的各种信息,其主要作用是实现程序状态的保护和恢复。每个正在执行的程序都有一个与其执行相关的程序状态字,处理机通过读取程序状态字知道当前处于用户态还是处于核心
程序状态字
程序计数器PC
- 程序计数器存放要执行的下一条指令的地址。它可指出内存的任一地址,其宽度与内存的单元个数相对应,通常与内存的地址寄存器位数相等。
- 在程序执行过程中,CPU将自动修改PC的内容,顺序执行时为PC+1。程序跳转执行时,PC将被置入跳转执行所含的转移地址,使其保持的总是将要执行的下一条指令的地址,从而使程序能连续自动地执行下去,直至结束。
中断和异常
中断
- 现代计算机都配置了硬件中断装置,他们是计算机系统的重要组成部分。
- 中断指计算机系统为应对突发事件而采取的处理措施
- 在进程执行过程中,若遇到某个突发事件,处理机及时利用设定好的中断机制中断当前真正执行的进程,保存好中断现场,继续执行中断进程
- 当中断处理完后,恢复进程的中断现场,继续中断进程。
如,某进程从磁带读入一组信息,读入信息有误时,产生数据错误中断,操作系统暂停当前工作,组织磁盘退回,重读该组信息。这可解决错误,得到正确磁盘信息。
- 中断给操作系统设计带来许多好处,首先使得实时处理许多紧急事件成为可能;再者,中断可以增加处理及的执行效率;另外,中断还可以简化操作系统的程序设计。
异常
异常是由cpu执行指令的某种特殊结果而引发的中断
中断和异常比较必有一下明显特征:
- 异常由cpu内部产生,在单处理机的计算机系统中不会同时发生多个异常。
- 除页面例外和硬件异常之处,通常不会发生异常的嵌套,即不会在执行异常处理程序的过程中又发生新的异常。
- 异常不能被屏蔽。异常必须被及时处理,否则无法继续正常运行。
疑问1:这里的异常与程序设计中的异常有何异同,程序抛出异常可以正常运行
地址映射机构
- 用户程序多由高级语言编写,程序中的地址一般从0开始。由于程序中的地址不是内存实际地址,程序不能被处理及直接执行。
- 用户程序需要线通过编译程序编译或汇编程序汇编后获得目标程序,目标程序中的地址也不是内存实际地址,通常被称为逻辑地址。逻辑地址的集合称为该用户程序的逻辑地址空间,逻辑地址空间可是从0开始排序的一维地址,也可是二维地址。
- 当程序运行时被装入内存,程序和数据的内存地址一般不与原来的逻辑地址一致,在多道程序系统中,内存中同时存放多个程序,每个程序在内存中的存放位置是随机的,且可以更改。
- 操作系统通常是要使用硬件系统中的地址映射机构进行地址变换,保证用户程序放入内存后仍能正确找到并执行完毕。
通道与DMA控制器
为把CPU从繁琐的I/0操作中解脱出来,增加CPU与I/0设备、I/0设备与I/0设备之间的并行程度,一般采取的方法是利用硬件系统提供的DMA( Direct Memory Access直接内存访问)控制器或通道专门负责I/0设备操作,CPU只发送I/0指令。在I/0设备工作期间,CPU可去做其他工作。I/设备在DMA控制器或通道的控制下进行I/0操作,只在I/0操作结束后或出现异常时才向CPU发出中断请求,否则I/0设备和CPU并行工作,两者的利用率都得到了极大提高。
通道
通道是专门负责I/O操作的处理及,具有自己的简单指令系统,但一般没有自己的内存,通常和cpu共用系统内存。通道可执行由通道指令组成的通道程序,控制I.O设备和内存之间一次传递一组数据块,传递期间不需cpu干预,DMA控制器与通道类似,但功能相对简单一些,没有自己专用的指令系统,一次只能控制I/O设备和内存之间传输一个数据块。
陷入
- 陷入(Trap)指cpu指向性一条实现系统调用的 陷入指令或执行指令时出现异常情况,如是算术溢出等系统中断当前进程的执行,去执行相应的陷入处理程序或异常处理程序。
- 陷入指令是为了实现用户程序调用系统内核程序。用户或者系统实用程序在cpu上执行时,如想请求操作系统为其提供某种服务,可安排其执行一条陷入指令,陷入的处理一般依赖于当前进程的执行现场,且陷入不能被屏蔽一旦出现陷入,立即处理。陷入指令是一种特殊的程序调用,其特殊之处在于处理及状态从用户态变成核心态
与其他系统软件关系
- 系统软件直接服务于计算机系统,通常由计算机厂商或专业软件开发商提供。它包含指导计算机基本操作的程序,如屏幕显示程序、磁盘存储程序、向打印机发送数据程序、解释用户命令程序以及和外围设备通讯程序等。系统软件使用户更加方便地操作操作系统,控制系统资源按照操作系统的要求运行。
- 操作系统是直接与硬件相邻的第一层软件,它由大量系统程序和众多数据结构集成。操作系统不但控制和管理着其他各种系统软件,而且与其他系统软件共同支撑用户程序的运行,操作系统是在系统中永久运行的超级系统软件。
- 操作系统虽是一种系统软件.但它是系统软件中的系统软件。没有它的支持,其他系统软件都不能运行。同时,操作系统的功能设计也受其他系统软件功能强弱和完备与否的影响,没有完备的系统软件与应用软件的支持,操作系统也不会得到广大用户的认可。
第二章 Linux
linux概述
Linux操作系统是种曲型克降UINIX操作但严格来说统的Linux是有别于UNIX的地得益于因特网的流行种新的操作系统Linux的兴起极大加上其免费下载、开放源代码的特点在不到3年的时间里得到
Linux已不断向高端发展,开始进入越来越多的计算机领域
- 服务器领域
- 桌面领域
- 网络设备领域
- 嵌入式系统领域
Linux操作系统在很短的时间内得到迅猛的发展,这与其具有的良好特性是分不开的。
- 开放性、兼容性好。
- 多用户、多任务,系统运行效率高。
- 提供了丰富的网络功能,具有网络优势。
- 可靠的系统安全性。
- 出色的稳定性和高速运算性。
- 良好的用户界面,方便用户使用。
- 较好的程序兼容性。
- GNU软件的支持。
linux内核设计
- Linux是一个用C语言编写、符合POSIX标准的类UNIX操作系统。Linux“内核”实际上是一个提供硬件抽象、文件(磁盘)系统控制、多任务并发执行等功能的系统软件。
严格意义上讲,内核不是完整的操作系统,一套基于Linux内核的完整操作系统才叫Linux操作系统,或GNU/Linux。 - 一般来讲,Linux体系结构可分为五个子系统:CPU和进程管理、存储管理、虚拟文件系统、设备管理和驱动和网络通信。
- 网络接口(NET)提供了对各种网络标准协议的存取以及对各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议。网络驱动程序部分负责与硬件设备进行通信,每一种网络硬件设备都有相应的网络设备驱动程序。
Linux启动和初始化过程
- Linux操作系统可在多种硬件平台上运行,如80x86CPU系列(80386以上)、SUNsparc64、ARM26等。为了使Linux具有良好的可移植性,Linux 内核针对不同的硬件平台,开发了不同的启动程序和初始化程序。这些程序处于arch/子目录中,用户可根据自己的需求修改内核代码,并能即时编译,形成满足自己要求的内核。这也是Linux 操作系统广受欢迎的主要原因之一。
- Linux 操作系统的启动过程主要包括:BIOS(基本输入输出程序,完成机器自检等步骤后将主控权交给引导程序)自检、GRUB引导、加载Linux内核、执行/sbin/init和执行脚本等。启动过程中的第一个步骤BIOS自检是任何一个操作系统启动必须经历的过程,也是计算机启动时必要的自我检查过程。
Linux 系统调用介绍
Linux系统类似于UNIX操作系统,它通过在内核设置一组实现系统功能的子程序来实现系统调用。系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于核心态下。Linux的系统调用技术保证了内核安全,用户进程不能随意拦截、修改系统调用。
在Linux系统中,程序的运行空间分为内核空间和用户空间,也常称为核心态和用户态。
- Linux提供两种运行模式:内核模式和用户模式。
Linux中的系统调用都以sys开头,如sys_mkdir()。它们通过int ox80来完成从用户态切换到核心态,进入特权级执行。int ox80会使执行跳转到系统调用在内核中定义的入口地址。这个位置叫做System_call,它是唯一确定的,且只可被用户进程读操作,不可进行写操作。进程通过查找系统调用表system call table,从中找到希望调用的内核函数的地址,调用此函数。除了系统调用号以外,天部分系统调用都还需要一些外部的参数输人。
Red Hat Linux-2.4.20版中共有258个系统调用,大体上分为进程控制、文件系统控制、文件系统操作、系统控制、内存管理、网络管理、socket控制、用户管理、进程通信管理等几方面。例如,系统调用open()在内核里面的入口函数是sys_open,其定义是
1
2
3static inline long open(const char*name,int mode,int flags){
return sys_open(name,mode,flags);
}
第三章 进程、线程管理
章节前导
前趋图
程序的特点
- 顺序性:处理机的操作严格按规定顺序执行
- 封闭性:程序执行时,独占系统资源
- 可再现性:当初始条件相同时,程序多次执行的结果相同
程序的并发执行
程序的并发执行
程序的并发执行的特点
- 间断性:程序在并发执行时,形成了相互制约关系。相互制约将导致并发程序具有“执行一暂停一执行”这种间断性的活动规律
- 失去封闭性:系统中的资源供多个程序共享,致使程特点并的运行失去了封困性。
- 失去可再现性:由于失去了封闭性,导致其失去可再现性。即使初始条件相同,程序多次执行的结果也可能不同。
- 相互作用的制约性:并发执行程序既有相互独立的一面,表现为每个程序为用户提供特定的功能,它们之间相互独立;也有时也会直接或间接制约的一面。
程序并发执行的条件Bernstein
通过Bernstein条件 即可判断两个进程是否可并发执行且具有可再现性
进程的基本概念
程序执行过程
程序执行过程
- 进程的执行方式
- 顺序执行
- 并发执行
- 进程的执行方式
并发执行提高了系统资源的利用率和系统作业吞吐量,同时也给程序执行带来了许多新问题。
进程的定义和特征
- 为何引入进程清晰刻画系统的内在活动规律,有效调度和管理进入内存的程序。
- 从程序并发执行角度和系统资源共享角度分析一下引入进程的必要性。
- 程序并发执行角度
- 系统资源共享角度
进程的定义
- 进程是一个可并发执行的具有独立功能的程序在某个数据集合的一次执行过程,它也是操作系统进行资源分配和保护的基本单位。
- 为了更好的描述和管理并发执行的多个进程,操作系统中为每个进程配置了一个进程控制块PCB(Process Control Block)。
进程的构成
进程的上下文
- 进程的物理实体和支持进程运行的环境合称为进程上下文(Process Context)。进程在进程上下文中执行。进程上下文包括用户级上下文、系统级上下文和寄存器上下文。
- 当一个进程被系统调度而占用处理机时,发生进程切换,切换的内容主要是进程
进程的特征
进程具有如下特征。
- 动态性
- 共享性
- 并发性
- 独立性
- 异步性
进程和程序的区别
- 进程和程序的最大区别就是进程是程序的一次执行过程,它是一个动态概念。程序是一个静态概念。
- 进程能够并发执行。在同一段时间内,并发执行的若干进程共享一个处理机。
- 进程是计算机系统资源分配的基本单位,程序不能作为一个独立单位运行和申请系统资源。
- 进程由含有代码和数据的用户地址空间、进程控制块和执行栈区等部分组成,而程序只由静态代码组成。
- 进程和程序之间是多对多的关系。一个程序可被多个进程共用,一个进程在其活动中又可调用若干个程序。
进程与程序的关系
可并发执行的程序在一个数据集合上的执行过程
进程 | 程序 |
---|---|
动态的 | 静态的 |
并发的 | 顺序 |
暂时的 | 永久的 |
数据结构=程序+数据+pcb | |
程序与进程不是一一对应的关系 |
进程状态和进程转换
Q1.在一个只有单处理机(不考虑多核)的操作系统中,进程有运行、就绪、阻塞三个基本状态。假如某时刻该系统中有10个进程并发执行,且CPU为非核心态情况下,试问:这时刻系统中处于运行状态的进程数最多有几个?
1
Q2.在一个只有单处理机(不考虑多核)的操作系统中,进程有运行、就绪、阻塞三个基本状态。假如某时刻该系统中有10个进程并发执行,且CPU为非核心态情况下,试问:这时刻系统中处于运行状态的进程数最少有几个?
0
Q3.在一个只有单处理机(不考虑多核)的操作系统中,进程有运行、就绪、阻塞三个基本状态。假如某时刻该系统中有10个进程并发执行,且CPU为非核心态情况下,试问:这时刻系统中处于就绪状态的进程数最多有几个?
9
Q4.在一个只有单处理机(不考虑多核)的操作系统中,进程有运行、就绪、阻塞三个基本状态。假如某时刻该系统中有10个进程并发执行,且CPU为非核心态情况下,试问:这时刻系统中处于就绪状态的进程数最少有几个?
0
创建状态和终止状态
阻塞:等待执行条件发生
挂起
挂起:将程序从内存置换为外存
进程控制块及其组织方式
进程控制块的作用
- 进程控制块的作用
- PCB是操作系统为了描述和管理进程而定义的数据结构,PCB中记录了进程当前情况以及管理进程所需的全部信息,是操作系统中最重要的数据结构之一。
进程控制块的具体作用如下:
- PCB是进程在系统中存在的唯一标识。
- 保存CPU现场信息。
- 提供进程管理所需信息。
- 提供进程调度所需信息。
- 实现与其它进程的同步和通信。
进程控制块的信息
进程控制块的组织方式
常用的pcb组织方式有三种
OS中处处体现空间换时间、时间换空间
Q5.在一个只有单处理机(不考虑多核)的操作系统中,进程有运行、就绪、阻塞三个基本状态。假如某时刻该系统中有10个进程并发执行,且CPU为非核心态情况下,试问:这时刻系统中处于阻塞状态的进程数最多有几个?最少有几个?
10 0
进程控制
进程的“一生”由创建而产生、由调度而执行、由撤销而消亡。
操作系统要有对进程生命周期中各个环节进行控制的功能。
进程控制的主要职责:- 对系统中的全部进程实施有效地管理,其功能主要包括:
- 进程的创建、进程的执行、进程的撤销、进程的阻塞、进程的唤醒、进程状态的转换等。
- 对系统中的全部进程实施有效地管理,其功能主要包括:
进程控制一般由操作系统内核实现。
原语及其特点
- 操作系统的进程控制功能通常是通过执行各种原语来实现的。
- 定义:原语是由若干条机器指令组成的、用于完成一定功能的一个过程。
- 原语具有不可分割性,其执行期间不允许被中断,要么从头到尾执行一遍,要么全不执行。该特性保证原语在执行期间不允许外界因素影响。
- 原语常见的实现方法是以系统调用的方式提供原语接口,原语在执行过程中采用屏蔽中断的方式来保证其不能被中断。
常见原语
- 创建原语
- 撤销原语
- 阻塞原语
- 唤醒原语
- 激活原语
进程的创建
创建进程采用——创建原语。
进程之间形成进程家族树,子进程继承父进程拥有的资源。
引起进程创建的事件
- 用户登录、系统初始化
- 新作业进入系统(作业调度)
- 提供服务
- 应用请求
创建原语要做的工作
申请空白PCB
为进程分配资源可
初始化PCB
- 初始化进程描述信息
- 初始化处理机状态信息
- 初始化进程控制信息
将新进程插入就绪队列
系统为每个进程提供了一个pcb,首先为进程分配资源,然后进行初始化pcb,最后将新进程插入就绪队列
进程的局限性
- 每个进程都有一个进程控制块和一个私有的用户地址空间,如果按进程进行并发控制,那么在同一个地址空间中只允许单个执行序列运行。
- 一个进程内部只有一个执行序列,不能满足用户让一个进程内部并发执行多个任务的要求。
- 进程在处理机上的频繁切换给系统造成大量时空开销,这限制了系统中并发执行进程的数目,降低了系统并发执行程序。
- 进程通信代价大。进程间传递信息时,要把消息从一个进程的工作区传送到另一个进程的工作区,这需要操作系统提供进程通信机制并且给编程者带来负担。
- 不适合并行计算和分布并行计算的要求。
线程
线程及其属性
线程通常被描述为:
线程是进程内的一个执行单元。
线程是进程内的一个可调度实体。
线程是进程中相对独立的一个控制流序列
线程是进程中的一个实体,是系统独立调度和分派的基本单位
进程与线程的关系
线程具有下述属性
①轻型实体。线程除了运行中必不可少的资源(如线程控制块、用户栈、核心栈、静态局部变量)外,基本上不拥有系统资源。
②独立调度单位。线程是能独立运行的基本单位,因而也是独立调度单位。
为此,线程中必须包含调度所必需的信息。
③可并发执行。同一个进程中的多个线程、以及不同进程中的多个线程均可以并发执行。
④共享进程资源。同一个进程中的各线程共享该进程所拥有的全部资源,如进程的地址空间、己打开的文件、定时器和信号量机构等
进程和线程的比较
调度:线程调度快,需要的空间小;进程因拥有资源,调度时因负担过重而缓慢
并发性:在引入线程的操作系统中,不仅进程之间可以并发执行,一个进程中的多个线程之间亦可并发执行。
拥有资源:进程是资源的拥有者。
系统开销:进程切换的开销远远大于线程切换的开销,线程的切换省去了资源的回收。
线程状态与控制
线程是进程的一个执行体,是系统进行调度的独立单位,它本身是一个动态过程。因此,线程也就有生命周期,即由创建而产生,由调度而执行,由撤销而消亡。
每个线程被创建后,便可与其他线程一起并发地运行。并发运行的线程间也存在着共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。
与进程类似,线程具有就绪、执行和阻塞三种基本状态,线程随着自身运行和外界环境的变换而不断的在三种状态之间转换。
线程执行完后正常终止,也可能因出现错误或其他某种原因而被强行终止。
程与内核级线程的比较
调度与切换速度;用户级线程的切换,因发生在一个应用进程之间,因此不仅无须通过中断进入OS内核,而且切换的规则也比较简单。 用户级线程比内核级线程切换速度块。
系统调用:用户级线程在调用系统调用时,系统将看成是其所在进程的行为。而内核级线程的系统调用是以线程为单位。用户级线程不如内核级线程。用户级线程不如内核线程合理。
用户级线程状态与进程状态的关系
线程的实现
线程已经在许多系统中实现,但各个系统的实现方式各有不同。
分类:内核级线程和用户级线程
多线程模型
Linux进程管理概述
进程及其进程控制块
Linux中的进程可以分为三种类型:
(1)交互式进程。由shell控制运行,既可以在前台运行,也可以在后台运行。
(2)批处理进程。运行于后台,不属于某个终端。先被提交到一个队列,以便顺序执行。
(3)守护进程。只有在需要时才被唤醒执行,且在后台运行。
linux中的pcb
task_struct结构的组成王要包含以下几个部分:
-进程状态信息
-进程标示信息
-进程调度信息
-进程通信信息
-进程链接信息
-时间和定时器信息
-打开的文件以及文件系统信息
-内存管理信息
-处理器信息
进程的创建
- fork系统调用用于从已存在进程中创建一个新进程,新进程称为子进程,而原进程称为父讲程。fork调用一次,返回两次,在父进程中的返向值是字进程的进程号,在子程中的返回值则返回0。因此,可以通过返回值来判定该进程是交进程还是子程。
- 假设id=fork(),父进程进行fork系统调用时,fork所做工作如下。
①为新进程分配task_struct任务结构体内存空间。
②把父进程task_struct任务结构体复制到子进程task_struct任务结构体。
③为新进程在其内存上建立内核堆栈。
④对子进程task_struct任务结构体中部分变量进行初始化设置。
⑤把父进程的有关信息复制给子进程,建立共享关系。
⑥把子进程加入到可运行队列中。
⑦结束fork()函数,返回子进程ID值给父进程中栈段变量id。
③当子进程开始运行时,操作系统返回0给子进程中的栈段变量id。
进程的撤销
1 |
|
linux中的线程
早期的Linux版本不支持线程,只提供传统的fork()系统调用,用来产生一个新的进程。随着内核版本的更新,内核中开始加入了新的系统调用vfork()和clone()。Linux2.4.0已经能够支持POSIX标准线程。
Linux支持内核级的多线程。Linux将线程定义为“执行上下文”,是进程上下文的一部分。Linux可以通过复制(clone)当前进程的属性创建一个子进程,子进程可以共享父进程的文件、信号处理程序和虚拟内存等资源。
当子进程共享父进程的虚拟内存空间时,该子进程就是一个线程。
Linux系统中创建线程与创建进程不同的是,除了task_struct和系统空间堆栈以外的全部或部分资源通过数据结构指针的复制“遗传”。新创建的线程共享父进程的存储空间、文件描述符和软中断处理程序。
Linux在调度上不区分进程和线程。但线程切换时的“执行上下文”比进程切换时的“执行上下文”要少很多信息,只包含少量寄存器的内容和属于线程自身的堆栈指针等。
严格意义上讲,Linux内核的调度单位仍然是进程,在此基础上进行线程切换执行,从而提高系统并发度和系统资源使用效率。
第四章进程同步与通信
在多道程序环境下,操作系统必须采取相应措施处理好进程之间的制约关系。
进程同步的主要任务是对多个有制约关系的进程在执行次序上进行协调,以使并发进程间能有效的,安全的相互合作和共享系统资源。
进程同步的两种协调方式
同步 | 互斥 |
---|---|
进程与进程之间有序合作 | 进程与进程之间共享临界资源 |
相互清楚对方的存在及其作用,直接合作 | 不清楚对方的情况,只是共享同一临界资源 |
多个进程合作完成一个任务 | 各个进程之间没有任何合作工作 |
例如发生消息进程和接受消息进程之间:输入进程。计算进程和输出进程之间等 | 例如共享打印机的若干进程之间:共享同一全局变量的若干进程之间等。 |
临界资源与临界区
临界资源也称独占资源、互斥资源,它是指在一段时间内只允许一个进程使用的资源。临界资源的使用只能采用互斥方式。
各个进程中访问临界资源的,必须互斥执行的程序代码段称为临界区。
同步机制应遵循的准则
D
C
实现临界区互斥的基本方法
(1)软件实现方法:常见的软件实现方法有:Dekker算法和Peterson算法
(2)硬件实现方法:①中断禁用②专用机器指令。
实现临界区互斥的基本方法
硬件实现方法
①中断禁用保证多个并发进程互斥使用临界资源,只需保证一个进程在执行临界区代码时不被中断即可,这可通过系统内核为启用和禁用中断而定义的原语来实现。
②专用机器指令编程人员利用专用机器指令来实现临界区的互斥使用。在临界区代码前通过硬件指令来检查某一全局变量是否有其他并发执行的进程在临界区中使用。若没有,则可进入临界区;若有,则重复检查,处于“忙等”状态。当进程执行完临界区代码退出时,修改该全局变量,允许其他并发执行的进程进入临界区执行
信号量的物理意义
信号量的物理意义从资源的观点看信号量的意义:
s.value的初值表示系统中某种资源数目。
wait(s)表示要申请一个资源。(P操作)osignal(s)表示要释放一个资源。(V操作)os.value>0时,s.value的值表示可用的共享资源的数量。
s.value<0时,|s.valuel表示等待队列中进程数。(等待使用资源的进程数)
信号量机制的本质与线程浅谈
信号量机制
- 首先 信号量机制是一种进程通信、同步的工具 可以用来解决互斥进程以及同步进程问题
- 互斥进程的概念(不能让多个进程访问同一块变量,这些进程为互斥进程):
- 可能造成的问题:多个进程,同时访问同一块变量,可能会造成内存泄漏,例如 a进程删除这块内存中的某个数据,b进程修改这块内存中的这个数据。
- 进程同步的概念(a进程需要以b进程的结果为前提才能继续运算)
- 同时运行多个进程时 若进程没有输入 则可能会造成cpu死锁
- 互斥进程的概念(不能让多个进程访问同一块变量,这些进程为互斥进程):
为解决上述同步互斥问题,引入了信号量机制
一个进程在收到指定信号前,会被迫在一个确定的或者需要的地方阻塞,从而保持进程的同步或者互斥
当信号量<=0时将进程阻塞
常见的信号量有两种数据结构
- 整形信号量:一个表示资源数目的整形变量s
- 记录型信号量:在整形信号量的基础上增加了一个数组 存放了不能访问同一资源而阻塞的各个进程
P操作:对信号量进行减一
V操作:对信号量进行加一
信号量的本质是一个静态变量
如何利用信号量机制解决线程互斥问题
互斥问题:避免同时操作内存时造成泄露
那么就需要在资源被占用时 让其他进程阻塞,从而保护被占用的资源
因此这里规定,信号量 mutex 用0表示临界资源被占用,信号量用1表示未被占用;互斥中,信号量默认为1,当信号量<=0时将进程阻塞
因此当进程互斥时,首先申请一块内存,然后使用,最后释放这块内存,当a进程申请了这块内存之后,b进程即处于阻塞状态,当a进程释放了这块内存,b进程申请完成进入使用;
具体流程:
- p(mutex)
- 进入临界区
- v(mutex)
其中 申请与释放的本质 就是对信号量这一静态变量进行修改,然后通过判断这个静态变量的值,来判断进程是否执行=
线程互斥问题解决的本质
首先信号量默认为1 所以当a程序申请变量时,首先会对信号量进行p操作即1-1 得到0 然后返回mutex<=0的值,为真时即成功申请到了内存,若为假则进入阻塞,等待io
当内存使用完毕后,使用v操作进行内存释放,实际上是将信号量初始化为1,因为1表示内存未被占用,即0+1=1
因此在解决互斥问题时 可以笼统的认为 p操作是申请一块内存,v操作是释放内存,而使用完内存后必须手动释放!
此时,无论进程谁先谁后,只要拿到了内存即可进行资源的读写,其他没拿到内存的进程只能等待内存释放,这就是线程锁的概念
信号量解决同步问题
同步问题:进程并发执行
在互斥问题中,我们将信号量的默认值设置为1,但在进程同步问题中,我们将信号量的默认值设置为0
此时若执行p操作 将会直接通过,于是我们将阻塞的判断条件修改为 s<0,也就是说,当信号量<0时,将进程阻塞
解决同步问题的本质
a,b进程并发执行时
b进程需要a的输入值。那么b操作会申请一块变量(信号量)由a进程控制的内存,若信号量执行p操作后小于0 那么意味着该进程需要等待,即进入阻塞状态
a进程拿到b进程需要的输入后,a进程对这块内存进行释放即修改变量(信号量+1)将信号量的值从0推进至1,处于阻塞状态的b进程的p操作(信号量-1)执行后检测到信号量值为0 已不满足信号量<0 的条件 即将进程唤醒,继续执行
因此 可以简单的认为在解决同步问题时
从内存占用的角度上来讲:
p操作是申请内存,信号量的初值是1 将其减1 若信号量<0则阻塞 >0则唤醒
v操作是释放内存,将信号量+1 恢复初值
从通信的角度来讲:
p操作是以信号量为标志发送一个等待输入的信号通知另一个进程,从而阻塞当前进程
v操作是以信号量为标志发送一个已拿到需要输入的值的信号回复那个进程,从而唤醒那个进程
我个人更倾向于内存角度,首先信号量的本质就是静态变量。不管是同步还是互斥。从物理层面上来说都是在改变信号量的基础上完成的,抽象的认为是对内存的锁定与解锁会更贴近编程思想,所以从内存占用上来说会更好一些。