操作系统任务调度(包你学会)

合集下载

操作系统的任务管理与调度算法

操作系统的任务管理与调度算法

操作系统的任务管理与调度算法一、什么是操作系统的任务管理?操作系统就是计算机硬件和软件之间的一层抽象,它是管理计算机硬件的软件系统。

其中重要的一个功能是任务管理。

任务管理是操作系统为程序的执行提供的一种机制。

从更广泛的角度来看,任务还可以表示为进程或线程。

在操作系统中,每个任务都有自己的地址空间,即进程的代码和数据。

操作系统的任务管理可以协调并调度多个进程或线程的执行,以此保证计算机资源的高效利用和系统的稳定性。

二、操作系统的任务调度算法任务调度算法是操作系统为管理并调度任务所采用的一种机制。

它的目的是使系统在满足各类约束条件的前提下,实现高效地利用计算机资源,并且保证系统的响应速度和处理能力。

操作系统有多种不同的任务调度算法,下面介绍常用的几种:1. 先来先服务(FCFS)调度算法先来先服务调度算法是一种最简单的任务调度算法,它是以任务的到达时间为标准,先到先执行的原则。

如果一个任务已经占用CPU,那么其他任务只能等它执行完毕后再执行。

2. 最短剩余时间(SRT)调度算法最短剩余时间调度算法是基于FCFS算法的改进,它是按照任务的总执行时间进行排序的。

在SRT算法中,每次调度都会选取剩余时间最短的任务进行执行,直到它执行完毕或者被抢占。

3. 轮转调度(RR)算法轮转调度算法是一种基于时间片的调度算法。

在轮转调度算法中,CPU时间被划分为固定长度的时间段,每个任务只能占用一个时间段。

当一个时间段结束时,当前执行的任务将被抢占,然后被放进队尾,而轮到就绪队列中下一个任务执行。

4. 优先级调度(PR)算法优先级调度算法是根据任务的优先级进行调度的。

在优先级调度算法中,每个任务都有自己的优先级。

如果多个任务都处于就绪状态,那么具有最高优先级的任务将被先执行。

5. 多级反馈队列(MFQ)算法多级反馈队列是一种折中的算法,它结合了上面的几种调度算法的优点,并避免了其缺点。

在MFQ算法中,任务被分为多个队列,每个队列有不同的优先级和时间量。

操作系统调度课件

操作系统调度课件

05 操作系统调度的实现
上下文切换
上下文切换是操作系统在进程切换时保存和恢复当前进程运行环境的过程 。
上下文切换包括保存当前进程的上下文(如CPU寄存器、内存信息等)和 恢复新进程的上下文,以便新进程能够继续执行。
上下文切换对于实现多任务处理和资源共享至关重要,可以提高系统的效 率和响应速度。
进程状态转换
VS
详细描述
这是一种常见的调度算法,适用于长作业 环境。系统为每个进程分配一个优先级, 优先级高的进程会优先获得处理器。当多 个进程同时等待时,系统会选择优先级最 高的进程进行调度。这种算法可以满足一 些紧急任务的需求,但可能导致一些低优 先级的进程长时间得不到服务。
多级反馈队列调度
总结词
根据进程的等待时间和优先级进行多级反馈 队列调度。
调度算法分类
先进先出(FIFO):按照进程到达的先后顺序进行调 度,先到达的进程优先获得处理器。
输标02入题
优先级调度:根据进程优先级的高低进行调度,优先 级高的进程优先获得处理器。
01
03
循环轮转调度(Round Robin):按照固定的时间片 长度,依次将处理器分配给就绪队列中的进程,时间
片用完后,进程回到就绪队列尾部重新等待。
04
最短剩余时间优先(Shortest Remaining Time First ):根据进程剩余执行时间进行调度,剩余时间最短 的进程优先获得处理器。
调度策略比较
01
先进先出策略简单易实现,但不 适用于所有场景;
02
优先级调度可以满足紧急任务的 需求,但可能导致低优先级进程
长时间等待;
最短剩余时间优先可以减少等待 时间,但可能导致处理器频繁切 换;

理解计算机中的操作系统调度

理解计算机中的操作系统调度

理解计算机中的操作系统调度操作系统是计算机中最重要的组成部分之一,它负责管理和协调计算机系统中的各种软硬件资源。

