第二部分 进程管理
第三章 进程
进程包括:代码段,当前活动(程序计数器的值和处理器寄存器的内容),进程堆栈段(临时数据,如函数参数、返回地址和局部变量)和数据段(包括全局变量),堆(进程运行期间动态分配的内存)。
进程状态:1)新的,进程正在被创建;2)运行:指令正在被执行;3)等待:进程等待某个事件的发生。4)就绪:进程等待分配处理器;5)终止:进程完成执行。
进程控制块:每个进程在操作系统内用进程控制块(process control block,PCB)来表示。包括:1)进程状态,状态可包括新的、就绪、运行等;2)程序计数器,计数器表示进程要执行的下一个指令的地址。3)CPU计算器;4)CPU调度信息,包括进程优先级、调度队列的指针和其他;5)内存管理信息,包括基址之类;6)记账信息,包括CPU时间、实际使用时间、时间界限等;7)I/0状态信息,分配给进程的I/O设备列表、打开的文件列表等。
操作系统有两种主要队列:I/O请求队列和就绪队列。就绪队列包括所有准备执行并等待CPU的进程。每个进程有PCB,PCB链接起来就形成了就绪队列。调度队列:进程进入系统时,会被加到作业队列中,该队列包括系统中的所有进程。长期调度程序和短期调度程序,主要的差别是它们执行的频率。长期(作业)调度通过选择进程来争用CPU,通常场地调度会受资源分配考虑;而短期调度从就绪队列中选择进程。有的操作系统如分时系统,可能引入另外的中期调度系统,能将进程从内存中移出,从而降低多道程序设计的程度。
大多数操作系统根据一个唯一的进程标识符(process identifier,pid)来标识进程,pid通常是一个整数值。操作系统必须为父进程创建子进程提供一种机制。父进程在继续之前可以等待它的子进程终止,也可以并发执行父进程和子进程。创建子进程时,初始化数据有父进程传递给子进程。
进程间通信:并发执行的优点1)信息共享:由于多个用户可能对同样的信息感兴趣;2)提高运算速度,如果希望一个特定任务快速运行,那么必须将它分成子任务,每个子任务可以与其他子任务并行执行。3)模块化,可能需要按模块化方式构造系统。4)方便,单个用户也可能同时执行许多任务。协作进程需要一种进程间通信机制(interprocess communication,IPC)来允许进程相互交换数据与信息。进程间通信有两种基本模式:1)共享内存,2)消息传递。在共享内存模式中,建立起一块供协作进程共享的内存区域,进程通过向此共享区域读或写入数据来交换信息。在消息传递模式中,通过在协作进程间交换消息来实现通信。这两种发发并不互相排斥,能在同一操作系统内同时实现。消息传递可以是阻塞或非阻塞也称为同步或异步。socket,RPC远程过程调用,RMI远程方法调用。RMI是RPC的JAVA版。RPC与RMI,RPC支持子程序编程,即只能调用远程的子程序或函数,而RMI是基于对象的额,支持调用远程对象的方法。在RPC中,远程过程的参数是普通数据结构,而RMI可以将对象作为参数传递给远程方法。
第四章 线程
线程是CPU使用的单元,它由线程ID、程序计数器、寄存器集合和栈组成。它与属于同一进程的其他线程共享代码段、数据段和其他操作系统资源,如打开文件和信号。多线程编程的优点:1)响应度高2)资源共享3)经济4)多处理器体系结构的利用。
有两种不同方法来提供线程支持:用户层的用户线程或内核层的内核线程。1)多对一模型:将多个用户级线程映射到一个内核线程。如果一个线程执行了阻塞系统调用,那么整个进程会阻塞。2)一对一模型:将每个用户线程映射到一个内核线程。3)多对多模型:多路复用了许多用户线程到同样数量或更小数量的内核线程上。
线程库为程序员提供创建和管理线程的API。主要有两种方法来实现线程库。Java程序中有两种创建线程的技术,一种是创建一个新的类,从thread类派生,重载run()函数;另一种是定义一个实现runnable接口的类。创建thread对象并不会创建一个新的线程,实际是用start函数来创建新的线程。
用户线程对程序员来说是可见的,而对内核来说却是未知的。通常,用户线程跟内核线程相比,创建和管理要更快,因为它不需要内核干预。
第5章 CPU调度
CPU的成功调度依赖于进程的如下属性:进程执行由CPU执行和I/O等待周期组成。进程在这两个状态之间切换。
调度算法:1)先到先服务调度FCFS;2)最短作业;3)优先调度算法SJF;4)优先级调度算法;5)转轮法RR调度算法是专门为分时系统设计的;6)多级队列调度,将就绪队列分成多个独立的队列;7)多级反馈队列调度,允许进程在队列之间移动,主要根据不同CPU区间的特点;优先级和SJF调度会产生饥饿,老化技术可以阻饥饿。
多处理器调度:非对称多处理,对称多处理SMP
第6章 进程同步
临界区问题。每个进程必须请求允许进入其临界区,这一请求的代码段称为进入区,临界区之后有退出区,其余代码为剩余区。临界区问题的解答需要满足如下三项:互斥、前进、有限等待。
Peterson算法,这是一个经典的基于软件的临界区问题的解答。
信号量S是个整数变量,除了初始化外,它只能通过两个标准原子操作:wait()和signal()来访问。这些操作原来被称为P(测试)和V(增加)。通常操作系统区分计数信号量与二进制信号量,计数信号量的值域不受限制,而二进制信号量的值只能为0或1,可称为互斥锁。最大的缺点是忙等,进程在其等待锁时还在运行称为自旋锁,自旋锁有其优点,不进行上下文切换,锁占用时间短则有用。在具有忙等的信号量的经典定义下,信号量的值不可能为负,但修改为阻塞后的实现可能产生负的信号量值。如果信号量的值喂负,那么其绝对值就是等待该信号量的进程的个数。每个信号量包括一个整数值和一个PCB链表的指针。管程,
第7章 死锁
一个系统满足如下4个条件,引起死锁:互斥,占有并等待、非抢占、循环等待。
死锁避免:安全序列,进程顺序 第三部分 内存管理 第8章 内存管理 内存必须容纳操作系统和各种用户进程。通常分为两个区域:一个用于驻留操作系统,另一个用于用户进程。 分页内存管理方案允许进程的物理地址空间可以是非连续的。 不同的内存管理算法(连续分配,分页,分段,以及分页与分段结合)在许多方面呈现出不同的特点。需要考虑以下: 1)硬件支持:对单分区和多分区方案,只需要一个基地址寄存器或一对基地址和界限寄存器,对于分页和分段,需要映射表以定义地址映射。2)性能:随着内存管理算法变得越来越复杂,逻辑地址到物理地址的映射所需要的时间也有所增加。3)碎片:4)重定位:外部碎片问题的解决方案之一是紧缩。紧缩涉及在内存中移动程序而不影响到程序。这种方案要求在执行时逻辑地址能动态地进行重定位。5)交换:进程可以定时地从内存交换到外存再交换到内存。6)共享:7)保护 第9章 虚拟内存 引用串 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1,三个帧 页置换算法:1)FIFO页置换,选择最旧的页置换,最开始的3个引用会引起页错误,总共有15帧错误。存在belady异常2)最优页置换算法OPT,页错误率最低的,置换最长时间不会使用的页,有9个页错误。3)最近最少使用算法LRU页置换,置换最长时间没有使用的页,有12次错误。 虚拟内存通常采用按需调页方式来实现。纯按需调页只有在引用页时才调入页。第一次引用就会使操作系统产生页错误。操作系统检查内部表确定该页在备份仓库上的位置。接着,它找到空闲帧并从备份仓库中读入页。更新页表以反映这一修改,并重新执行产生页错误的指令。使用按需调页以降低分配给进程的帧数,这种安排能增加多道程序的程度,且(至少从理论上说)增加了系统CPU的使用率。即使进程内存需要超过总的物理内存,也能允许进程运行。 第四部分 存储管理 第10章文件系统接口 访问方法:顺序访问、直接访问