第六讲 段页式储存管理
段式储存管理:将相同类型、储存方法的数据放在一段联系内存中,比如代码段、数据段、堆栈等。还有内存共享的话,不同进程的共享段可以用同一段物理内存表示。
页式储存管理:对内存操作时逻辑地址要转换成物理地址,这时就要查页表,就是逻辑地址页号和物理地址页号的对应关系。公开课讲了三个优化,一个是用CPU里的缓存,思想就是经常访问的页表放到缓存里。
还有是多级页表储存,思想是页表往往只要存一部分逻辑地址,因为一般不会用到全部,这样就可以弄多级,一层层往下找,每层只存会用到的页表。我估计就是跟函数式线段树什么的类似,如果某层没存该找的页表,就处理一下让他存,但是这种情况很少,所以可以大大减少储存量。
最后还有个反置页表,没看懂。
第八讲 虚拟内存管理
操作系统管理内存,不单管理虚拟内存逻辑地址,还能用比物理内存更大的虚拟内存空间,一个重要原理是把不常用的内存存到外存中。方法有覆盖和交换,覆盖是程序员事先将程序模块化,分出几组内部互相之间不会同时运行的模块,那么一组的模块的程序就可以用同一块内存,互相覆盖。交换是操作系统的事,就是把不在运行状态的进程先换到外存中去。利用了局部性原理。
操作系统把进程暂时不用的页或段存在外存中,要用时查到不在内存中则从外存中调入内存。看CSAPP里说的是刚开始将虚拟内存空间映射到一段磁盘空间中,然后虚拟内存页会记录是否有在物理内存中,加载时没的话调入到内存。外存一般会有专门的交换区或者文件用于存放内存里换出来的信息,若是进程的代码段则不必,可以直接从源文件读取。还有动态加载的共享库程序段。
唉坑啊,讲了一堆废话...看CSAPP一下就看完了。
第九讲 页面置换算法
LRU,FIFO,clock等局部置换算法,意思好像是只换同进程的页面,还有belady现象,全局置换算法。不想细看跳过了,以后有需要了再细看吧。
全局置换算法为进程分配可变数目的物理页面。进程多的话会造成缺页率增加,少的话减少并发性,系统要折中考虑。
第十一讲 进程和线程
进程内存映像中的高位还是很模糊,视频里显示的是段表和共享库,之前也看到过说什么初始化东西在栈那,哦还看到说是命令行和环境变量的。
进程控制块PCB作用:进程标识信息;处理机现场保存;进程控制信息。
一个进程调用sleep函数,操作系统会给IO设备一个计时命令,然后让这进程去等待,执行别的进程,当计时器计时完毕时发出一个中断通知系统,再让原进程进入就绪状态。
第十二讲 进程控制
进程控制块存了进程的标识信息、状态信息、占用的存储资源、内存堆栈等,操作系统将相同类型的PCB存在一个链表,比如就绪进程PCB放一起,僵死进程的PCB放一起,相同IO设备的放一起。处理器切换进程时保存现场是存到进程PCB中。
进程挂起指将进程的内存映像放在外存中,以节省内存空间,有等待挂起和就绪挂起,和等待、就绪状态相对应。
多线程的内存结构挺奇怪的,好像堆在上面,各个线程的堆栈在下面。多线程有用户态内自己实现的,就是操作系统当做是进程来处理的,这样更快,但是会有一些问题,比如同进程的线程不能抢占,一个线程发起系统调用阻塞了整个进程都会阻塞。内核线程把TCB也由内核维护,使得线程成为最小的调度单位。用户线程和内核实际的线程数是不一定的,有一对一的,也有多对一的,也有多对多的,一对一效果较好。
第十五讲 处理机调度
处理机调度的准则有很多,比如高带宽(复制文件速度?),低延迟(移动鼠标、玩游戏等),这两个准则并不是同时成立的,这好比水龙头一打开有就水来和打开后水量很大。还有很多度量指标,根据这些指标判断一个处理机调度算法是否好。
处理机实时调度硬时限一定要满足要求,软时限尽量满足时限要求。有静态优先级调度和动态优先级调度。
多处理机调度有静态的,就是每个进程从创建开始就确定在某个处理机上执行,每个处理机有自己的就绪队列。动态的是进行选一个空闲的处理机进行执行,所有处理机共享一个就绪队列。多处理机执行操作同一个资源时需要同步。
第十七讲 同步互斥
设置临界区,最多只有一个进程进入临界区。临界区实现方法:
1.禁用中断,没有上下文切换,因此没有并发。
2.软件方法,大概就是设置变量记录状态,要进入临界区的线程、进程要访问、设置改变量。
3.高级抽象的方法,比如用锁,其利用的操作系统的原子操作指令。取锁时如果while的话是忙等待,可以优化,就是将其加入等待队列中,然后进程或线程进入就绪状态,就是让出CPU资源,可以用sleep吧,然后解锁时从队列中取一个进程或线程出来对其唤醒。这种方法可能导致饥饿,就是有进程一直轮不到他执行,因为执行的顺序不是按照申请锁的顺序。还可能造成死锁,比如低优先级的进程申请到了锁,但是高优先级的占了CPU,采用的如果是忙等待的话,他就会不断申请锁,造成死锁。
第十八讲 信号量
初始有个信号量S,申请资源时执行P()操作,对信号量减1,若S小于0,则加入等待队列,然后阻塞。释放时执行V()操作,对S加1,若S小于等于0,则从等待队列取出一个线程进行唤醒。P、V操作都是原子操作。
可以用信号量实现临界区的互斥访问,初始信号量为1。
使用信号量能实现条件同步,比如线程A生产数据,线程B使用数据,要线程A某个部分执行完后线程B才能执行,可以在线程A那部分使用V原语,线程B使用P原语,初始信号量为0。视频中讲了个生产者消费者的问题,可以用信号量解决,使用了三个信号量。
P、V要成对操作,几个信号量按一定顺序执行P的话,要按相反顺序执行V操作,否则会造成死锁。
管程和临界区的区别在于正在管程中的线程可临时放弃互斥访问,等待事件出现时回复。每个条件变量表示一个等待的原因,对应有一个等待队列。条件变量发生时,其放弃锁,进入等待队列,直到被唤醒重新申请锁。可以用管程解决生产者消费者问题。
哲学家就餐问题,5个哲学家围成一桌,他们之间有5把叉子,哲学家会思考或者就餐,就餐时会拿左右两边的两把叉子。叉子可视资源,如果把每把叉子设一个信号量,则可能出现死锁,就是5个哲学家都拿起左边的叉子后等待右边的叉子。最暴力的做法是把所有叉子设一个信号量,每次最多只有一个人就餐。还有更好的办法是奇数编号的先拿左边的叉子后拿右边的,偶数编号的先拿右边的后拿左边的,这样不会出现环的死锁的情况。
还讲了读者-写者问题,有信号量和管程的解决方法。
第十九讲 死锁、进程通信
出现死锁的必要条件:资源互斥;进程持有资源并申请别的资源;资源是非抢占的,不能强行剥夺;存在循环等待。避免死锁的方法有预防死锁,使死锁的必要条件不会都存在,比如进程一次申请所有资源,进程申请不到资源时释放已经占有的资源。还有只允许不会产生死锁的进程使用资源。还有检测死锁。死锁检测算法大概就是回收可完成的线程的资源,然后分配资源?大概就是这样循环很多次后看最后能不能完成所有资源分配请求。死锁回复就是终止死锁进程,一次终止一个知道死锁消除。
进程通信有直接通信和间接通信。间接通信有消息队列的方法,通过内核维护的消息队列进行通信。
管道也算间接通信。文件读写都算是管道。设置管道就相当于设置程序的标准输入输出。
直接通信有信号、共享内存,还有套接字也算吧。共享内存需要同步机制协调。
第二十一讲 文件系统
分配文件磁盘空间,管理文件集合,数据可靠和安全。
广义来看google就是一个文件系统,保存网络的信息,可以检索信息。
内核维护打开文件表,文件描述符包含OS在打开文件表中维护的打开文件状态和信息,包括文件指针,每个进程都有其自己的文件指针,指向上一次对该文件操作的位置。还有文件打开计数、文件磁盘位置、访问权限。文件在操作系统看来是由各个数据块组成的,数据块跟扇区不同。进程读写文件都是以数据块为单位,比如读写一个字节,操作系统也要缓存目标4096个字节。
访问模式有顺序访问、随机访问、索引访问,从某种角度看文件系统是一个数据库。
文件内部结构多种多样,复杂的要应用程序进行识别,比如WORD、PDF。
UNIX文件访问权限类似个3*3的矩阵:<用户|组|所有人,读|写|可执行>。
多进程如何同时访问共享文件,因为磁盘I/O和网络言辞因此往往设计简单,这视操作系统而定的吧,比如对打开文件的写入内容立即对其他打开统一文件的其他用户可见。用notepad++和DEV C++打开同一文件,保存一个时另一个会弹出框框说有变动是否重新加载。notepad则不会通知,可能是notepad只是打开后显示其中内容然后关掉文件了?
文件系统有很多种类,比如磁盘文件系统,网络/分布式文件系统。
虚拟文件系统对上层提供相同的文件和文件系统接口,对下提供与特定文件系统模块的交互。文件系统的存储结构包含卷控制块、目录、文件控制块、实际文件数据块。
每个被打开的文件都有一个文件描述符,每个进程有打开文件表。系统也有一个打开文件表。
文件分配有连续分配、链表分配、索引分配。实际用的比较多的是用多级索引分配,按照文件数据块的大小来分级。
文件卷是有完整文件系统实例的外存空间,文件系统需要挂载。RAID条带化技术通过讲数据块分到多个磁盘,并行操作提高性能。还有磁盘镜像,即将数据再存个镜像,相当于存两份,这样读数据时能并行,会更快,并且数据可靠性更强,多一个副本。还有带校验的磁盘条带化,再在一个磁盘中存奇偶校验码,这样一个磁盘的数据块出错的话还能恢复过来。还有带分布式校验的,将校验码每次放在不同磁盘上。
第二十三讲 I/O子系统
用户输入输出数据处理要经过I/O子系统->设备控制器->设备。处理I/O传统的方法是CPU进行in,out命令处理,该方法数据量越大消耗时间越多。还有DMA的方法,就是CPU通知设备驱动读取某段数据,设备控制器初始化DMA传送,DMA将设备数据传送到内存中,设备控制器通知CPU传送完成。设备控制器通知CPU的方法有轮询,CPU定时查询设备状态,还有设备中断。
处理磁盘I/O请求通过调整处理顺序优化,减少磁盘寻道时间。跟那什么原理类似,操作的区域相近的话花费时间较少。可能会出现磁头粘着现象,就是磁头停留在某处附近操作,其他请求拖到很后面才处理,有相应算法考虑到这种情况。
磁盘I/O会有缓存。有双缓存和单缓存,单缓存要同步,双缓存更快些。