其中,操作系统调度是操作系统的核心功能之一,它决定了各个进程如何在计算机系统中进行调度和执行。

一、调度的概念在计算机系统中,多个进程同时运行,而CPU资源只有一个,因此需要操作系统对这些进程进行合理的调度,以达到高效利用CPU资源的目的。

调度的主要目标是提高系统的吞吐量、响应时间和公平性。

二、调度的分类操作系统调度可以根据不同的调度策略进行分类。

常见的调度算法有以下几类:1.先来先服务调度(FCFS)先来先服务调度是最简单的调度策略之一,按照进程到达的顺序进行调度。

这种调度策略存在“饥饿”现象,即长作业会占用CPU资源,导致短作业需要等待时间较长。

2.最短作业优先调度(SJF)最短作业优先调度是根据进程的执行时间进行调度,执行时间越短的进程越先执行。

这种调度策略可以使得平均等待时间最短,但需要预先知道每个进程的执行时间,实际应用中很难准确估计。

3.优先级调度优先级调度是根据进程的优先级进行调度,优先级越高的进程越先执行。

这种调度策略可以根据进程的重要性和紧迫程度进行合理调度,但可能存在低优先级进程饥饿的问题。

4.时间片轮转调度时间片轮转调度是将CPU时间划分为固定长度的时间片,每个进程在一个时间片内执行,时间片用完后切换到下一个进程。

这种调度策略可以保证公平性,但可能存在进程切换开销过大的问题。

5.多级反馈队列调度多级反馈队列调度是通过设置多个优先级队列,每个队列的时间片长度不同,每个进程在一个队列内执行,如果用完时间片仍未完成,则降低其优先级放到下一个队列中执行。

这种调度策略可以兼顾吞吐量和响应时间的要求。

三、调度算法的选择在实际应用中,操作系统可以根据不同的应用场景选择不同的调度算法。

如果要求响应时间较短,可以选择最短作业优先或优先级调度;如果要求公平性,可以选择时间片轮转或多级反馈队列调度。

计算机基础知识了解计算机操作系统的进程调度和资源分配

计算机基础知识了解计算机操作系统的进程调度和资源分配

计算机基础知识了解计算机操作系统的进程调度和资源分配计算机基础知识:了解计算机操作系统的进程调度和资源分配计算机操作系统是管理计算机硬件和软件资源的关键组件,它负责协调系统中各个进程的执行和资源的分配。

进程调度和资源分配是操作系统的核心功能,它们决定了计算机系统的性能和效率。

本文将对计算机操作系统的进程调度和资源分配进行详细介绍。

一、进程调度进程是指正在执行的程序,它是操作系统中最基本的执行单位。

在多道程序环境下,多个进程可以同时存在于计算机系统中,进程调度就是根据一定的策略和算法,决定系统中哪个进程获得CPU的使用权。

1. 作业调度作业调度是指从外存中选择合适的作业调入内存,为其创建进程并分配资源的过程。

作业调度算法主要根据作业的类型和优先级进行选择,以确保系统资源的高效利用,并实现对作业的合理处理。

2. 进程调度进程调度是指从就绪队列中选择合适的进程分配给CPU执行的过程。

进程调度算法主要根据进程的优先级、执行时间和资源需求等因素进行选择,以确保系统中各个进程公平地获得CPU的时间片,并实现对进程的高效调度。

3. 短作业优先调度算法(SJF)短作业优先调度算法是根据作业执行时间的长短对作业进行排序,优先选择执行时间最短的作业分配给CPU执行。

短作业优先调度算法能够减少作业的等待时间,提高系统的吞吐量和响应速度。

4. 时间片轮转调度算法(RR)时间片轮转调度算法是将CPU的执行时间划分为固定长度的时间片,并按照调度顺序依次分配给就绪队列中的进程。

每个进程在一个时间片内得到CPU的使用权,当时间片用完后,进程会被放回就绪队列尾部,等待下一次调度。

二、资源分配资源分配是指操作系统通过一定的策略和算法,根据进程的需求为其分配合适的资源。

资源可以分为可剥夺资源和不可剥夺资源。

可剥夺资源是指进程使用期间可以被其他进程抢占的资源,如CPU和内存。

不可剥夺资源是指进程使用期间不可被抢占的资源,如打印机和磁盘。

