• 分享一些初次阅读时的记录,本文原是导图,我直接粘在了这 可读性一般,需要导图的朋友可以私,希望可以帮到大家快速搭起这本书的知识结构。
现代操作系统####引论**引**计算机硬件软件内核态:操作系统用户态应用程序用户接口程序: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^np=进程等待IO操作事件/进程在内存中的事件n=程序数量**线程(每个进程都有一个地址空间和在这个空间中准并行运行的多个控制线程)**线程的使用需要多线程原因应用中发生的多种活动中某些会被阻塞,将应用分解成准并行的多个线程,程序模型会更简单简单在不必考虑中断(字处理时单线程需要引入中断)、定时器、上下文切换并行的线程共享同一个地址空间和所有可用数据的能力线程比进程更加轻量级,可更快的创建撤销多个线程不只是CPU密集型,还存在计算、IO等操作,就可以通过多级流水提高性能使用多线程的例子字处理软件多个线程分别负责用户交互、后台格式处理、磁盘备份等,他们共享公共内存对同一个文件处理(单线程需要在写入时中断备份就需要引入中断程序设计)Web服务器进程顺序线程单线程:阻塞系统调用、CPU空转多线程:并行、阻塞系统调用分派线程选择一个阻塞的工作线程在其字中写入消息指针,接着唤醒该线程;工作线程在高速缓存中检查、从磁盘调入read操作进入阻塞,直到找到页面返回客户端再进入阻塞。进一步提高性能有限状态机:并行、非阻塞的read系统调用、中断与多不同的:服务器记录当前状态后处理下一个事件,磁盘查找完成或者事件是磁盘回答就会发生中断常用来处理极大量数据线程模型从进程到线程进程用于将资源集中,线程是CPU上被执行的实体,所以说进程拥有一个执行的线程线程模型允许在一个进程环境中有多个线程并行运行,模拟了单CPU伪并行多个进程(共享物理内存、磁盘、打印机等资源),又被称为轻量级进程 共享同一个地址和资源(纳秒级的线程切换)进程和线程比较图a)的并发多线程也就是并发多进程b)多个线程是同一个地址空间共享同样全局变量,都可访问这个地址空间中的每一个内存地址,以及共享打开文件集、子进程、即定时器、信号处理程序、账户信息b)每个线程实际占用CPU,有自己的PC、寄存器、堆栈、状态同样具有运行、阻塞、就绪状态与线程状态相关的库函数createexitjoin 等待某线程退出yield 自动放弃CPU的使用(因为线程库无法中断线程)POSIX线程为了实现线程可移植,IEEE定义了线程标准,线程包pthreadpthread_create _exit _join _yieldpthread_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 记录充满的缓冲槽数目,初值0empty 记录空的缓冲槽数目,初值为缓冲区中槽的数目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算法、信号量、公告缓冲区中多线程应访问一些共享内存。 如何共享?信号量存放在内核通过系统调用来访问进程与其他进程共享其部分地址空间、缓冲区、数据结构,甚至是共享文件快速用户区互斥量futexpthread中的互斥量管程一个由过程、变量及数据结构等组成的集合,任意时刻管程中只能有一个活跃进程。消息传递屏障避免锁:读-复制-更新**调度**简介多个进程同时竞争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=1R 位会定时被清零,可将页面分成四类发生缺页中断时,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/OIO还包括控制器有几个用来和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/O3混合方案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/Oe.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/ODMA比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. trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer

    一.代码结构概览 1.核心部分 configs:储存各种网络的yaml配置文件 datasets:存放数据集的地方 detectron2:运行代码的核心组件 tools:提供了运行代码的入口以及一切可 ...

  2. VoxelNet阅读笔记

    作者:Tom Hardy Date:2020-02-11 来源:VoxelNet阅读笔记

  3. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  4. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  5. Mina源码阅读笔记(一)-整体解读

    2019独角兽企业重金招聘Python工程师标准>>> 今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者 ...

  6. “CoreCLR is now Open Source”阅读笔记

    英文原文:CoreCLR is now Open Source 阅读笔记如下: CoreCLR是.NET Core的执行引擎,功能包括GC(Garbage Collection), JIT(将CIL代 ...

  7. QCon 2015 阅读笔记 - 团队建设

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 中西对话:团队管理的五项理论和实战 - 谢欣.董飞(今日头条,LinkedI ...

  8. 05《软件需求模式》阅读笔记

    剩下的两个阅读笔记写第二部分.各类需求模式,共八个领域和它的需求模式,这一次写前四个. 基础需求模式,它是所有种类的系统都可能需要的一些东西.系统间接口需求模式使用系统间接口需求模式定义被定义的系统和 ...

  9. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  10. 大型网站技术架构:核心原理与案例分析阅读笔记二

    大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...

最新文章

  1. linux交换分区的优化-参数优化必选
  2. 160407、java实现多线程同步
  3. 纯CSS打造可折叠树状菜单
  4. 春天:注入列表,地图,可选对象和getBeansOfType()陷阱
  5. eoeAndroid开发者大会
  6. 记录并练习Markdown的基本语法
  7. 手把手教你如何加入到github的开源世界!
  8. iOS常用---NSString,NSMutabuleString
  9. 【ClearCase 学习笔记 】之(1/4)CC四大功能概述
  10. uniapp实现语音播放功能
  11. VUE3-Cesium(entity、primitive总结及材质的修改)
  12. 计算机串口故障,电脑故障:主板串口接口故障的维修方法总结
  13. SD卡启动第二篇 (手动导入系统到SD卡分区)
  14. JAVA导出EXCEL——POI(转)
  15. gae mysql_国内几大云服务引擎 BAE、SAE 与 GAE 优劣对比
  16. java输入无名粉_05·无名粉店(上)
  17. 如何把汉字生成拼音首字母
  18. python123八边形绘制_使用python实现简单的画多边形。
  19. 打开控制台查看后台html代码
  20. 微信小程序--图片懒加载

热门文章

  1. Springboot-banner图-定制化
  2. EFF希望NSA销毁长达14年的电话监控记录
  3. php unlink没有权限,php中删除文件用unlink函数权限判断_PHP教程
  4. 对残差网络(ResNet/Residual Network)的基础理解
  5. iOS控件使用和多样布局
  6. iPhone高清语音功能iMessage对移动运营商产生严重威胁
  7. 为什么那么容易转行软件测试,软件测试好学吗 大概要学多久
  8. 二进制转bcd码c语言程序,二进制转8421BCD码的算法
  9. 8421码的加减矫正
  10. KDL简介---KDL、PyKDL、pykdl_utils之间关系