From bebbca1a5ceac87f3bd2c79cca4a0a848610c0bc Mon Sep 17 00:00:00 2001 From: Didnelpsun <2675350965@qq.com> Date: Thu, 14 Jul 2022 23:22:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Operate-System/0-summary.md | 18 +- Operate-System/1-process-management-ex.md | 16 +- Operate-System/1-process-management.md | 219 ++++++++++++++++------ 3 files changed, 187 insertions(+), 66 deletions(-) diff --git a/Operate-System/0-summary.md b/Operate-System/0-summary.md index d9fe62b..8ccd33b 100644 --- a/Operate-System/0-summary.md +++ b/Operate-System/0-summary.md @@ -435,14 +435,16 @@ ## 操作系统引导 -1. 激活$CPU$。 -2. 硬件自检。 -3. 加载操作系统硬盘。 -4. 加载主引导记录$MBR$。 -5. 扫描硬盘分区表,加载硬盘活动分区。 -6. 加载分区引导记录$PBR$。 -7. 加载启动管理器。 -8. 加载操作系统。 +1. 激活$CPU$。充电,$CS:IP$指向$FFFF0H$。 +2. 执行$JMP$指令跳转到$BIOS$(基本输入输出系统)。$BIOS$是一组固化到计算机内主板上一个$ROM$芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从$CMOS$中读写系统设置的具体信息。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。此外,$BIOS$还向作业系统提供一些系统参数。系统硬件的变化是由$BIOS$隐藏,程序使用$BIOS$功能而不是直接控制硬件。现代作业系统会忽略$BIOS$提供的抽象层并直接控制硬件组件。 +3. 登记$BIOS$中断例程入口地址。读取$ROM$中的$boot$程序,将指令寄存器置为$BIOS$的第一条指令,即开始执行$BIOS$的指令。 +4. 硬件自检,并识别已连接的外设。检查硬件是否出现故障。如有故障,主板会发出不同含义的蜂鸣,启动中止。如无故障,屏幕会显示$CPU$、内存、硬盘等信息。 +5. 加载带有操作系统硬盘。硬件自检后,$BIOS$开始读取$Boot\,Sequence$(通过$CMOS$里保存的启动顺序,或者通过与用户交互的方式),把控制权交给启动顺序排在第一位的存储设备,然后$CPU$将该存储设备引导扇区的内容加载到内存中。 +6. 在$ROM$中加载主引导记录$MBR$。硬盘以特定的标识符区分引导硬盘和非引导硬盘。如果发现一个存储设备不是可引导盘,就检查下一个存储设备。如无其他启动设备,就会死机。主引导记录$MBR$的作用是告诉$CPU$去硬盘的哪个主分区去找操作系统。 +7. $MBR$扫描硬盘分区表,加载硬盘活动分区。$MBR$包含硬盘分区表,硬盘分区表以特定的标识符区分活动分区和非活动分区。主引导记录扫描硬盘分区表,进而识别含有操作系统的硬盘分区(活动分区)。找到硬盘活动分区后,开始加载硬盘活动分区,将控制权交给活动分区。 +8. $MBR$加载分区引导记录$PBR$。即该分区的启动程序(操作系统引导扇区),读取活动分区的第一个扇区,这个扇区称为分区引导记录($PBR$),其作用是寻找并激活分区根目录下用于引导操作系统的程序(启动管理器)。 +9. 加载启动管理器。分区引导记录搜索活动分区中的启动管理器,加载启动管理器。 +10. 加载操作系统。 ## 虚拟机 diff --git a/Operate-System/1-process-management-ex.md b/Operate-System/1-process-management-ex.md index cee359a..28d0171 100644 --- a/Operate-System/1-process-management-ex.md +++ b/Operate-System/1-process-management-ex.md @@ -128,6 +128,20 @@ $D.$不能被调用 解:$B$。进程是暂时的,程序是永久的;进程是动态的,程序是静态的;进程至少由代码、数据和$PCB$组成,程序仅需代码和数据即可;程序代码经过多次创建可对应不同的进程,而同一个系统的进程(或线程)可以由系统调用的方法被不同的进程(或线程)多次使用。 +#### 线程实现 + +**例题** 下面关于用户级线程和内核级线程的描述中,错误的是()。 + +$A.$采用轮转调度算法,进程中设置内核级线程和用户级线程的效果完全不同 + +$B.$跨进程的用户级线程调度也不需要内核参与,控制简单 + +$C.$用户级线程可以在任何操作系统中运行 + +$D.$若系统中只有用户级线程,则处理机的调度对象是进程 + +解:$B$。对于$A$,如果是同一个进程中的线程进行切换,用户级线程不需要内核参与,而相反内核级线程则需要,所以使用轮转调度算法进行切换时实现方式是完全不同的。对于$B$,只有相同进程的用户级线程切换可以直接在用户态完成,如果要跨进程用户级线程就需要进行进程调度,从而需要内核参与。对于$C$,用户级线程的维护由应用进程完成,不需要操作系统内核了解用户级线程的存在,因此可在任何操作系统中运行。对于$D$,如果系统只有用户态线程,则线程对操作系统是不可见的,操作系统只能调度进程;如果系统中有内核态线程,则操作系统可以按线程进行调度。 + #### 多线程系统 **例题** 在以下描述中,()并不是多线程系统的特长。 @@ -140,7 +154,7 @@ $C.$键盘驱动程序为每个正在运行的应用配备一个线程,用以 $D.$基于$GUI$的调试程序用不同的线程分别处理用户输入、计算和跟踪等操作 -解:$C$。对于题目所提的不算多线程系统的特长,即找出下面情形可以用一个线程就可以完成的情况。整个系统只有一个键盘,而且键盘输入是人的操作,速度比较慢,完全可以使用一个线程来处理整个系统的键盘输入。 +解:$C$。对于题目所提的不算多线程系统的特长,即找出下面情形可以用一个线程就可以完成的情况。多线程适用于复杂并发的操作,而整个系统只有一个键盘,而且键盘输入是人的操作,速度比较慢,完全可以使用一个线程来处理整个系统的键盘输入。 ## 处理机调度 diff --git a/Operate-System/1-process-management.md b/Operate-System/1-process-management.md index a553aa6..637d537 100644 --- a/Operate-System/1-process-management.md +++ b/Operate-System/1-process-management.md @@ -6,6 +6,7 @@ + 程序指一个指令序列。 + 进程为了满足操作系统的并发性和共享性。 ++ 进程和程序的根本区别在于其动态性。(注意:所以进程不能与程序相等) + 系统为每个运行的程序配置一个数据结构,称为**进程控制块PCB**,用来描述进程的各种信息,如程序代码存放位置。 + $PCB$、程序段、数据段三个部分构成了进程实体(进程映像),简称为进程。 + 创建进程就是创建$PCB$,销毁进程就是销毁$PCB$,$PCB$是进程存在的唯一标志。 @@ -20,12 +21,12 @@ + $PCB$:操作系统用$PCB$来管理进程,所以$PCB$包含所有管理进程所需的信息。 + 进程描述信息: + 进程标识符$PID$:标识进程。 - + 用户标识符$UID$:标识进程归属的用户1,用于共享和保护服务。 + + 用户标识符$UID$:标识进程归属的用户,用于共享和保护服务。 + 进程控制和管理信息: + 进程当前状态:进程状态信息,作为处理机发分配调度的依据。 + 进程优先级:进程抢占处理机的优先级。 + 代码运行入口地址。 - + 程序外村地址。 + + 程序外存地址。 + 进入内存时间。 + 处理机占用时间。 + 信号量使用。 @@ -53,7 +54,7 @@ #### 进程组织 -当一个系统中存在多格$PCB$时,需要以适当的方式组织$PCB$。 +当一个系统中存在多个$PCB$时,需要以适当的方式组织$PCB$。 + 链接方式: + 按照进程状态将$PCB$分为多个队列。如执行指针(指针数为最大执行并行数)、就绪队列指针(一般会把优先级高的进程放在队头)、阻塞队列指针(许多操作系统会根据阻塞原因的不同将其分为多个阻塞队列)。 @@ -81,9 +82,9 @@ + 系统为进程分配运行所需资源。 + 进程转为就绪态。 + 终止态(结束态):进程运行结束或出现错误导致进程被撤销,操作系统需要回收进程资源,撤销$PCB$等工作,以防止内存泄漏。 -+ 挂起态:暂时不能获得服务,进程映像调到外存等待(阻塞态的进程映像还在内存中等待)。分为: - + 就绪挂起态:准备好后在外存中。 - + 阻塞挂起态:等待事件在外存中。 ++ 挂起态:暂时不能获得服务,进程映像调到外存等待(对应进程的$PCB$还在内存中等待并允许被修改)。分为: + + 就绪挂起态:准备好后在外存中,只要允许可以随时进入内存。 + + 阻塞挂起态:等待事件在外存中,必须等待一定时间发生。 #### 进程状态转换 @@ -119,6 +120,8 @@ 父进程创建子进程后,父进程与子进程同时执行(并发)。主程序调用子程序后,主程序暂停在调用点,子程序开始执行,直到子程序返回,主程序才开始执行。 +父进程和子进程可以共享一部分资源,但是不能共享虚拟地址空间,因为这是逻辑地址。且其有不同的$PCB$用于区分进程。 + #### 进程控制原语 前四种是必要的。 @@ -178,22 +181,22 @@ 进程通信是进程之间的信息交换。 -为了保证安全,一个进程不能直接访问另一个进程的地址空间。$PV$操作是低级通信方式,高级通信方式有: +为了保证安全,一个进程不能直接访问另一个进程的地址空间,但是又必须有进程通信。$PV$操作是低级通信方式,高级通信方式有: + 共享存储:分配一个可以共同使用的共享空间,进程对其的使用必须是互斥的(使用同步互斥工具如$PV$操作)。 + 基于数据结构:共享空闲只能放固定的数据结构如数组等。速度慢,限制多,是低级通信方式。 - + 基于存储取:内存中划出一块共享存储区,数据的形式、存放位置都由进程控制而非操作系统。速度更快,限制少,是高级通信方式。 + + 基于存储:内存中划出一块共享存储区,数据的形式、存放位置都由进程控制而非操作系统。速度更快,限制少,是高级通信方式。 + 信息传递:进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。 + 消息包括消息头和消息体,消息头包括:发送进程$ID$、接受进程$ID$、消息类型、消息长度等格式化的信息。 + 消息传递包括: + 直接通信方式:消息直接挂到接受进程的信息缓冲队列上。 + 间接通信方式:消息先发送到中间实体(信箱)中,因此也称为信箱通信方式,如计算机网络中的电子邮件系统。 -+ 管道通信:是消息传递的特殊方式,指用于链接各自一个的读写进程的一个共享文件,又名$pipe$文件,其实就是内存中开辟一个大小固定的缓冲区。 ++ 管道通信:是消息传递的特殊方式,指用于链接各自一个的读写进程的一个共享文件,又名$pipe$文件,其实就是内存中开辟一个大小**固定**的缓冲区。 + 只能使用半双工的通信,某一时间段内只能单向传输,若要双向同时通信则必须设置两个管道。 + 进程需要互斥访问管道,需要满足互斥、同步、确定对方存在。 + 数据以字符流的形式写入管道,当满时,写进程的$write()$系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的$read()$系统调用将被阻塞。 - + 如果没有写满则不允许读,如果没有读空则不允许写。 - + 数据一旦被读出就被管道抛弃,所以读进程只能至多有一个,否则可能会读错。 + + 如果没有**写满**则不允许读,如果没有**读空**则不允许写。所以读写都可能被堵塞。 + + 数据一旦被读出就被管道抛弃,所以读进程只能**至多**有一个,否则可能会读错。 + 共享文件:利用操作系统提供的文件共享功能实现进程之间的通信。也需要信号量来解决文件共享操作中的同步和互斥问题。 ### 线程 @@ -204,17 +207,18 @@ 由线程$ID$、程序计数器$PC$、寄存器集合和堆栈组成。 -线程是基本的$CPU$执行单元,是程序执行流的最小单位,是处理机的分配单元。进程只作为除$CPU$之外的系统资源的分配单元,即打印机等都是分配给线程而不是进程。 +线程是$CPU$**执行**的基本单元,是程序执行流的最小单位,是处理机的分配单元。进程只作为除$CPU$之外的系统资源的分配单元,即打印机等都是分配给线程而不是进程。 #### 线程与进程 + 系统分配调度: + 传统进程机制中,进程是资源分配、调度的基本单位。 - + 引入线程后,进程是资源分配的基本单位,线程是调度的基本单位。 + + 引入线程后,进程是**资源分配**的基本单位,线程是**调度**的基本单位。 + 同一进程中,线程切换不会导致进程切换,在不同进程进行线程切换才会引起进程切换。 + 拥有资源: + 进程都是拥有资源的基本单位,线程除了必备的资源不拥有系统资源。 + 线程可以拥有同进程的所有资源。 + + 同进程的所有线程共享进程地址空间。 + 并发性: + 传统进程机制中,只能进程间并发。 + 引入线程后,各线程间也能并发,提升了并发度。 @@ -243,29 +247,71 @@ + 切换同进程内的线程,系统开销很小。 + 切换进程,系统开销较大。 +#### TCB + +线程控制块$TCB$是与进程的控制块$PCB$相似的子控制块,只是$TCB$中所保存的线程状态比$PCB$中保存少而已。 + #### 线程实现 -+ 用户级线程$ULT$: - + 用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责(包括线程切换)。 - + 用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。 - + 在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。用户级线程对用户不透明,对操作系统透明。 - + “ 用户级线程”就是“从用户视角看能看到的线程”。 -+ 内核级线程(内核支持的线程)$KLT$: - + 内核级线程的管理工作由操作系统内核完成。 - + 线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。 - + “内核级线程” 就是“从操作系统内核视角看能看到的线程”。 - + 由于操作系统只能看见内核级线程,所以只有内核级线程才是处理机分配的单位。 +线程库($thread\,library$)是为程序员提供创建和管理线程的$API$。线程库中的线程都是单例模式,所以不同的进程使用线程库中的同名线程都是同一个线程。实现线程库主要的方法有如下两种: + +1. 在用户空间中提供一个没有内核支持的库。这种库的所有代码和数据结构都位于用户空间中。这意味着,调用库内的一个函数只导致用户空间中的一个本地函数的调用。 +2. 实现由操作系统直接支持的内核级的一个库。对于这种情况,库内的代码和数据结构位于内核空间。调用库中的一个$API$函数通常会导致对内核的系统调用。 + +用户级线程$ULT$: + ++ 用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责(包括线程切换)。 ++ 用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。 ++ 在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。用户级线程对用户不透明,对操作系统透明。 ++ 所以操作系统无法操作用户级线程,就不会给用户级线程分配$TLB$。 + + +优点: + ++ 线程切换不需要转换到内核空间,节省了模式切换的开销。 ++ 调度算法可以是进程专用的,不同的进程可根据自身的需要,对自己的线程选择不同的调度算法。 ++ 用户级线程的实现与操作系统平台无关,对线程管理的代码是属于用户程序的一部分。 + +缺点: + ++ 系统调用的阻塞问题,当线程执行一个系统调用时,不仅该线程被阻塞,而且进程内的所有线程都被阻塞。 ++ 不能发挥多处理机的优势,内核每次分配给一个进程的仅有一个$CPU$,因此进程中仅有一个线程能执行。 + +内核级线程(内核支持的线程)$KLT$: + ++ 内核级线程的管理工作由操作系统内核完成。 ++ 线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。 ++ 内核级线程就是从操作系统内核视角看能看到的线程。 + + +优点: + ++ 能发挥多处理机的优势,内核能同时调度同一进程中的多个线程并行执行。 ++ 如果进程中的一个线程被阻塞,内核可以调度该进程中的其他线程占用处理机,也可运行其他进程中的线程。 ++ 内核支持线程具有很小的数据结构和堆栈,线程切换比较快、开销小。 ++ 内核本身也可采用多线程技术,可以提高系统的执行速度和效率。 + +缺点: + ++ 同一进程中的线程切换,需要从用户态转到核心态进行,系统开销较大。这是因为用户进程的线程在用户态运行,而线程调度和管理是在内核实现的。 + +组合方式: + ++ 有些系统使用组合方式的多线程实现。 ++ 在组合实现方式中,内核支持多个内核级线程的建立、调度和管理,同时允许用户程序建立、调度和管理用户级线程。 ++ 一些内核级线程对应多个用户级线程,这是用户级线程通过时分多路复用内核级线程实现的。 ++ 同一进程中的多个线程可以同时在多处理机上并行执行,且在阻塞一个线程时不需要将整个进程阻塞。 #### 多线程模型 -对于用户级线程映射到内核级线程的问题出现了“多线程模型”问题。 +组合方式同时支持用户线程和内核线程,对于用户级线程如何映射到内核级线程的问题出现了“多线程模型”问题。 + 多对一模型: - + 多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。 + + 多个用户级线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。多个用户级线程共用一个线程控制块。 + 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。 + 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。 + 一对一模型: - + 一个用户及线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。 + + 一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。操作系统给每个用户线程建立一个线程控制块。 + 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。 + 缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。 + 多对多模型: @@ -281,34 +327,53 @@ ### 处理机调度的层次 -+ 高级调度(作业调度): - + 由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业从外存调入内存的顺序。一般一个作业包含多个进程。 - + 高级调度按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立$PCB$),以使它(们)获得竞争处理机的权利。 - + 高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的$PCB$,作业调出时才撤销$PCB$。 - + 多道批处理系统多具备,其他系统一般不需要。 - + 高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。 - + 调动执行频率低。 -+ 中级调度(内存调度): - + 引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。 - + 目的是为了提高内存利用率和系统吞吐量。 - + 暂时调到外存等待的进程状态为挂起状态。值得注意的是,$PCB$并不会一起调到外存,而是会常驻内存。$PCB$中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的$PCB$来保持对各个进程的监控、管理。被挂起的进程$PCB$会被放到内存里的挂起队列中,当条件具备转为就绪态。 - + 中级调度就是要决定将哪个处于挂起状态的进程重新调入内存。 - + 一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。 -+ 低级调度(进程调度): - + 其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。 - + 进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。 - + 进程调度的频率很高,一般几十毫秒一次。 -  |工作内容|发生位置|发生频率|对进程状态的影响 :----:|:------:|:-----:|:-----:|:-------------: 高级调度(作业调度)|按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程|外存→内存(面向作业)|一个作业一个调入一次调出|无→创建态→就绪态 中级调度(内存调度)|按照某种规则,从挂起队列中选择合适的进程将其数据调回内存|外存→内存(面向进程)|中等|挂起态→就绪态(阻塞挂起→阻塞态) 低级调度(进程调度)|按照某种规则,从就绪队列中选择一个进程为其分配处理机|内存→$CPU$|最高|就绪态→运行态 +#### 高级调度 + +即作业调度: + ++ 由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业从外存调入内存的顺序。一般一个作业包含多个进程。 ++ 高级调度按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立$PCB$),以使它(们)获得竞争处理机的权利。 ++ 高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的$PCB$,作业调出时才撤销$PCB$。 ++ 多道批处理系统多具备,其他系统一般不需要。 ++ 高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。 ++ 调动执行频率低。 + +#### 中级调度 + +即内存调度: + ++ 引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。 ++ 目的是为了提高内存利用率和系统吞吐量。 ++ 暂时调到外存等待的进程状态为挂起状态。值得注意的是,$PCB$并不会一起调到外存,而是会常驻内存。$PCB$中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的$PCB$来保持对各个进程的监控、管理。被挂起的进程$PCB$会被放到内存里的挂起队列中,当条件具备转为就绪态。 ++ 中级调度就是要决定将哪个处于挂起状态的进程重新调入内存。 ++ 一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。 + +#### 低级调度 + +即进程调度: + ++ 其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。 ++ 进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。 ++ 进程调度的频率很高,一般几十毫秒一次。 + ### 进程调度 进程调度是最低级的调度也是其他调度的基础,是内核程序。 +#### 调度程序 + +即调度器,用于调度和分派$CPU$的组件。 + ++ 排队器。 ++ 分派器。 ++ 上下文切换器。 + #### 进程调度的时机 需要进行进程调度和切换: @@ -355,21 +420,22 @@ + 可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。 + 适合于分时操作系统、实时操作系统。 -#### 进程切换与过程 +#### 闲逛进程 -进程调度与进程切换的区别: +在进程切换时,如果系统中没有就绪进程,就会调度闲逛进程($idle$)运行,如果没有其他进程就绪,该进程就一直运行,并在执行过程中测试中断。闲逛进程的优先级最低,没有就绪进程时才会运行闲逛进程,只要有进程就绪,就会立即让出处理机。 -+ 狭义的进程调度指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况就需要进程切换)。 -+ 进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。 -+ 广义的进程调度包含了选择一个进程和进程切换两个步骤。 +闲逛进程不需要$CPU$之外的资源,它不会被阻塞。 -进程切换的过程主要完成了: +#### 线程调度 -1. 对原来运行进程各种数据的保存 -2. 对新的进程各种数据的恢复。 -(如程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)。 - -注意:进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。 ++ 用户级线程调度: + + 由于内核并不知道线程的存在,所以内核还是和以前一样,选择一个进程,并给予时间控制。 + + 由进程中的调度程序决定哪个线程运行。 + + 用户级线程的线程切换在同一进程中进行,仅需少量的机器指令。 ++ 内核级线程调度: + + 内核选择一个特定线程运行,通常不用考虑该线程属于哪个进程。 + + 对被选择的线程赋予一个时间片,如果超过了时间片,就会强制挂起该线程。 + + 内核级线程的线程切换需要完整的上下文切换、修改内存映像、使高速缓存失效,这就导致了若干数量级的延迟。 ### 调度算法 @@ -386,8 +452,7 @@  |先来先服务|短作业优先|高响应比优先|时间片轮转|多级反馈队列 :----:|:--------:|:--------:|:----------:|:----:|:---------: -能否是可抢占|否|能|能|能|队列内算法不一定 -能否是不可抢占|能|能|能|否|队列内算法不一定 +能否是可抢占|否|是|是|是|队列内算法不一定 优点|公平,实现简单|平均等待时间最少,效率最高|兼顾长短作业|兼顾长短作业|兼颐长短作业,有较好的响应时间,可行性强| 缺点|不利于短作业|长作业会饥饿,估计时间不易确定|计算响应比的开销大|平均等待时间较长,上下文切换浪费时间|无 适用于|无|作业调度,批处理系统|无|分时系统|通用 @@ -538,6 +603,46 @@ 各就绪队列的调度算法也可能不是时间片调度算法而是别的,但是基本上都是差不多的计算方式。 +### 进程切换 + +#### 上下文切换 + +切换$CPU$到另一个进程需要保存当前进程状态并恢复另一个进程的状态,这个就是上下文切换。进程切换主要需要完成上下文切换的任务。上下文切换实质上是指处理机从一个进程的运行转到另一个进程上运行,在这个过程中,进程的运行环境产生了实质性的变化。 + +进程切换的过程主要完成了: + ++ 对原来运行进程各种数据的保存。 ++ 对新的进程各种数据的恢复。 +(如程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)。 + +过程如下: + +1. 挂起一个进程,保存$CPU$上下文,包括程序计数器和其他寄存器。 +2. 更新$PCB$信息。 +3. 把进程的$PCB$移入相应的队列,如I就绪、在某事件阻塞等队列。 +4. 选择另一个进程执行,并更新其$PCB$。 +5. 跳转到新进程$PCB$中的程序计数器所指向的位置执行。 +6. 恢复处理机上下文。 + +#### 进程切换消耗 + +进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。 + +可以使用多个寄存器组,这样切换时只需要简单改变当前寄存器组的指针。 + +#### 进程调度与进程切换区别 + ++ 狭义的进程调度指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况就需要进程切换)。 ++ 进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。 ++ 广义的进程调度包含了选择一个进程和进程切换两个步骤。 ++ 调度是一个决策,而切换是一个实际行为。 + +#### 模式切换与进程切换区别 + +模式切换指从用户态切换到核心态或相反,其进程中断或异常,本身没有改变当前进程所以没有进程切换。 + +进程切换只能在核心态中完成。 + ## 进程同步与互斥 ### 进程同步与互斥的基本概念