操作系统的任务管理与调度技巧

操作系统的任务管理与调度技巧

操作系统的任务管理与调度技巧作为计算机领域中重要的组成部分,操作系统负责管理和协调计算机硬件和软件资源,以提供稳定高效的工作环境。

任务管理与调度是操作系统的核心功能之一,它能够合理地分配各项任务和资源,使计算机系统能够高效地运行。

本文将介绍一些常用的任务管理与调度技巧,帮助读者更好地理解操作系统的工作原理。

一、任务管理任务管理是操作系统中对任务进行组织和调度的过程。

以下是一些常用的任务管理技巧:1. 任务分配:操作系统需要合理地将任务分配给计算机的处理器,以充分利用计算机资源。

其中,常见的任务分配算法有:- 先来先服务(FCFS):按照任务到达的顺序进行调度,不考虑任务的执行时间。

适用于短任务和长任务混合的情况。

- 短作业优先(SJF):选择执行时间最短的任务先执行。

适用于任务执行时间差异较大的情况,可以减少平均等待时间。

- 优先级调度:为不同的任务设置不同的优先级,优先调度优先级高的任务。

适用于需要保证特定任务的及时响应的场景。

- 时间片轮转:将处理器时间划分为多个时间片,每个任务在一个时间片内执行,并按顺序轮转。

适用于多任务共享一个处理器的情况。

2. 进程间通信:在多任务处理的环境下,进程间通信是非常重要的。

常用的进程间通信技术有:- 共享内存:多个进程共同使用同一块内存区域,实现数据共享。

- 管道通信:通过管道在进程间传递数据,分为有名管道和无名管道。

- 消息队列:通过消息队列传递消息,实现进程间异步通信。

- 进程信号:通过发送信号来实现进程的通知和中断。

二、调度技巧调度是指操作系统按照一定的算法和策略,合理地决定下一个需要执行的任务。

以下是一些常用的调度技巧:1. 抢占式调度:抢占式调度是指某个任务能够中断当前任务的执行,并立即获得处理器的调度权。

这种调度可以增加系统的响应能力,但会增加上下文切换的开销。

2. 周期性调度:周期性调度是指按照固定的周期来进行任务的调度,如实时操作系统中的周期性任务。

操作系统有哪些主要调度算法

操作系统有哪些主要调度算法

操作系统有哪些主要调度算法操作系统调度算法一、磁盘调度1.先来先服务fcfs:是按请求访问者的先后次序启动磁盘驱动器,而不考虑它们要访问的物理位置2.最短一般说来时间优先sstf:使距当前磁道最近的命令访问者启动磁盘驱动器,即是使查找时间最短的那个作业先继续执行,而不考量命令访问者到来的先后次序,这样就消除了先来先服务调度算法中磁臂移动过小的问题3.扫描算法scan或电梯调度算法:总是从磁臂当前位置开始,沿磁臂的移动方向去选择离当前磁臂最近的那个柱面的访问者。

如果沿磁臂的方向无请求访问时,就改变磁臂的移动方向。

在这种调度方法下磁臂的移动类似于电梯的调度,所以它也称为电梯调度算法。

4.循环读取算法cscan:循环读取调度算法就是在读取算法的基础上改良的。

磁臂改成单项移动,由外向里。

当前边线已经开始沿磁臂的移动方向回去挑选距当前磁臂最近的哪个柱面的访问者。

如果沿磁臂的方向并无命令出访时,再返回最外,出访柱面号最轻的作业命令。

操作系统调度算法二、进程调度算法1.先进先出算法fifo:按照进程步入准备就绪队列的先后次序去挑选。

即为每当步入进程调度,总是把准备就绪队列的队首进程资金投入运转。

2.时间片轮转算法rr:分时系统的一种调度算法。

轮转的基本思想是,将cpu的处理时间划分成一个个的时间片,就绪队列中的进程轮流运行一个时间片。

当时间片结束时,就强迫进程让出cpu,该进程进入就绪队列,等待下一次调度,同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。

3.最低优先级算法hpf:进程调度每次将处理机分配给具备最低优先级的准备就绪进程。

最低优先级算法可以与相同的cpu方式融合构成可以抢占市场式最低优先级算法和不容抢占市场式最低优先级算法。

4.多级队列反馈法:几种调度算法的结合形式多级队列方式。

