《现代操作系统》阅读笔记

  • 分享一些初次阅读时的记录,本文原是导图,我直接粘在了这 可读性一般,需要导图的朋友可以私,希望可以帮到大家快速搭起这本书的知识结构。
现代操作系统
	####引论
		**引**
			计算机
				硬件
				软件
					内核态:操作系统
					用户态
						应用程序
						用户接口程序:shell、GUI
			操作系统具有对硬件的完全访问权限,由硬件进行保护,防止用户修改



		**什么是操作系统**
			作用
				自顶:为应用程序提供资源集的清晰抽象
				自底:管理硬件资源,对资源请求进行分配,调节不同程序间冲突的资源请求。
			资源管理上实现多路复用资源
				时间上复用
				空间上复用



		**操作系统历史**


		**计算机的简单抽象模型:一条系统总线连接各部件进行通信**
			处理器
				包含
					保存关键变量(0)和临时数据的通用寄存器,加快访存速度
					专用寄存器:PC存放下一条要执行的指令地址
					堆栈指针寄存器:指向内存中当先栈的顶端,栈帧包含了每个执行过程的输入参数、局部变量、没有保存在寄存器中的临时变量
					程序状态字寄存器
						每个执行的程序都有对应的PSW,每个处理器都设置一个程寄  程序占有处则PSW占有寄
						程序状态字PSW
							存放
								体现当前指令执行结果的状态信息:有无借位进位、有无溢出、结果正负。。
								存放控制信息:允许中断、跟踪标志、方向标志
							作用
								用于系统态、用户态之间转换
									用户使用TRAP指令,计算机实际通过陷阱实现系统调用,从用户态切换到内核态
								程序状态字用来指示处理器状态,控制指令的执行顺序并且保留和指示与运行程序有关信息、实现程序状态的保护恢复(实现时间多路复用)
				提高性能
					流水线
						机制原理:一个CPU有单独的取指、解码、执行单元,在多级流水时就可以不断使用某个单元
					超标量CPU
						有多个执行单元,解码后的指令放到保持缓冲区中等待空闲的执行单元
					多线程
			存储器
				位于CPU中的寄存器
				高速缓存
					高速缓存命中
					不中则通过总线访问内存
				主存:随机访问存储器RAM
				磁盘
				其它:ROM、闪存(胶卷、固态硬盘)、虚拟内存
			磁盘
			I/O设备
				包含
					为操作系统提供接口的设备控制器
					设备
				实现IO方式
					忙等待
					中断
					直接存储器访问
			总线
			启动计算机:BIOS



		**操作系统大观园**



		**操作系统概念:进程、地址空间、文件、I/O(输入输出)、保护、shell.**
			进程
			地址空间
			文件
			I/O
			保护



		**系统调用**
			read方法过程
			POSIX系统调用
			
		**操作系统结构**
			单体系统
			层次式系统
			微内核
			客户端-服务器模式
			虚拟机
		**操作系统通常是C编写的**



	####进程与线程
		**进程(对运行程序的抽象)**
			进程模型
				进程将相关的资源集中在一起,有存放程序正文、数据、打开的文件、子进程、即将发生定时器、信号处理程序等的地址空间
				进程就是一个执行着的程序的抽象,进程拥有一个执行的线程,线程包括PC、寄存器(保存线程当前工作量)、记录执行的堆栈等;单个CPU是伪并发的使进程来回切换
			进程的创建
				四种主要事件
					系统初始化
						用户交互的前台程序
						后台的守护程序如打印、邮件
					正在运行的程序执行了创建进程的系统调用
					交互式系统中用户点击请求创建一个进程
					大型机中的批处理作业的初始化
			进程的终止
				自愿
					正常退出
						exit
					出错退出
						cc foo.c 编译不存在的程序,系统发现了错误终止了编译器
				非自愿
					严重错误
						非法指令、应用不存在的内存等程序错误
					被其他进程杀死
			进程的层次结构
				UNIX:一个父进程与多个子进程保持联系
				Windows:进程间地位相等,但父进程有一个可以控制子进程的句柄,句柄可传递
			进程的状态
				就绪,等待被调度进入CPU
				运行,占用CPU
				阻塞,等待外部事件
			进程的实现
				操作系统通过进程表实现进程模型,每个进程占用一个进程表项
					进程表项
				中断的处理调度过程(保证进程切换)
					保存寄存器值
					中断
					调度,运行新进程
			多道程序的设计模型
				CPU利用率=1-p^n
					p=进程等待IO操作事件/进程在内存中的事件
					n=程序数量



		**线程(每个进程都有一个地址空间和在这个空间中准并行运行的多个控制线程)**
			线程的使用
				需要多线程原因
					应用中发生的多种活动中某些会被阻塞,将应用分解成准并行的多个线程,程序模型会更简单
						简单在不必考虑中断(字处理时单线程需要引入中断)、定时器、上下文切换
						并行的线程共享同一个地址空间和所有可用数据的能力
					线程比进程更加轻量级,可更快的创建撤销
					多个线程不只是CPU密集型,还存在计算、IO等操作,就可以通过多级流水提高性能
				使用多线程的例子
					字处理软件
						多个线程分别负责用户交互、后台格式处理、磁盘备份等,他们共享公共内存对同一个文件处理(单线程需要在写入时中断备份就需要引入中断程序设计)
					Web服务器进程
						顺序线程
							单线程:阻塞系统调用、CPU空转
							多线程:并行、阻塞系统调用
								分派线程选择一个阻塞的工作线程在其字中写入消息指针,接着唤醒该线程;工作线程在高速缓存中检查、从磁盘调入read操作进入阻塞,直到找到页面返回客户端再进入阻塞。
						进一步提高性能
							有限状态机:并行、非阻塞的read系统调用、中断
								与多不同的:服务器记录当前状态后处理下一个事件,磁盘查找完成或者事件是磁盘回答就会发生中断
								常用来处理极大量数据
			线程模型
				从进程到线程
					进程用于将资源集中,线程是CPU上被执行的实体,所以说进程拥有一个执行的线程
					线程模型允许在一个进程环境中有多个线程并行运行,模拟了单CPU伪并行多个进程(共享物理内存、磁盘、打印机等资源),又被称为轻量级进程 共享同一个地址和资源(纳秒级的线程切换)
				进程和线程比较
					图a)的并发多线程也就是并发多进程
					b)多个线程是同一个地址空间共享同样全局变量,都可访问这个地址空间中的每一个内存地址,以及共享打开文件集、子进程、即定时器、信号处理程序、账户信息
					b)每个线程实际占用CPU,有自己的PC、寄存器、堆栈、状态
					同样具有运行、阻塞、就绪状态
				与线程状态相关的库函数
					create
					exit
					join 等待某线程退出
					yield 自动放弃CPU的使用(因为线程库无法中断线程)
			POSIX线程
				为了实现线程可移植,IEEE定义了线程标准,线程包pthread
					pthread_create _exit _join _yield
					pthread_att_init 创建并初始化一个线程的属性结构
					pthread_attr_destory 删除一个线程的属性结构
			在用户空间中实现线程
				把整个线程包放到用户空间中,内核对线程包一无所知仍单线程进程方式管理,可以用函数库实现线程
				优点
					用户级线程包可以在不支持线程的系统上实现
						函数库实现单进程的多线程
							每个进程都是执行的线程有其专用的线程表,表中记录各个线程的自身特别的属性如PC、堆栈指针、寄存器、状态等,运行在运行时系统的上层
							运行时系统是一个通过线程表管理线程的过程的集合
							某进程占有CPU,进程中某个线程状态转换需要存储重新启动该线程的信息,此时线程表存放的信息,与内核在进程表存放进程的信息完全一样
					线程切换不会陷入内核,不需要上下文切换,不需要对高速缓存刷新,使得线程调度非常快
						实现
							某线程进入阻塞,他调用一个运行时系统的过程查看是否进入必须阻塞
							是的话保存该线程寄存器,将就绪线程的值装入寄存器,堆栈指针和PC更换后就可以让新的线程运行,而不陷入内核
					允许进程有自己定制的调度算法
						例如有垃圾收集线程的程序不用担心不适时的中断
					具有较好的可扩展性
						内核空间中内核线程需要固定表格空间、堆栈空间
				缺点
					如何实现阻塞系统调用(类似:缺页中断)
						解决:包装器
					进程内的某个线程是没有时钟中断,所以不能通过轮流调度线程,除非该线程yield
			在内核中实现线程
				内核中有记录系统所有线程的线程表
					撤销线程时只是标记该线程为不可运行,减小创建时的代价(用户级线程直接销毁就欧克)
					创建线程会先重新启动一些旧线程
				优缺点
					不需要新的非阻塞系统调用,所有阻塞线程的调用都以系统调用的形式实现,即在线程阻塞时可以选择其他线程
					多线程进程创建新线程?接收信号?
			混合实现
				用户级线程和内核线程多路复用
			调度程序激活机制
				模拟内核线程的功能并提供用户线程才能实现的性能灵活性
				阻塞时不必请求内核而调用另一个线程,避免了用户空间、内核空间之间不必要的转换
				调用该机制,内核给每个进程安排一定数量的虚拟处理器,并让运行时系统将线程分配到处理器。此时虚拟处理器成了真正的CPU。
				上行机制  的工作思路:内核得知线程被阻塞,通知该进程的运行时系统并在堆栈中以参数形式传递有问题的线程编号和所发生事件的描述。
			弹出式线程
				为控制到达的消息而创建
			使单线程代码多线程化
				???



		**进程间通信 IPC**
			引言
				shell管道将一个进程的标准输出作为另一个进程的输入
				3个问题
					进程间如何传递
					确保多个进程在关键活动中不会出现交叉
					确保按正确的顺序进行
			竞争条件
				协作的进程共享公共的存储区
				Murphy法则,多个进程读写某些共享数据(中断导致出错),而最后的结果取决于进程运行时的精确时序
			临界区
				把对共享内存进行访问的程序片段称为临界区
				使这几个进程互斥而不能同时处于临界区,进而避免竞争条件
					任何两个进程不同时处于临界区
					与CPU的速度和数量无关
					临界区外的进程不得阻塞其他进程
					进程不能无限期等待进去临界区
			忙等待的互斥
				屏蔽中断
					对单处理器系统是有效的,多核 其它未执行disable指令的CPU仍可访问共享内存
					它更适用于操作系统内核,例如在更新变量或列表的指令期间
				锁变量
					设想的锁变量仍存在竞争 , 类实例?
				严格轮换法
					连续测试一个变量直到某个值出现,称为忙等待
					用于忙等待的锁称为自旋锁
					缺点:临界区内的进程阻塞了其他进程
				Peterson解法
					互斥算法由两个ANSI C编写的过程组成
						进程使用进程号调用enter_region使进程等待直到进入临界区
							等待是因为while(trun==process&& interstested[other]==TRUE);另一个进程不离开就会一直等待
							两进程几乎同时调用,turn被重新覆写成后者的号,则前者可跳过循环等待
								&&短路功能使得前者先进入临界区,相应后者只能等待
						完成对共享变量的操作调用leave_region离开临界区
				TSL指令:硬件支持方案
					TSL RX,LOCK 测试并加锁
						将内存字lock读到寄存器RX,该内存地址上存一个非零值
							读写不分割,锁住内存总线以禁止其它CPU在此指令结束前访问内存
						使用共享变量lock协调对共享内存的访问
							lock为0任何进程都可以使用TSL将其设置为1并读写共享内存;操作结束时使用move指令将lock值设置0
					替代指令XCHG
			睡眠与唤醒
				P、T不仅会忙等待,还会产生优先级反转问题
				进程间通信原语,使进程在无法进入临界区时阻塞而不是忙等待
					sleep:引起调用进程阻塞的系统调用
					wakeup:参数为唤醒的进程
					或:两方法各有一个参数,用于匹配sleep和wakeup的内存地址
				生产者-消费者问题(有界缓冲区问题)
					生产者进程、消费者进程共享一个缓冲区
					设置变量count跟踪缓冲区数据项,生、消先检查count
						执行
						睡眠,之后符合时再被唤醒
					count存在竞争条件
						产生
							消费者检测count为0,被中断
							生产者添加数据项,count+1,并调用wakeup试图唤醒消费者
							消费者并未睡眠丢失wakeup信号,再次运行由于之前读到0,开始睡眠
							后续生产者不再唤醒只是添加数据项直到缓冲区满,进入睡眠
						解决:唤醒等待位
							wakeup发送给一个未睡眠的消费者时,将该位置1
							当要睡眠时,如果是1则将该位清除并保持清醒
			信号量
				用来统计唤醒次数的整型变量
				操作
					down:检查信号量大于0则减一,等于0则进程睡眠,此时down操作未结束(获取对该信号量的互斥访问权!!!)
					up:信号量增1,如果睡眠进程up操作信号量后则唤醒,但仍然是0
					检查数值、修改变量值以及可能发生的睡眠操作是不可分割的原子操作(同样up的检查增加唤醒也是),保证在信号量操作完成或阻塞前不允许其他进程访问,用于解决同步、竞争条件
				信号量解决生-消问题  P74图2-28
					将up、down作为系统调用,其原子性保证信号量正常工作,检、更、睡等操作时屏蔽中断保证原子性,多CPU采用TSL
					使用三个信号量
						full 记录充满的缓冲槽数目,初值0
						empty 记录空的缓冲槽数目,初值为缓冲区中槽的数目
							full、empty保证某种事件的顺序发生或不发生
						mutex 初值为1,确保生产者、消费者不同时访问缓冲区,又称为二元信号量
							进去临界区(down(&mutex))前执行一个down,退出执行up,实现互斥
				实现同步
				信号量为0,隐藏中断
			互斥量
				信号量的简化:没有计数功能。处于解锁、加锁两态之一
					0表示解锁
					其它值表示加锁
					指令是由TSL实现的
				使用过程
					mutex_lock
						线程进入临界区前调用此,如果互斥量是解锁的则线程可以自由进入临界区
						若互斥量加锁,调用指令的线程被阻塞直到临界区中的线程调用mutex_ulock
						多个线程阻塞将随机选取一个允许获得锁??
					mutex_unlock
						将互斥量置0,解锁
				metux_lock与metux_region区别
					region进入临界区失败会重复测试进入忙等待状态,时钟超时停止占CPU时间过长的线程并释放锁;而在用户线程中,没有时钟停止,通过忙等待试图获得锁的线程将一直循环
					lock 在用户线程获取锁失败时会让占据CPU的线程调用thread_yield,没有了忙等待
						yield不涉及内核,可以实现在用户空间的同步??
				用户级线程包多线程在同一地址操作所以可访问同一个互斥量,但在P算法、信号量、公告缓冲区中多线程应访问一些共享内存。 如何共享?
					信号量存放在内核通过系统调用来访问
					进程与其他进程共享其部分地址空间、缓冲区、数据结构,甚至是共享文件
				快速用户区互斥量futex
				pthread中的互斥量
			管程
				一个由过程、变量及数据结构等组成的集合,任意时刻管程中只能有一个活跃进程。
			消息传递
			屏障
			避免锁:读-复制-更新



		**调度**
			简介
				多个进程同时竞争CPU,应该选择哪一个进程执行,这就由操作系统的 调度程序完成,它内部实现了调度算法。
				进程切换
					用户态切换到内核态,需要保存当前进程在PCB(进程控制块)的执行上下文(寄存器、数据、打开资源文件等),然后通过调度算法恢复下一个进程的上下文。还要使整个内存高速缓存失效,强迫缓存从内存中动态装入两次
				进程行为
					计算密集型
					I/O密集型
				何时调度
					创建新进程后决定运行父、子进程
					进程退出时
					进程阻塞在IO和信号量上或其他原因阻塞
					IO发生中断
						发生在IO设备
							输入完成发生中断,原先阻塞在io的进程就可以取得数据就绪
				调度算法分类
					按如何处理周期性时钟中断
						非抢占式
							调度算法选择一个进程运行至被阻塞或CPU释放
						抢占式
							挑选一个进程运行固定时间段的最大值,最晚在该时段结束时被挂起;然后选择另一个进程进行抢占式调度处理。在时间间隔末端发生时钟中断把CPU控制交给调度程序
					按环境
						批处理
							非、长时间周期的抢断算法通过减少进程切换改善性能
						交互式
							抢占,服务于多个突发
						实时
							运行推进现有应用的程序
				调度算法目标
			批处理系统中的调度
				先来先服务
					非抢占式的调度算法,就绪进程放在一个单链表中,按照请求的顺序进行调度
					优点便于理解运行,利于长时间作业的进程
					缺点不利于短时间作业,因为要长时间等待,尤其不利于短时间的多次作业  解决就是让它抢占
				最短作业优先
					非抢占式的调度算法,按估计运行时间最短的顺序进行调度
					缺点:长时间作业可能会一直等待
				最短剩余时间优先
					抢占式的最短作业优先,按剩余运行时间的顺序进行调度
					使新的短业务获得良好的服务
			交互式系统中的调度
				轮转调度
					按先来先服务原则将就绪进程排成队列,调度程序维护这个进程列表。为每个进程分配时间片,时间片内可运行(未运行完会强制暂时结束保存到队尾)或提前结束or阻塞(立即发生进程切换)
					进程切换(上下文切换)会进行管理事务处理——保存装入寄存器值及内存映像,更新表格列表、清除和重新调入内存高速缓存等
					效率和时间片的大小关系
						进程切换要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间   P89最后浪费1%???
						时间片长于CPU突发时间会减少抢占改善性能,在时间片结束前完成阻塞引起进程切换;太长使一些短的交互请求响应时间变长,
				优先级调度
					为每个进程分配一个优先级并按按优先级进行调度,优先级相同的轮换调度
					为了防止低优先级的进程等不到调度,可随着时间的推移增加等待进程的优先级
				多级反馈队列
					CPU密集型应设置更长时间片减少进程切换,但过成又会影响其它的响应时间
					设立优先级类,逐类时间片翻倍,时间片未运行完暂时退出到优先级低的类;既减少了进程切换时间又为短的交互程序让出CPU
				最短进程优先
				保证调度
				彩票调度
				公平分享调度
			实时系统中的调度
				实时系统要求一个请求在一个确定时间内得到响应
				分为硬实时和软实时
			策略和机制
			线程调度



		**IPC**
			哲学家就餐问题:互斥访问有限资源的竞争问题
				防止死锁、饥饿,获得最大并行度
				使用信号量数组对应哲学家,数组state跟踪哲学家状态
					必须同时拿起左右两根筷子
					只有在两个邻居都没有进餐的情况下才允许进餐
			读者-写者问题
				允许多个进程同时对数据进行读操作,但是不允许读和写以及写和写操作同时发生
				一个整型变量 count 记录在对数据进行读操作的进程数量,一个互斥量 count_mutex 用于对 count 加锁,一个互斥量 data_mutex 用于对读写的数据加锁



	####内存管理
		**分层存储器体系,操作系统管理它的部分称为存储管理器**
		**无存储器抽象**
			程序直接访问物理内存,内存不适合运行两个程序
			存储器模型


		**一种存储器抽象:地址空间**
			地址空间的概念
				为了使多个程序同时位于内存中互不影响,需要解决保护(操作系统、程序)和重定向(指令在内存地址)的问题,解决方法提出一个新的存储抽象——地址空间
				地址空间是一个进程可用于寻址内存的一套地址集合,每个进程都有独立于其他内存的地址空间,通过动态重定向将地址空间映射到真实的物理内存中。
					基址寄存器:记录进程开始的初始物理位置
					界限寄存器:程序的长度,进程在物理内存结束的位置
				流程
					进程运行时,程序的始终物理位置会加载到寄存器
					每次一个进程访问内存,取指或读写,访问内置会发送到内存总线加上基址 再与界限寄存器值作比较,是否发生终止
			交换技术
				运行的进程完整调入内存,空闲进程存回到磁盘
				内存紧缩:小的空闲区合成大块
				数据段增长
					空闲区分配、将相邻进程交换出去或者是挂起结束
					为进程额外分配内存(可用来存放数据堆栈)
			空闲内存管理(跟踪内存使用情况)
				使用位图的存储管理
					内存被划分为几个或几千个字节的分配单元,对应位图中的一位,0表示空闲,1表示占用
					分配单元越大,位图越小
				使用链表的存储管理
					记录已分配内存段和空闲段的链表,其结点表示一个进程或内存区
						H P指示标志
						起始地址
						长度和指向下一结点的指针
				为创建的进程分配内存的算法
					首次适配算法
					下次适配算法
					最佳适配算法
					最差适配算法



		**虚拟内存**
			每个进程有自己的可被分割成多块的地址空间,每一块称为一页,每页又有其连续的地址范围。程序运行时部分页装入内存,OS可将缺失部分重新装入
			分页
				程序产生虚拟地址构成虚拟地址空间,通过内存管理单元MMU将虚拟地址映射为物理内存地址
				MMU将页面映射到页框,实际0~4095改成8192~12287 再将这个地址送到总线上
					映射实现
						虚拟地址8196其二级制16位,前4位为页号表示16个页面,后12位偏移为一页内4096个字节编码
						页号作为页表的索引,以得出对应的页框号
							不在,0位 CPU陷入操作系统,陷阱称为缺页中断;OS将很少使用的页框写回磁盘  需要访问的页面读到页框
							在,1位 对应页框号为110 +偏移量 构成物理地址输出到内存总线
			页表
				页框号
				在/不在位
				保护位:指一个页允许什么类型的访问, 读、写、可读写
				修改位:是否有修改过
					修改过,则则需要先写入磁盘保存才能丢弃
					未修改过,更换其他页面时直接丢弃
				访问位:是否正在访问,包裹读、写
				高速缓存禁止位:禁止告诉缓存
			加速分页过程
			针对大内存的页表
				有多级页表、倒排页表等,方便快速查找寻址



		**页面置换算法**
			最优页面置换算法
				选择的被换出的页面将是最长时间内不再被访问
			NRU(最近未使用)页面置换算法
				每个页面都有两个状态位:R 与 M
					页面被访问时设置页面的 R=1
					页面被修改时设置 M=1
					 R 位会定时被清零,可将页面分成四类
				发生缺页中断时,NRU算法将随即淘汰一个没有被访问的修改页面
			FIFO(先进先出)页面置换算法
				将最先进入的页面换出的页面是
			第二次机会页面置换算法
				寻找一个在最近时钟间隔内没被访问的页面,避免了FIFO算法将经常使用页面置换的问题
				检查最老页面R位
					0:页面既老有没有被使用,立刻置换掉
					1:R位清零重新放到链表尾端
			时钟页面置换算法
				使用环形链表将页面连接起来,再使用一个指针指向最老的页面,对FIFO改进避免链表结点移动
				检查表针指向的页面
					0:在该位置置换
					1:清除R位,表针前移一个位置
				改进
			LRU(最近最少使用)页面置换算法
				用以前的页面引用情况来预测将来会出现的页面引用情况,选择最近最长时间没有被使用的页面予以淘汰
			NUF(最不常用)
			工作集页面置换算法
			工作集时钟页面置换算法



		**分页系统中的设计问题**
			局部分配策略与全局分配策略
			负载控制
			页面大小
			分离的指令空间和数据空间
			共享页面
			共享库
			内存映射文件
			清除策略
			虚拟内存接口
		**有关实现的问题**
		**分段**
			虚拟内存采用的是分页技术将地址空间划分成固定大小的页,每一页再与内存进行映射。由于表常常是动态扩张收缩的,会出现覆盖问题
			段由从0到某个值的序列构成,是一个独立的地址空间,增长减小(长度可以动态改变)不影响其它段
			优点
				简化对长度变动的数据结构的管理
				通过段号和段内地址来寻址到字,程序修改后不影响其他过程
				共享过程和数据
			实现



	####文件系统
		**文件系统:OS中处理文件的部分,把ASCII文件名映射成定位文件数据所需信息**
			文件命名
				文件名.扩展名
			文件结构
				无结构字节序列
					操作系统见到的文件内容就是字节,内容含义在用户程序中解释
				记录序列
					文件是具有固定长度记录的序列
				树
					文件由一棵记录树构成,记录长度不必相同但记录的固定位置有一个 键 字段,树通过键快速查找
			文件类型
				目录
					管理文件系统结构的系统文件
				普通文件:ASCII文件和二进制文件
					ASCII文件的优势就是可以显示和打印, 也是普通用户常用的文件
					二进制文件如视频图片等
				字符特殊文件
					和输入、输出有关,用于串行I/O类设备
				块特殊文件
					用于磁盘类设备
			文件访问
				随机访问
					read:从给出的开始文件
					seek:设置访问位置
			文件属性
			文件操作
				create, delete,open,close,read,write,append,copy, seek,get attributes,set attributes, rename
			使用文件系统调用的一个示例



		**目录:作为一个文件其内容记录文件的位置**
			一级目录系统
				常用于简单的嵌入式,只有一个层级
			层次目录系统
				目录树:根目录、用户目录、用户子目录、用户文件
			路径名
				用目录树组织文件系统时指明文件的方法
					绝对路径:从根目录开始到文件
					相对路径:和工作目录一起使用
				每个进程都有自己的工作目录,改变它(除了库过程)并不影响其他进程
				目录项
					.
						指定当前目录
					..
						沿树向上到根目录
			目录操作
				 create, delete, opendir, closedir, readdir, rename, link, unlink



		**文件系统的实现**
			文件系统布局
				磁盘划分了多个分区,每个分区存放了独立的文件系统
				布局
					主引导记录
						引导计算机,确定活动分区,读入引导块
					MBR结尾是分区表
						给出每个分区的始终位置
					磁盘分区
						引导块:装载了该分区的操作系统
						超级块:包含文件系统的所有关键参数,在计启、初次使文系都会将它读入内存;包括魔数、文件系统块的数量等
						空闲空间管理:用位图、指针列表形式给出
						i节点:数据结构数组,每个文件都有一个相应的
						根目录
						文件和目录
			文件的实现:记录各个文件分别用哪些磁盘块
				连续分配
					把文件作为一串连续数据块存储在磁盘
					磁盘变得零碎,重新压缩磁盘代价大,适合一次性写入
				链表分配
					以磁盘块的链表形式存储文件
					每个块的第一个字存储指向下一块的指针,其他部分存放数据
					随机访问慢,数据不是2的整数次幂需要在多个块之间获取拼接信息,效率低
				采用内存中的表进行链表分配
					通过内存中的文件分配表存放磁盘块中的指针
					不适合大型磁盘
				i节点
					为每个文件赋予一个称为i节点的数据结构,包括文件属性和文件快磁盘地址
			目录的实现
				读文件前OS利用用户给出的路径名找到对应目录项,它包括了查找文件磁盘块所需信息,磁盘地址或i节点号或。。
				何处存放文件属性
					简单目录:包含许多固定大小目录项,每个文件对应一项,有磁盘地址、文件名、文件属性结构体
					采用i节点系统,文件属性存放在i节点中,这样目录项只有文件名和i节点号
				文件名的长度以及文件名的保存
					给文件名一个固定的长度限制,同时给文件名分配固定大小的目录空间
					每个目录项前面部分是固定格式的数据,如目录项长度、文件属性,然后接上可变的任意长度的文件名,文件名以特殊字符(通常为0)结束
					目录项有一个固定长度,而将文件名放在目录后面的堆中,这样移走一个文件,下一个文件进来了,也刚好可以适合这个空隙。不过,就必须对堆进行管理
			共享文件
				通过 链接 在b目录与c目录中的文件建立联系实现共享
				问题
					c目录包含磁盘地址,需要把地址复制到复制到b目录
					随后b或c向文件中添加内容只会添加在b或c中无法共享
						解决
							磁盘块不列入目录,列入目录指向的i节点
							符号链接,在b目录中建立LINK(包含了所链接文件的路径名),使b与c的一个文件建立链接
			日志结构文件系统
			日志文件系统
				保存一个用于记录系统下一步将要做什么的日志
			虚拟文件系统



		**文件系统管理和优化**
			磁盘空间管理
				块大小
					64k
				记录空闲块
					磁盘块链表
						链表中的每个块包含尽可能多的磁盘块号
					位图
						n个块的磁盘需要n位位图,1表示空闲
				磁盘配额
					管理员为每位用户分配最大拥有文件和块的数量
			文件系统备份(防止文件系统被破坏)
				解决问题
					从意外的灾难中恢复
					从错误中恢复
				增量转储
				物理转储
				逻辑转储
			文件系统的一致性
				磁盘块计数表
			文件系统性能
				高速缓存
				块提前读
				减少磁盘臂运动
			磁盘碎片整理



		**文件系统实例**
		
	####输入/输出(介绍IO硬件软件原理,并从这两方面介绍设备)
		**I/O硬件原理(注意硬件提供给软件的接口,如硬件能接受的命令、实现的功能、汇报的错误)**
			I/O设备
				块设备
					把信息存在固定大小的块当中,每个块有自己的地址,块与块之间读写独立
					磁盘、光盘、USB盘都是常见的块可寻址设备
				字符设备
					以字符为单位发送、接受一个字符流,而不考虑块结构
					打印机、鼠标等都是字符设备、是不可寻址的
			设备控制器
				IO设备机械部件和电子部件组成
					电子部件称作设备控制器或适配器,如芯片、电路板
					机械部件时设备本身
				控制器卡上的连接器通过电缆连接机械部件
				从驱动器出来的串行比特流=前导符+扇区位+错误校正码
				控制器将该比特流转化为字节块,校正成功后存入内存
			内存映射I/O
				IO还包括
					控制器有几个用来和CPU通信的寄存器
						通过写入寄存器,OS可命令设备发接数据、开关等执行操作
						通过读取寄存器,OS可以了解设备状态,是否准备好接受一个新命令等
					设备还有一个OS可以读写的数据缓冲区
				如此有一个问题:CPU如何与控制寄存器、缓冲区进行通信?
					方法1:单独的io和内存空间
						每个控制寄存器被分配一个I/O端口号,所有端口形成I/O端口空间 只有OS可以访问
						IN REG,PORT :CPU读取控制寄存器PORT内容并将结果存入CPU寄存器REG中
						内存地址空间和IO地址空间不同
							IN PEG,4  读取端口号4的内容然后存入CPU寄存器PEG中
							MOV PEG ,4 读取内存字4的内容并存入CPU寄存器PEG中
					方法2:内存映射I/O
						将每个控制寄存器分配唯一的内存地址从而映射到内存空间中(不会有内存分配这个地址),这样的系统被称为内存映射I/O
					3
						混合方案
				CPU读取字的流程
					CPU将需要的地址放到总线的地址线上
					总线上的一条控制线上置起两条信号
						READ信号
						第二条信号用来表明需要的是I/O空间还是内存空间
							单独的IO和内存空间
								IO空间:IO设备响应请求
								内存空间:内存将响应请求
							内存映射I/O
								如果只有内存空间,每个内存模块和io设备将地址线和服务的地址范围比较,其中一个将响应请求
				内存映射I/O优点
					设备控制寄存器只是内存中变量,在C语言中和其它变量一样寻址,不需要使用汇编代码
					不需要特殊的保护机制阻止用户进程执行I/O操作??
					内存指令适用于控制寄存器
				缺点
					高速缓存灾难
					总线地址读取问题
						只存在一个地址空间,内存映射IO 所有的模块设备都需要检查
							单总线:查看地址是易行的
							双总线:内存地址旁路到专门的内存总线上,无法查看地址
			直接存储器存取
				对于上面三种方案,CPU都需要寻址设备控制器(磁盘控制器)和他们交换数据
				CPU从I/O控制器每次请求1字节数据
					磁盘控制器从驱动器串行的一位一位地读一个块,将整块信息放到磁盘控制器的内部缓存区中,计算校验没有错误后控制器产生中断;OS重复的缓冲区一个字或字节的读取到内存
				OS将内存缓冲区虚拟地址转换为物理地址写到DMA控制器的地址寄存器中
				DMA控制器独立于CPU(分担其数据传输功能)而访问系统总线
					为了减少CPU时间浪费使用 ,采用直接存储器存取(DMA)方案
					构成:多个可被CPU读写的寄存器
						内存地址寄存器
						字节计数寄存器
						多个控制寄存器
							指定使用的I/O端口、传送方向(读/写到io设备)、传送单位、一次突发传送中要传送的字节数
					一路传送工作原理
						如图1,让DMA控制器直到将什么数据传送到什么地方
						2,DMA通过在总线上发出读请求到磁盘控制器而发起DMA传送。(读到磁盘缓冲区)
						3,通过总线地址线上的内存地址,缓冲区数据传送到内存
						4,写操作完成磁盘控制器发送应答信号到DMA控制器
							步增内存地址,步减字节计数;计数大于0重复2、3步骤,等于0中断CPU
					多路传送
						使用多组寄存器
						传送到内存一个字后,DMA控制器决定下一次为那个设备提供服务
							轮转算法
							优先级规划设计
					两种工作模式
						每次一字(周期窃取,DMA让设备控制器占用CPU的一个临时的总线周期完成数据传输,CPU有轻微延迟)
						块模式(突发模式,有可能将CPU和其他设备阻塞过长时间)
			重温中断
				1)I/O设备在中断线上置起信号 2)中断控制器发出中断 3)cpu响应中断
					第二步如果没有正在处理的中断,没有更高优先级的中断请求,中断控制器将继续置起检测到的中断信号
						中断信号导致CPU停止当前正在做的并开始新的工作
					第二步继续置起的同时还会在地址线上放置一个数字表明哪个设备需要关注
						数字被用作指向 中断向量的表格索引,以便读取新的程序计数器,计数器指向相应的中断服务过程的开始
						中断服务程序开始前,硬件需要将要被中断程序的程序计数器等一些信息保存
							保存在内部寄存器,问题
							用户进程的堆栈
							内核堆栈
						中断服务开始后通过一个确定的值写到中断控制器的某个io端口来对中断做出应答(应答告知控制器可以发出另一个中断)
				精确中断和不精确中断
					将机器留在一个明确状态的中断称为精确中断 
						4个特性
					不满足这些特性就是不精确中断
						需要将大量内部状态记录
						中断响应、恢复糟糕



		**I/O软件原理**
			I/O软件的目标
				设备独立性:编写的程序可以访问任何I/O设备
				统一命名:一个文件或设备的名字应是简单的字符串或数字而不依赖于设备,所以可以通过路径名寻址
				错误处理:尽可能在硬件层次得到处理
				同步(阻塞)和异步(中断驱动)传输:多数物理IO是异步的—CPU启动传 它 中断,OS让用户感受到IO操作是阻塞的—在写缓冲区进程阻塞
				缓冲: 数据从一个设备到另一个设备需要缓冲区检查,之后OS确定最后数据传输到的位置。涉及大量复制,影响性能
				独占设备相比共享设备有各种问题如死锁。也需要OS来处理以避免问题
			3中I/O实现
				程序控制I/O
					e.g.打印字符串
						软件首先在用户空间的一个缓冲区组装字符串
						用户进程发出打开打印机等系统调用获得打印机
						OS将字符串缓冲区的数据复制到内核空间中的一个数组,之后OS查看打印机是否可用(可能阻塞),可 OS复制1字符到打印机的数据寄存器(内存映射I/O)
						OS通过打印机的表明状态的寄存器查看打印机是否准备就绪接受另一个字符
						最后控制返回到用户进程
					轮询(忙等待):CPU不断查询设备是否可以接受下一个字符
					I/O操作占用所有CPU时间,低效
				中断驱动I/O
					字符复制到打印机后,打印时CPU会忙等待,这时让CPU调用调度程序进行上下文切换,打印进程阻塞直到打印完就绪 打印机产生中断 当前进程保存状态。中断服务过程运行
					缺点:在每次I/O操作都会中断,保存状态等会浪费CPU时间
				使用DMA的I/O
					本质上是DMA代替CPU部分功能实现程序控制I/O
					DMA比CPU慢,但中断只发生在缓冲区操作,解放了CPU



		**I/O软件层次**
			中断处理程序
				隐藏在OS内部:启动一个I/O操作的驱动程序,阻塞自己直到IO完成且发生中断
					阻塞方式
						信号量 down
						条件变量 wait
						信息 receive
				处理过程,  P200TLBCPU高缓??
			设备驱动程序
				一些特定的代码通过总线来控制相应连接到计算机上的I/O设备
				为了访问设备控制器的寄存器,驱动程序通常是OS内核的一部分(构造在用户空间的驱动使用系统调用读写寄存器,实现内核与驱动隔离)
				大多数OS定义了两个让块设备、字符设备都必须支持的标准接口
					IO设备基本归类
						磁盘等包含多个独立寻址块的块设备
						键盘等生成接受字符流的字符设备
				实现功能
					读写
					初始化、电源管理、日志管理等
				具体实现
					启动时检查输入参数,参数有效将进行抽象到具体式相转换 如磁盘块号转换成磁头磁道扇区柱面号
					检查设备是否可用,否 在队列等待
					驱动确定命令序列并写到设备控制器的寄存器中
					命令发出后
						驱动将等待直到设备控制器发出中断使驱动结束阻塞
						或无延迟不需要等待
				一些特点
					可重入的,预料第一次调用完成前第二次被调用
					热插拔:内核重新分配资源,撤除旧资源添加新
					不允许进行系统调用,但经常调用某些内核过程,例如调用管理MMU、定时器、DMA控制器、中断控
			与设备无关的I/O软件
				设备驱动程序的统一接口
					为了让OS接入的设备驱动程序统一接口,对每一种设备类型 OS定义了一组驱动程序必须支持的函数
						驱动程序含有一张表格,表格具有针对这些函数指向驱动程序自身的指针,定义了驱动程序与OS其余部分的接口
						驱动系统装载时OS记录下函数指针表的地址,OS通过这张表格间接调用函数
					统一接口的另一方面是给IO设备命名,把符号化的设备名映射到适当的驱动程序上
						i节点包含用于定位相应驱动的主设备号
						还包含作为参数传递给驱动的次设备号
						与设备命名相关的设备保护问题??
				缓冲(用于输入输出)
					无缓冲
						用户进程执行read调用并阻塞自己,字符到来引起中断将字符递交给用户进程并解除阻塞
						用户进程把字符放到某个地方后对另一个字符执行读操作并再次阻塞
						每个字符到来都重新启动进程效率低
					用户空间中设置缓冲区
						用户进程执行读取n个字符的读操作,中断服务过程负责将来的字符放入缓冲区直至填满,然后唤醒用户进程
						效率高;缺点:缓冲区被分页调出?锁在内存页面池收缩?
					在内核空间、用户空间中均设置缓冲区
						中断处理程序将字符放入内核缓冲区直至填满,将包含用户缓冲区的页面调入内存 并将内核缓冲区数据复制到用户缓冲区
					在内核中设置两个缓冲区
						上一个存在一个问题,复制过程来新的字符  这时可以再设置一个内核缓冲区
					循环缓冲区
						由一个内存区域和两个指针组成 P204下
							一个指针指向一个空闲的字存放新的数据
							一个指针指向缓冲区中数据的第一个字尚未被取走
				错误报告
					许多错误是设备特定的并且必须由适当的驱动程序来处理
					错误类型
						编程错误:指定无效设备等错误操作直接返回错误报告给调用者
						实际IO错误:由驱动程序决定做什么,不知则问题上传返回到与设备无关软件
				分配与释放专用设备
					如打印机等是要被进程独占的,当进程请求时要做处理
					处理方法
						进程在代表设备的特殊文件执行open
						将设备阻塞放到一个特殊队列
				与设备无关的块大小
					不同磁盘可能有不同扇区大小,由设备无关软件隐藏事实而提供统一大小的块。高层软件只需处理抽象的设备
			用户空间的I/O软件
				小部分IO软件在用户空间,包括与用户程序连接在一起的库,甚至完全运行于内核之外的程序
				系统调用通常由库过程实现,许多过程作为用户程序一部分 如count=write()
				用户层IO软件还可以是假脱机,用来处理多道程序独占IO设备的方法
					守护进程打印放在假脱机目录下要打印的文件



		**盘**
			盘的硬件
			磁盘格式化
			磁盘臂调度算法
			错误处理
			稳定存储器

		**时钟**
			时钟硬件
			时钟软件
			软定时器
			
		**用户界面:键盘、鼠标和监视器**
		
		**瘦客户机**
		
		**电源管理**
			硬件问题
			操作系统问题
			应用程序问题



	####死锁(进程集合中每个进程都在等待集合中其他进程才能引发的事件,原因在于进程排他的访问资源导致无法实现切换访问的资源)
		**资源(随着时间推移,必须能获得、使用以及释放的排他性的东西)**
			可抢占和不可抢占资源
				抢:从拥有它的进程中抢占而不会产生副作用,如存储器,内存页面抢占所以完成置换
				不:资源不引起相关计算失败时,无法把它从占有他的进程处抢占过来
			资源获取
				请求、休眠、请求休眠。。请求、使用、释放
				为每一个资源配置信号量,down来获取使用,up来释放
				会产生阻塞或死锁



		**简介**
			资源死锁的必要条件
				互斥条件。资源已被分配或可分配
				占有和等待。某进程得到资源后可再请求新资源
				不可抢占。已分配的资源不能被抢占
				环路等待。进程组成环路,a在等待b释放资源,z等a;造成死锁
			死锁建模
				方框表示资源,圆圈表示进程。资源指向进程表示该资源已经分配给该进程,进程指向资源表示进程请求获取该资源
				建立资源分配图,是否形成环路


		**鸵鸟算法(忽略该问题)**

		**死锁检测和恢复(允许死锁发生并尝试恢复)**
			每种类型一个资源的死锁检测
				依次将每一个节点作为一棵树的根节点,并进行深度优先搜索,节点重复遇到则是死锁环,未重复且穷举完则回溯
				回溯完所有节点则完成这个根节点的检测,需检测完图中所有点
			每种类型多个资源的死锁检测
				基于矩阵
					现有资源向量
					可用资源向量
					当前分配矩阵
					请求矩阵
				检测算法
					寻找没有标记的进程Pi,其R矩阵的i行向量小于或等于A(该进程的请求可被满足)
					找到了这个进程,将C矩阵的第i行向量加到A中(先执行Pi并释放其占有资源),标记该进程,转到第一步
					如果没有这样进程,算法终止
			从死锁中恢复
				利用抢占恢复
				利用回滚恢复
					周期性对进程进行检测点检查:将一个进程的状态(存储映像、资源状态)写入一个文件以备重启
					检测到死锁则恢复检测点进程回滚,等待到所需资源可用为止
				通过杀死进程恢复
					杀死环内一个进程
					杀死环外进程从而释放环内所需资源
					注意:更新数据库进程在第二次不一定安全??



		**死锁避免(仔细对资源进行分配)**
			资源轨迹图
			安全状态和不安全状态
				安全状态:按某种调度次序保证每一个进程都完成
				Free满足某个进程的Max-Has,则可调度它进而释放它的资源
				不安全状态并不一定引起死锁,同时请求Max产生死锁
			单个资源的银行家算法
				检测是否是安全状态
					是,分配资源
					不是,拒绝请求
			多个资源的银行家算法
				实现
					查找“仍然需要的资源”矩阵是否存在一行小于或等于向量 A。如果不存在这样的行,那么系统将会发生死锁,状态是不安全的
					假若找到这样一行,将该进程标记为终止,并将其已分配资源加到 A 中
					重复以上两步,直到所有进程都标记为终止,则状态时安全的



		**死锁预防(破坏死锁的必要条件)**
			破坏互斥条件
				让资源不被一个进程独占。例如假脱机打印机技术允许若干个进程同时输出,唯一真正请求物理打印机的进程是打印机守护进程。
			破坏占有并等待条件
				禁止已持有资源的进程再等待其他资源,实现方法有
					规定所有进程在开始执行前请求所需要的全部资源,若所需资源被使用则让进程等待
					进程请求资源时,先暂时释放其当前占用的所有资源,再尝试一次获得所需全部资源
			破坏不可抢占条件
				强制抢占资源并通过虚拟化方式避免混乱
			破坏环路等待条件
				保证一个进程只占用一个资源,要请求别的需先释放
				给资源统一编号,进程只能按编号顺序来请求资源



		**其他问题**
			两阶段加锁
			通信死锁
			活锁
			饥饿

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值