操作系统调度算法三、常用的批处理作业调度算法1.先来先服务调度算法fcfs:就是按照各个作业进入系统的自然次序来调度作业。

如何进行操作系统调度和进程管理

如何进行操作系统调度和进程管理

如何进行操作系统调度和进程管理操作系统调度和进程管理是操作系统中非常重要的功能,它负责管理系统中的进程、资源分配和进程间的调度。

本文将详细介绍操作系统调度和进程管理的相关概念、原理和实践方法。

一、进程和线程的概念1.1进程:进程是程序的一次执行过程,是程序在计算机中的一次执行活动,它是程序在执行过程中分配和管理资源的基本单位。

每个进程都有自己的地址空间、堆栈、数据区等资源,进程之间彼此独立,互不干扰。

1.2线程:线程是进程中的一条执行路径,是进程的实体,每个进程可以包含多个线程。

线程共享相同的地址空间和其他资源,可以很方便地进行通信和数据交换。

二、进程管理2.1进程的状态:在操作系统中,进程可以处于运行状态、就绪状态和阻塞状态。

运行状态表示进程正在执行,就绪状态表示进程已经准备好执行,阻塞状态表示进程由于某种原因暂时无法执行。

2.2进程的创建和终止:进程的创建可以通过程序的加载、复制已有进程等方式实现,而进程的终止可以通过调用exit()系统调用、异常终止等方式实现。

2.3进程控制块(PCB):PCB是操作系统中用于保存和管理进程信息的数据结构,包括进程的状态、优先级、资源需求等信息。

PCB可以帮助操作系统对进程进行管理和调度。

2.4进程同步和通信:在多进程环境下,进程之间需要进行同步和通信以确保数据的一致性和正确性。

操作系统提供了多种机制来实现进程之间的同步和通信,比如信号量、互斥锁、消息队列等。

三、进程调度3.1进程调度的目的:进程调度的主要目的是提高系统的资源利用率和响应速度,保证系统的稳定性和性能。

通过合理的调度算法,可以实现进程之间的公平调度,并且避免进程死锁、饥饿等问题。

3.2调度算法:常见的调度算法包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等。

不同的调度算法适用于不同的场景,可以根据系统的特点和需求选择合适的算法。

3.3进程优先级调度:进程可以设置不同的优先级,高优先级的进程会得到更多的CPU 时间片,保证系统的响应速度和性能。

操作系统常用调度算法

操作系统常用调度算法

操作系统常⽤调度算法在操作系统中存在多种调度算法,其中有的调度算法适⽤于作业调度,有的调度算法适⽤于进程调度,有的调度算法两者都适⽤。

下⾯介绍⼏种常⽤的调度算法。

先来先服务(FCFS)调度算法FCFS调度算法是⼀种最简单的调度算法,该调度算法既可以⽤于作业调度也可以⽤于进程调度。

在作业调度中,算法每次从后备作业队列中选择最先进⼊该队列的⼀个或⼏个作业,将它们调⼊内存,分配必要的资源,创建进程并放⼊就绪队列。

在进程调度中,FCFS调度算法每次从就绪队列中选择最先进⼊该队列的进程,将处理机分配给它,使之投⼊运⾏,直到完成或因某种原因⽽阻塞时才释放处理机。

下⾯通过⼀个实例来说明FCFS调度算法的性能。

假设系统中有4个作业,它们的提交时间分别是8、8.4、8.8、9,运⾏时间依次是2、1、0.5、0.2,系统⾤⽤FCFS调度算法,这组作业的平均等待时间、平均周转时间和平均带权周转时间见表2-3。

表2-3 FCFS调度算法的性能作业号提交时间运⾏时间开始时间等待时间完成时间周转时间带权周转时间18280102128.4110 1.611 2.6 2.638.80.511 2.211.5 2.7 5.4490.211.5 2.511.7 2.713.5平均等待时间 t = (0+1.6+2.2+2.5)/4=1.575平均周转时间 T = (2+2.6+2.7+2.7)/4=2.5平均带权周转时间 W = (1+2.6+5.牡13.5)/4=5.625FCFS调度算法属于不可剥夺算法。

从表⾯上看,它对所有作业都是公平的,但若⼀个长作业先到达系统,就会使后⾯许多短作业等待很长时间,因此它不能作为分时系统和实时系统的主要调度策略。

但它常被结合在其他调度策略中使⽤。

例如,在使⽤优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。

FCFS调度算法的特点是算法简单,但效率低;对长作业⽐较有利,但对短作业不利(相对SJF和⾼响应⽐);有利于CPU繁忙型作业,⽽不利于I/O繁忙型作业。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

上图,就是TTS的最基本的结构,在它的后面,操作系统还可以另外增加若干字节以存放一些额外的数据,不过CPU只使用最基本的共104字节的空间。

从上面的结构中我们可以看见,里面几乎保存了一个进程运行所需要使用的CPU的所有信息,下面,我们就来详细研究下这个结构。

在上图中,已经用三种色彩将上述的TSS结构分成了三部份,对于“未用”部份我们可以不必理会,另外还有两个部份:“CPU自动更新区”及“CPU只读区”,所谓“自动更新”是指当CPU在进行任务切换的时候,会自动将当前任务的相关信息存放到TSS的相应位置中,这样,CPU就保存了当前任务的相关信息。

“只读区”是指CPU在任务切换时会从中读取相关信息,但是,在任务被切换出去的时候,不会保存它们,因此,“只读区”的信息是由操作系统在创建任务的时候就指定好的,CPU只是读取而不会去修改它们。

从上图中,我们知道了CPU将当前任务的相关信息保存在什么地方,不过这个TSS实在是太大了!它不可能放在CPU中,而只能被放在内存中,因此我们还需要一个指针只向内存中的TSS,这样CPU就可以通过这个指针找到相应的TSS了,这样的指针有两种,我们分别将其称为“TSS描述符”和“任务门”。

“TSS 描述符”及“任务门”的结构与用途下面我们还是先来看看“TSS描述符”的结构:上图就是“TSS描述符”结构,从图中我们可以看见,它给出了一个TSS所在的内存位置以及TSS的大小。

这里需要注意的是,从前面的TSS基本结构图中我们可以知道一个TSS基本结构最小不能小于104字节,因此,这里的TSS的大小限制最小是103(TSS的最小结构的大小104 – 1)。

另外还要特别引起注意的就是图中的“B”位,这一标志位用来标志一个任务是否是忙任务。

如果B位被清零,那么我们就说这个任务是一个“可用任务”,如果B位被置1,我们说这个任务是一个“忙任务”,所谓“忙任务”是指它正在被运行,或者它是一个被任务链链接起来的任务,明白“B”位的用处在实际的编程序非常重要,但在这里不打算详加描述,把详细的描述留给下面的文字完成。

从上图我们可以看出,一个“TSS描述符”指代了一个TSS结构,按理来说,这已经完全足够使用了,但是用于Intel允许在中断的时候也可以进行任务切换,这样,我们就可以把中断处理程序作为一个专门的任务,然而,中断描述符表中存放的只能是门描述符,而上面的“TSS描述符”并不是一种门描述符,因此,它不能被放在中断描述符表中,于是Intel又定义了一种“任务门”,它其实指向的是一个“TSS描述符”,但由于它是一种门描述符,因此,它可以被放在中断描述符表中,这样当发生中断的时候,CPU通过中断号查询中断描述符表,得到相应的门描述符,如果发现它是一个“任务门”,则通过它找到相应的“TSS描述符”,再通过相应的“TSS描述符”找到相应的“TSS结构”。

其实,我总觉得定义“任务门”有点多此一举,但Intel已经这样做了,我们也就不得不照办。

下面,我们就来看看“任务门”的结构:上图就是“任务门”的结构,其中被用到的地方极少,Intel真是浪费啊!P位与DPL 位与前面的“TSS描述符”中的相应位的作用是一样的,这里就不多述说了,余下就说说“TSS 选择符”吧。

从前面的TSS描述符我们以经知道了,一个“TSS描述符”指代了一个TSS结构,通过它我们可以知道一个TSS结构在内存中的位置。

那么我们又怎样得到一个“TSS描述符”的呢?它又是放在什么地方的呢?在操作系统中,这样的TSS描述符由于会被CPU、中断服务程序、其它进程访问,因此它只能放在“全局描述符表”中(有“关全局描述符表”在《操作系统引导探究》一文中有详细描述)。

因此我们需要用一个索引来指出“TSS描述符”在全局描述符表中的位置,这样我们就可以找到相应的“TSS描述符”了,这个索引就被称之为“TSS选择符”,顾名思义,它是用来在“全局描述符表”中选择“TSS描述符”的。

下面,我们通过一个图来看看CPU是怎么进行任务切换的,这个地方比较有趣的是“任务门”与“TSS描述符”都是放在“全局描述符”表中的,并且都需要一个索引指出它们在表中的位置,而这个索引都是一个选择符,分别称为“任务门选择符”与“TSS选择符”。

CPU任务切换行为概述上图就是一个任务切换发生情况的示意图,我们下面就来详细说明一下这个图。

从图上我们可以看出,CPU在下述三种情况下发生了任务切换:1. 使用了jmp,call指令,而指令的操作符,也即目标地址指向了一个“TSS描述符”或者一个“任务门描述符”。

(而这个任务门描述符其实还是指向了一个“TSS描述符”)。

2. 产生了中断,而中断向量指向了中断向量表中的一个“任务门描述符”。

3. 使用了IRET指令,并且在执行这个指令的时候EFLAGS寄存器中的NT位被置1了。

而在这三种情况下发生的任务切换CPU还有不同的动作,下面就让我们来详细的看一看。

1. 如果这个切换是由 jmp 指令引起的,那么,CPU会首先进行特权检查,并检查目标任务的B位(忙位)是否为0,然后CPU将目标任务的B位置为1,把当前任务的B位清零,随后,CPU把当前任务的状态信息压入相应的TSS结构中,并从目标任务的TSS结构中取出相应信息,这样,就完成了一次任务切换。

2. 如果这个切换是由 call 指令或中断引起的,那么,CPU在进行完特权检查后,同样会检查目标任务的B位是否为0,然后,CPU将目标任务的EFLAGS中的NT为置1,并将当前任务的“TSS描述符”放入目标任务的Link字段,之后,CPU把当前任务的状态信息压入相应的TSS结构中,并从目标任务的TSS结构中取出相应信息,完成任务切换。

3. 如果这个切换是由 iret 指令引起的(注意,此时当前任务的EFLAGS中的NT位是被置1的),那么CPU在进行完特权检测之后,会检查目标任务的B位是否为1(注意,这里是要求为1,而不是先前的0),之后,会把当前任务的B位清零,并且把当前任务的EFLAGS中的NT位清零,随后,CPU把当前任务信息压入相应的TSS结构中,并从目标任务的TSS结构中取出相应信息,完成任务切换。

从上面所描述的CPU的行为特征中我们不难发现,jmp 指令只是一个很单纯的跳转指令,从一个任务跳转到另一个任务,CPU不会做更多的操作,而在call指令与中断引发的任务切换中,CPU会把当前任务的“TSS描述符”放入目标任务的“TSS描述符”的Link 字段中,并设置相应的状态位,这样,就相当于一个链表一样将当前任务与目标任务链接起来了,这样当使用iret指令的时候,就可以从目标任务返回原任务中执行。

这一特性在中断处理中特别有用,因为,你可以直接用 iret 指令,从中断服务任务中返回原任务继续运行。

描述了这么多,有这么多的任务,这么多的“TSS描述符”同时存在,那么CPU怎样知道哪个“TSS描述符”所指代的任务是当前正在执行中的当前任务呢?其实在CPU内部有一个TR(任务寄存器),它里面存放的就是当前正在执行的任务的“TSS描述符”,在发生任务切换的时候,CPU也会自动将新任务的“TSS描述符”载入其中。

好了,有关本实验所用到的基本知识已介绍完毕,下面我们将来看看在实际的操作系统中,这一切都是怎么通过代码去实现的。

Go!~~pyos 本实验相关问题概述通过前面几个实验,也许大家对 pyos 已经比较熟悉了,不过作为一个正在开发中的系统来说,不断的修改与完善是必不可少的,在本次实验中,pyos 又在结构上做了比较大的调整。

本实验报告所用的 pyos 是 2004_05_31_10_00 版,你可以在 (纯C论坛)上找到它的全部源代码。

由于 pyos 目前还没有完成磁盘驱动与文件管理这块,因此,本实验所用到的两个进程,A进程与B进程,是直接写到映象文件中的指定位置,并在系统启动后由setup程序直接读到内存指定位置的。

下面我们来看看这两个进程的代码:#include "video.h"extern "C" void user_main(){static int i = 0 ;for( ;; ){if( ++i == 0xfffffff ){ // 延迟class_pyos_Video::Print( "_A_" ) ;i = 0 ;}}}上面的代码就是A进程的代码,B进程的代码与之几乎完全一样,只不过输出的不是“_A_”而是“-B-”。

首先我们使用 pyos_gcc 将它们分别编译:out/pyos_gcc.exe source/A_Process.cpp 0x80000 out/A_Process.binout/pyos_gcc.exe source/B_Process.cpp 0x90000 out/B_Process.bin其中的 0x80000,是指A进程将会被放在内存中的地址,同样0x90000是B进程被放在内存中的位置,在启动的时候,它们分别会被setup.asm程序读到上述指定的内存地址中。

有关这部份编译内容在源代码包中compile.bat文件里有详细描述,这里就不多说了,感兴趣的朋友可以看看相关源代码。

下面我们还是直接来看看内核代码吧:/* 内核主函数 */extern "C" void pyos_main(){/* 系统初始化 */class_pyos_System::Init() ;/* 清屏,打印欢迎信息 */class_pyos_Video::Clear() ;class_pyos_Video::Print( "Pyos Task Switch Experiment\n" ) ;/* 安装时钟中断 */class_pyos_System::InstallCpuTimeInterrupt() ;/* 许可时钟中断 */class_pyos_System::EnableCpuTimeInterrupt() ;/* 打开中断 */class_pyos_Interrupt::OpenInterrupt() ;for( ;; ) ;}内核代码非常简单,注释也很详细,这里就只捡重点的说了。

当内核运行之后,会打开时钟中断,在时钟中断里,系统会进行计数,看看到底发生了多少次中断,而每一次时钟中断,在pyos中都看做是一个最基本的时间片。

随后,中断服务程序会与当前正在运行的进程所拥有的时间片进行比较,看看进程的时间片是否用光,如果用光了,时钟中断服务程序就进行任务切换。

下面,我们就来看看这段代码:/* 时钟中断处理函数 */void class_pyos_System::HandleCpuTimeInterrupt(){// 发生时钟中断,准备进行任务切换static int i = 0 ;unsigned int processNo = class_pyos_Process::CurrentProcessNumber ;if( processNo == 0 ){// 如果现在是内核进程,则切换到下个进程,并保证不再切换到内核进程processNo = processNo % 2 + 1 ;}else{// 如果不是内核进程,则时间片+1++i ;if( i == class_pyos_Process::ProcessQueue[ processNo ].CpuTime ){// 如果一个进程的cpu时间到,且切换到下一进程processNo = processNo % 2 + 1 ;// 重新计算时间片i = 0 ;}}class_pyos_Process::CurrentProcessNumber = processNo ;unsigned int base ;// 先进行解连处理,取得先前任务的 TSS 描述符base = m_gdt.TSS[ 3 ].Base_0_15 ;base |= ( m_gdt.TSS[ 3 ].Base_16_23 << 16 ) ;base |= ( m_gdt.TSS[ 3 ].Base_24_31 << 24 ) ;struct_pyos_TSS *pTss = ( struct_pyos_TSS * )base ;base = pTss->Link ;// 将先前任务标记为非忙任务base += ( unsigned int )&m_gdt ;struct_pyos_TSSItem* p = ( struct_pyos_TSSItem * )base ;p->B = 0 ;// 将欲执行的任务描述符标记为忙任务class_pyos_System::m_gdt.TSS[ processNo ].B = 1 ;// 把当前任务(时钟中断处理程序的Link换成欲跳转到的任务选择子)pTss->Link = class_pyos_Process::ProcessQueue[ processNo ].TssSelector ;return ;}这里,时钟中断首先进行了解链处理,因为在前面的描述中我们知道了,在中断引起的任务切换中,会将原任务的TSS描述符放入中断服务程序的TSS中的Link字段中,这样在中段返回的时候,就可以返回到原任务去执行,现在由于在中断服务程序中需要切换到另外一个任务去执行,而不能直接返回到被中断的原任务中运行(因为,如果还是返回到被中断的原任务中继续运行,就无法完成任务调度了)。

相关文档
最新文档