进程调度

合集下载

操作系统实验报告进程调度

操作系统实验报告进程调度

操作系统实验报告进程调度操作系统实验报告:进程调度引言在计算机科学领域中,操作系统是一个重要的概念,它负责管理和协调计算机系统中的各种资源,包括处理器、内存、输入/输出设备等。

其中,进程调度是操作系统中一个非常重要的组成部分,它负责决定哪个进程在何时获得处理器的使用权,以及如何有效地利用处理器资源。

实验目的本次实验的目的是通过对进程调度算法的实验,深入理解不同的进程调度算法对系统性能的影响,并掌握进程调度算法的实现方法。

实验环境本次实验使用了一台配备了Linux操作系统的计算机作为实验平台。

在该计算机上,我们使用了C语言编写了一些简单的进程调度算法,并通过模拟不同的进程调度场景进行了实验。

实验内容1. 先来先服务调度算法(FCFS)先来先服务调度算法是一种简单的进程调度算法,它按照进程到达的顺序进行调度。

在本次实验中,我们编写了一个简单的FCFS调度算法,并通过模拟多个进程同时到达的情况,观察其对系统性能的影响。

2. 短作业优先调度算法(SJF)短作业优先调度算法是一种根据进程执行时间长度进行调度的算法。

在本次实验中,我们编写了一个简单的SJF调度算法,并通过模拟不同长度的进程,观察其对系统性能的影响。

3. 时间片轮转调度算法(RR)时间片轮转调度算法是一种按照时间片大小进行调度的算法。

在本次实验中,我们编写了一个简单的RR调度算法,并通过模拟不同时间片大小的情况,观察其对系统性能的影响。

实验结果通过实验,我们发现不同的进程调度算法对系统性能有着不同的影响。

在FCFS 算法下,长作业会导致短作业等待时间过长;在SJF算法下,长作业会导致短作业饥饿现象;而RR算法则能够较好地平衡不同进程的执行。

因此,在实际应用中,需要根据具体情况选择合适的进程调度算法。

结论本次实验通过对进程调度算法的实验,深入理解了不同的进程调度算法对系统性能的影响,并掌握了进程调度算法的实现方法。

同时,也加深了对操作系统的理解,为今后的学习和研究打下了良好的基础。

实验一、进程调度实验报告

实验一、进程调度实验报告

实验一、进程调度实验报告一、实验目的进程调度是操作系统中的核心功能之一,其目的是合理地分配 CPU 资源给各个进程,以提高系统的整体性能和资源利用率。

通过本次实验,我们旨在深入理解进程调度的原理和算法,掌握进程状态的转换,观察不同调度策略对系统性能的影响,并通过实际编程实现来提高我们的编程能力和对操作系统概念的理解。

二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。

三、实验原理1、进程状态进程在其生命周期中会经历不同的状态,包括就绪态、运行态和阻塞态。

就绪态表示进程已经准备好执行,只等待 CPU 分配;运行态表示进程正在 CPU 上执行;阻塞态表示进程由于等待某个事件(如 I/O操作完成)而暂时无法执行。

2、调度算法常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等。

先来先服务算法按照进程到达的先后顺序进行调度。

短作业优先算法优先调度执行时间短的进程。

时间片轮转算法将 CPU 时间划分成固定大小的时间片,每个进程轮流获得一个时间片执行。

四、实验内容1、设计并实现一个简单的进程调度模拟器定义进程结构体,包含进程 ID、到达时间、执行时间、剩余时间等信息。

实现进程的创建、插入、删除等操作。

实现不同的调度算法。

2、对不同调度算法进行性能测试生成一组具有不同到达时间和执行时间的进程。

分别采用先来先服务、短作业优先和时间片轮转算法进行调度。

记录每个算法下的平均周转时间、平均等待时间等性能指标。

五、实验步骤1、进程结构体的定义```c++struct Process {int pid;int arrivalTime;int executionTime;int remainingTime;int finishTime;int waitingTime;int turnaroundTime;};```2、进程创建函数```c++void createProcess(Process processes, int& numProcesses, int pid, int arrivalTime, int executionTime) {processesnumProcessespid = pid;processesnumProcessesarrivalTime = arrivalTime;processesnumProcessesexecutionTime = executionTime;processesnumProcessesremainingTime = executionTime;numProcesses++;}```3、先来先服务调度算法实现```c++void fcfsScheduling(Process processes, int numProcesses) {int currentTime = 0;for (int i = 0; i < numProcesses; i++){if (currentTime < processesiarrivalTime) {currentTime = processesiarrivalTime;}processesistartTime = currentTime;currentTime += processesiexecutionTime;processesifinishTime = currentTime;processesiwaitingTime = processesistartTime processesiarrivalTime;processesiturnaroundTime = processesifinishTime processesiarrivalTime;}}```4、短作业优先调度算法实现```c++void sjfScheduling(Process processes, int numProcesses) {int currentTime = 0;int minExecutionTime, selectedProcess;bool found;while (true) {found = false;minExecutionTime = INT_MAX;selectedProcess =-1;for (int i = 0; i < numProcesses; i++){if (processesiarrivalTime <= currentTime &&processesiremainingTime < minExecutionTime &&processesiremainingTime > 0) {found = true;minExecutionTime = processesiremainingTime;selectedProcess = i;}}if (!found) {break;}processesselectedProcessstartTime = currentTime;currentTime += processesselectedProcessremainingTime;processesselectedProcessfinishTime = currentTime;processesselectedProcesswaitingTime =processesselectedProcessstartTime processesselectedProcessarrivalTime;processesselectedProcessturnaroundTime =processesselectedProcessfinishTime processesselectedProcessarrivalTime;processesselectedProcessremainingTime = 0;}}```5、时间片轮转调度算法实现```c++void rrScheduling(Process processes, int numProcesses, int timeSlice) {int currentTime = 0;Queue<int> readyQueue;for (int i = 0; i < numProcesses; i++){readyQueueenqueue(i);}while (!readyQueueisEmpty()){int currentProcess = readyQueuedequeue();if (processescurrentProcessarrivalTime > currentTime) {currentTime = processescurrentProcessarrivalTime;}if (processescurrentProcessremainingTime <= timeSlice) {currentTime += processescurrentProcessremainingTime;processescurrentProcessfinishTime = currentTime;processescurrentProcesswaitingTime =processescurrentProcessstartTime processescurrentProcessarrivalTime;processescurrentProcessturnaroundTime =processescurrentProcessfinishTime processescurrentProcessarrivalTime;processescurrentProcessremainingTime = 0;} else {currentTime += timeSlice;processescurrentProcessremainingTime = timeSlice;readyQueueenqueue(currentProcess);}}}```6、性能指标计算函数```c++void calculatePerformanceMetrics(Process processes, int numProcesses, double& averageWaitingTime, double& averageTurnaroundTime) {double totalWaitingTime = 0, totalTurnaroundTime = 0;for (int i = 0; i < numProcesses; i++){totalWaitingTime += processesiwaitingTime;totalTurnaroundTime += processesiturnaroundTime;}averageWaitingTime = totalWaitingTime / numProcesses; averageTurnaroundTime = totalTurnaroundTime / numProcesses;}```7、主函数```c++int main(){Process processes100;int numProcesses = 0;//创建进程createProcess(processes, numProcesses, 1, 0, 5);createProcess(processes, numProcesses, 2, 1, 3);createProcess(processes, numProcesses, 3, 2, 4);createProcess(processes, numProcesses, 4, 3, 2);//先来先服务调度fcfsScheduling(processes, numProcesses);double fcfsAverageWaitingTime, fcfsAverageTurnaroundTime;calculatePerformanceMetrics(processes, numProcesses, fcfsAverageWaitingTime, fcfsAverageTurnaroundTime);cout <<"先来先服务调度的平均等待时间:"<<fcfsAverageWaitingTime << endl;cout <<"先来先服务调度的平均周转时间:"<<fcfsAverageTurnaroundTime << endl;//短作业优先调度sjfScheduling(processes, numProcesses);double sjfAverageWaitingTime, sjfAverageTurnaroundTime;calculatePerformanceMetrics(processes, numProcesses, sjfAverageWaitingTime, sjfAverageTurnaroundTime);cout <<"短作业优先调度的平均等待时间:"<<sjfAverageWaitingTime << endl;cout <<"短作业优先调度的平均周转时间:"<<sjfAverageTurnaroundTime << endl;//时间片轮转调度(时间片为 2)rrScheduling(processes, numProcesses, 2);double rrAverageWaitingTime, rrAverageTurnaroundTime;calculatePerformanceMetrics(processes, numProcesses, rrAverageWaitingTime, rrAverageTurnaroundTime);cout <<"时间片轮转调度(时间片为 2)的平均等待时间:"<< rrAverageWaitingTime << endl;cout <<"时间片轮转调度(时间片为 2)的平均周转时间:"<< rrAverageTurnaroundTime << endl;return 0;}```六、实验结果与分析1、先来先服务调度平均等待时间:40平均周转时间:85分析:先来先服务调度算法简单直观,但对于短作业可能会造成较长的等待时间,导致平均等待时间和平均周转时间较长。

进程调度概念

进程调度概念

进程调度概念进程调度是操作系统中的一个重要概念,它涉及到如何合理分配和管理计算机资源,确保各个进程能够公平、高效地执行。

进程调度涉及到许多算法和策略,旨在提高系统的运行效率和响应时间。

本文将探讨进程调度的概念及其在操作系统中的应用。

概念解析进程调度是操作系统中的一个核心概念,它可以理解为操作系统对正在运行的进程进行优先级排列和调度执行的过程。

在单处理器系统中,进程调度决定了哪个进程将拥有处理器的执行权。

在多处理器系统中,进程调度还可以决定将哪些进程分配到哪个处理器上执行。

进程调度的目标进程调度的主要目标是提高系统的吞吐量和响应时间。

吞吐量表示单位时间内可以完成的任务数量,响应时间则表示从请求发出到系统给出响应所需要的时间。

为了实现这些目标,进程调度需要考虑多个因素,如进程的优先级、执行的时间片、进程等待时间等。

进程调度算法在实际应用中,有许多进程调度算法被广泛应用。

其中最早、最原始的是先来先服务(FCFS)调度算法,即根据进程到达的先后顺序进行调度。

这种算法简单直观,但存在“作业饥饿”问题,即后到达的长作业会导致前面的短作业等待时间过长。

为了解决FCFS算法的问题,人们提出了短作业优先(SJF)调度算法,即优先调度执行预计执行时间较短的进程。

这种算法可以最大限度地减少平均等待时间,提高系统的响应速度。

另外,还有时间片轮转(RR)调度算法,它将处理器的执行时间划分为固定长度的时间片,每个进程在一个时间片内执行,时间片过后,执行权交给下一个进程。

这种算法适合在多任务环境下使用,能够公平地分配处理器的执行时间。

还有其他一些调度算法,如最高响应比优先(HRRN)调度算法、多级反馈队列调度算法等。

这些算法根据不同的场景和需求,选择合适的优化策略,以提高系统的性能和效率。

进程调度的应用进程调度不仅仅在操作系统中发挥作用,在其他领域也有广泛的应用。

例如,工业自动化中的分布式控制系统,需要合理调度各个子系统之间的通信和任务执行,以实现高效的生产过程。

简述进程调度的主要功能。

简述进程调度的主要功能。

简述进程调度的主要功能。

进程调度是操作系统中的一个重要功能,其主要作用是合理地分配和利用系统资源,提高系统的效率和响应速度。

进程调度的目标是使得系统的CPU利用率高、响应时间短、吞吐量大,并且能够保证各个进程按照一定的优先级顺序得到执行。

进程调度的主要功能包括以下几个方面:1. 实现进程的创建和终止:进程调度需要负责管理系统中的各个进程,包括进程的创建和终止。

当一个新的进程被创建时,进程调度会为其分配合适的资源,并将其加入到就绪队列中等待执行。

当一个进程完成任务或者发生异常时,进程调度会将其从执行队列中移除,并释放其占用的资源。

2. 决定进程的执行顺序:进程调度需要根据一定的调度算法决定进程的执行顺序。

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

不同的调度算法有不同的优势和适用场景,可以根据实际情况选择合适的调度算法。

3. 分配CPU时间片:进程调度需要根据系统的运行状态和进程的优先级,合理地分配CPU时间片。

时间片是指每个进程在CPU上执行的时间段,时间片的长度可以根据实际情况进行调整。

较高优先级的进程可以获得更长的时间片,而较低优先级的进程则获得较短的时间片。

4. 处理进程的状态转换:进程调度需要根据进程的状态变化,进行相应的处理。

进程的状态包括就绪状态、运行状态、阻塞状态等。

当一个进程由就绪状态转变为运行状态时,进程调度需要将其从就绪队列中移除,并将其放入执行队列中。

当一个进程由运行状态转变为阻塞状态时,进程调度需要将其从执行队列中移除,并将其放入阻塞队列中等待条件满足后再次调度。

5. 处理进程的优先级调整:进程调度需要根据进程的优先级进行调整。

优先级可以根据进程的重要性、紧急程度、资源需求等因素来确定。

进程调度可以根据实时情况动态地调整进程的优先级,以便更好地满足系统的需求。

进程调度是操作系统中的一个核心功能,对于提高系统的性能和响应能力至关重要。

linux系统中调度的基本单位

linux系统中调度的基本单位

linux系统中调度的基本单位一、进程调度进程调度是操作系统中的一个重要组成部分,用于决定在多个进程同时竞争CPU资源时,应该选择哪个进程来执行。

Linux系统中的进程调度采用了时间片轮转调度算法。

时间片轮转调度是一种公平的调度算法,它将CPU的执行时间划分为一个个固定长度的时间片,每个进程在一个时间片内执行一段时间,然后切换到下一个进程。

这样可以保证每个进程都有机会执行,并且避免了长时间占用CPU 的情况。

二、线程调度线程调度是指在多线程应用程序中,操作系统决定哪个线程应该被执行的过程。

Linux系统中的线程调度和进程调度类似,同样采用时间片轮转调度算法。

不同的是,线程是共享同一个进程的资源,因此线程的切换相对于进程的切换来说更加轻量级。

线程调度的目标是尽可能地提高CPU利用率和系统响应速度。

三、任务调度任务调度是指在Linux系统中,操作系统决定何时执行某个任务的过程。

任务可以是周期性的,也可以是非周期性的。

周期性任务是指按照一定的时间间隔重复执行的任务,而非周期性任务则是指只执行一次的任务。

Linux系统中的任务调度使用了多种算法,如最早截止时间优先算法和最短作业优先算法等。

这些算法的目标是根据任务的优先级和执行时间来决定任务的执行顺序,以提高系统的性能和响应速度。

四、总结在Linux系统中,进程调度、线程调度和任务调度是操作系统中的重要组成部分。

进程调度决定在多个进程竞争CPU资源时的执行顺序,线程调度决定在多线程应用程序中哪个线程应该被执行,任务调度决定何时执行某个任务。

这些调度的基本单位都采用了时间片轮转调度算法,并根据不同的调度目标采用不同的调度策略。

通过合理的调度算法,可以提高系统的性能和响应速度,保证各个任务的执行顺序和时间片的分配合理。

进程调度

进程调度

Linux调度程序提高交互式程序的优先级,让它们运行更频繁。因此, 调度程序提供较长的默认时间片给交互式程序。此外,调度程序还能根 据进程的优先级动态调整分配给它的时间片,从而保证了优先级高的进 程,执行的频率高,执行时间长。通过动态掉正优先级和时间片的长度 机制,Linux调度性能不但非常稳定而且也很强健。
计算优先级和时间片
进程拥有一个初始的nice值(优先级),范围是-20~19,默认 是0,进程task_struct的static_prio域存放这个值,因为它 从一开始由用户指定,不能修改,所以是静态优先级。 调度程序用到的动态优先级存放在prio域里,动态优先级 是通过一个关于静态和进程交互性的函数关系计算而来。 effective_prio()函数返回一个进程的动态优先级。 调度程序通过一些推断来获取准确反映进程时I/O消耗型还 是处理器消耗型。 为了支持这种推断,Linux记录了一个进程用于休眠和用于 执行的时间。该值存放在task_struct的sleep_avg域中,范 围是从0到MAX_SLEEP_AVG。默认值是10毫秒, sleep_avg会根据它的休眠时间的长短而增长,直到最大值 为止,进程没运行一个节拍,sleep_avg就相应减少,直到 0为止。
可运行队列
调度程序中最基本的数据结构是运行队列。 可执行队列定义于kernel/sched.c中,由结构runqueue 表示,可执行队列是给定处理器上可执行进程的链表 ,每个处理器一个。每一个可投入运行的进程都惟一 的归属于一个可执行队列。此外,可执行队列中还包 含每个处理器的调度信息。因此,可执行队列是每一 个处理器最重要的数据结构。
重新计算时间片
操作系统在所有的进程的时间片都用完时,会重新计 算每个进程的时间片。 典型的实现是循环访问每个进程: for(系统中的每个人物){ 重新计算优先级 重新计算时间片 }

实验进程调度的实验报告

实验进程调度的实验报告

一、实验目的1. 加深对进程概念和进程调度算法的理解。

2. 掌握进程调度算法的基本原理和实现方法。

3. 培养编程能力和系统分析能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验内容1. 实现进程调度算法2. 创建进程控制块(PCB)3. 模拟进程调度过程四、实验原理进程调度是操作系统核心功能之一,负责将CPU分配给就绪队列中的进程。

常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转(RR)等。

1. 先来先服务(FCFS)算法:按照进程到达就绪队列的顺序进行调度。

2. 短作业优先(SJF)算法:优先调度运行时间最短的进程。

3. 优先级调度算法:根据进程的优先级进行调度,优先级高的进程优先执行。

4. 时间片轮转(RR)算法:每个进程分配一个时间片,按顺序轮流执行,时间片结束后进行调度。

五、实验步骤1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、运行时间、优先级、状态等信息。

2. 创建进程队列,用于存储就绪队列、等待队列和完成队列。

3. 实现进程调度算法:a. FCFS算法:按照进程到达就绪队列的顺序进行调度。

b. SJF算法:优先调度运行时间最短的进程。

c. 优先级调度算法:根据进程的优先级进行调度。

d. 时间片轮转(RR)算法:每个进程分配一个时间片,按顺序轮流执行。

4. 模拟进程调度过程:a. 初始化进程队列,将进程添加到就绪队列。

b. 循环执行调度算法,将CPU分配给就绪队列中的进程。

c. 更新进程状态,统计进程执行时间、等待时间等指标。

d. 当进程完成时,将其移至完成队列。

六、实验结果与分析1. FCFS算法:按照进程到达就绪队列的顺序进行调度,简单易实现,但可能导致短作业等待时间过长。

2. SJF算法:优先调度运行时间最短的进程,能提高系统吞吐量,但可能导致进程饥饿。

进程的调度实验报告(3篇)

进程的调度实验报告(3篇)

第1篇一、实验目的通过本次实验,加深对操作系统进程调度原理的理解,掌握先来先服务(FCFS)、时间片轮转(RR)和动态优先级(DP)三种常见调度算法的实现,并能够分析这些算法的优缺点,提高程序设计能力。

二、实验环境- 编程语言:C语言- 操作系统:Linux- 编译器:GCC三、实验内容本实验主要实现以下内容:1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、服务时间、优先级、状态等信息。

2. 实现三种调度算法:FCFS、RR和DP。

3. 创建一个进程队列,用于存储所有进程。

4. 实现调度函数,根据所选算法选择下一个执行的进程。

5. 模拟进程执行过程,打印进程执行状态和就绪队列。

四、实验步骤1. 定义PCB结构体:```ctypedef struct PCB {char processName[10];int arrivalTime;int serviceTime;int priority;int usedTime;int state; // 0: 等待,1: 运行,2: 完成} PCB;```2. 创建进程队列:```cPCB processes[MAX_PROCESSES]; // 假设最多有MAX_PROCESSES个进程int processCount = 0; // 实际进程数量```3. 实现三种调度算法:(1)FCFS调度算法:```cvoid fcfsScheduling() {int i, j;for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;if (processes[i].usedTime == processes[i].serviceTime) { processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); }for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(2)RR调度算法:```cvoid rrScheduling() {int i, j, quantum = 1; // 时间片for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;processes[i].serviceTime--;if (processes[i].serviceTime <= 0) {processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); } else {processes[i].arrivalTime++;}for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(3)DP调度算法:```cvoid dpScheduling() {int i, j, minPriority = MAX_PRIORITY;int minIndex = -1;for (i = 0; i < processCount; i++) {if (processes[i].arrivalTime <= 0 && processes[i].priority < minPriority) {minPriority = processes[i].priority;minIndex = i;}}if (minIndex != -1) {processes[minIndex].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[minIndex].processName);processes[minIndex].usedTime++;processes[minIndex].priority--;processes[minIndex].serviceTime--;if (processes[minIndex].serviceTime <= 0) {processes[minIndex].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[minIndex].processName); }}}```4. 模拟进程执行过程:```cvoid simulateProcess() {printf("请选择调度算法(1:FCFS,2:RR,3:DP):");int choice;scanf("%d", &choice);switch (choice) {case 1:fcfsScheduling();break;case 2:rrScheduling();break;case 3:dpScheduling();break;default:printf("无效的调度算法选择。

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

进程、线程与处理器的调度(1)进程的概念(Dijkstra)进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和调度的基本单位。

(2)进程与程序的联系与区别①程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。

而进程是程序在处理机上的一次执行过程,它是一个动态的概念。

②程序可以作为一种软件资料长期存在,而进程是有一定生命期的。

程序是永久的,进程是暂时的。

注:程序可看作一个菜谱,而进程则是按照菜谱进行烹调的过程。

③进程和程序组成不同:进程是由程序、数据和进程控制块三部分组成的。

④进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。

(3)进程的特征动态性:进程是程序的执行,同时进程有生命周期。

并发性:多个进程可同存于内存中,能在一段时间内同时执行。

独立性:资源分配和调度的基本单位。

制约性:并发进程间存在制约关系,造成程序执行速度不可预测性,必须对进程的并发执行次序、相对执行速度加以协调。

结构特征:进程由程序块、数据块、进程控制块三部分组成。

进程的三种基本状态:(1)运行态(running)当进程得到处理机,其执行程序正在处理机上运行时的状态称为运行状态。

在单CPU系统中,任何时刻最多只有一个进程处于运行状态。

在多CPU系统中,处于运行状态的进程数最多为处理机的数目。

(2)就绪状态(ready)当一个进程已经准备就绪,一旦得到CPU,就可立即运行,这时进程所处的状态称为就绪状态。

系统中有一个就绪进程队列,处于就绪状态进程按某种调度策略存在于该队列中。

(3)等待态(阻塞态)(Wait / Blocked )若一个进程正等待着某一事件发生(如等待输入输出操作的完成)而暂时停止执行的状态称为等待状态。

处于等待状态的进程不具备运行的条件,即使给它CPU,也无法执行。

系统中有几个等待进程队列(按等待的事件组成相应的等待队列)。

运行到等待:等待某事件的发生(如等待I/O完成)等待到就绪:事件已经发生(如I/O完成)运行到就绪:时间片到(例如,两节课时间到,下课)或出现更高优先级进程,当前进程被迫让出处理器。

就绪到运行:当处理机空闭时,由调度(分派)程序从就绪进程队列中选择一个进程占用CPU。

上述三种状态是进程最基本的状态,在实际的操作系统实现中,进程远不止这三种状态。

进程为什么要有“挂起”状态?由于系统不断创建进程,系统资源特别是主存已不能满足进程运行要求,此时必须将某些进程挂起(suspend),置于磁盘对换区,释放其所占资源,暂时不启用低级调度,起到平滑负载的目的。

进程的描述和组成进程内容及其状态集合称为进程映像。

包括:进程控制块:每个进程有一进程控制块,用来存储进程的标识信息、现场信息和控制信息。

程序块:核心栈:每个进程捆绑一个核心栈,进程在核心态工作时,用来保存中断/异常现场等。

数据块:存放程序私有数据,用户栈也在数据块中开辟。

进程上下文操作系统中把进程物理实体和支持进程运行的环境合称为进程上下文。

进程在其当前上下文中运行,当系统调度新进程占有处理器时,新老进程随之发生上下文切换。

即保存老进程状态而装入被保护了的新进程的状态,以便新进程运行进程上下文组成用户级上下文:由正文(程序)、数据、共享存储区、用户栈组成,占用进程的虚地址空间。

存器上下文:由程序状态字寄存器、指令计数器、栈指针、控制寄存器、通用寄存器等组成。

系统级上下文:由进程控制块、主存管理信息(页表或段表)、核心栈等组成。

进程控制块(Process Control Block,PCB)每个进程有且仅有一个进程控制块PCB是操作系统用于记录和刻划进程状态及有关信息的数据结构,是操作系统掌握进程的唯一资料结构。

系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志进程与PCB是一一对应的,在创建进程时,建立PCB,并伴随进程运行的全过程,直到进程撤消而撤消。

PCB就象我们的户口。

PCB的内容①标识信息进程标识ID:唯一,通常是一个整数进程组标识ID用户进程名用户组名②现场信息寄存器内容(通用寄存器内容、控制寄存器内容、栈指针等)③控制信息进程调度信息:如进程状态、等待时间、等待原因、进程优先级、队列指针等进程组成信息:如正文段指针、数据段指针、进程族系信息进程间通信信息:如消息队列指针、所使用的信号量和锁进程段、页表指针、进程映像在辅存地址CPU的占用和使用信息:如时间片剩余量、已占用CPU时间、已执行时间总和、定时器信息、记账信息进程特权信息:如主存访问权限、处理器特权资源清单:所需全部资源、已分得资源进程队列及其管理处于同一状态的所有PCB组织在一起的数据结构称为进程队列。

例如运行队列、就绪队列、等待队列。

同一状态进程的PCB既可按先来先到的原则排成队列;也可按优先数或其它原则排成队列。

通用队列组织方式:线性方式链接方式索引方式(1)线性方式OS根据进程的最大数目,静态分配主存中某块空间,所有进程的PCB都组织在一个线性表中。

优点:简单易行;缺点:限定了系统中进程最大数,经常要扫描整个线性表,调度效率较低。

(2)链接方式相同状态的进程PCB通过链接指针链接成一个队列。

不同状态的进程可排成不同的队列,如运行队列、就绪队列、等待队列。

等待队列按等待原因不同可排成多个等待队列。

(3)索引方式对具有相同状态的进程,分别设置各自的PCB索引表,如就绪索引表、等待索引表,记录PCB在PCB表中的地址.进程切换一个进程让出处理器,由另一个进程占用处理器的过程称为进程切换。

进程的切换使系统中的各进程均有机会占用CPU。

进程切换的步骤保存被中断进程的处理器现场信息修改被中断进程的进程控制块的有关信息,如进程状态等把被中断进程的进程控制块加入有关队列选择下一个占有处理器运行的进程修改被选中进程的进程控制块的有关信息根据被选中进程设置操作系统用到的地址转换和存储保护信息根据被选中进程恢复处理器现场进程的控制和管理进程是有生命周期的:产生、运行、暂停、终止。

进程生命周期的动态变化过程由进程管理程序来控制。

进程的控制和管理包括:进程创建进程撤消进程阻塞进程唤醒进程挂起进程激活这些控制和管理功能由操作系统中的原语实现。

原语是在核心态执行、完成系统特定功能的不可分割的过程。

原语的特点是执行过程中不允许被中断,是一个不可分割的基本单位,原语的执行是顺序的而不可能是并发的。

1.进程创建进程创建类似于人出生后要到派出所报户口。

进程创建过程:(1)在进程列表中增加一项,从PCB池中申请一个空闲PCB,为新进程分配惟一的进程标识符;(2)为新进程的进程映像分配地址空间。

进程管理程序确定加载到进程地址空间中的程序;(3)为新进程分配除主存空间外的其他各种所需资源;(4)初始化PCB,如进程标识符、处理器初始状态、进程优先级等;(5)把新进程状态置为就绪态,并移入就绪进程队列;(6)通知操作系统的某些模块,如记账程序、性能监控程序。

2.进程撤销进程完成其任务或出现严重错误后,操作系统调用进程撤消原语撤消进程。

相当于一个人死亡后,家人要去派出所消户口。

进程撤销过程:(1)根据撤销进程标识号,从相应队列中找到并移出它;(2)将该进程拥有的资源归还给父进程或操作系统;(3)若该进程拥有子进程,先撤销它的所有子进程,以防它们脱离控制;(4)回收PCB,并归还到PCB池。

3.进程阻塞和唤醒当一个处在运行状态的进程,因等待某个事件的发生(如等待打印机)而不能继续运行时,进程将调用阻塞原语来阻塞自己,进程的状态由运行态转换为等待态(阻塞态)。

当等待事件完成时,会产生一个中断,激活操作系统,在系统控制下将被阻塞的进程唤醒,这个进程将由阻塞状态转换成就绪状态。

进程阻塞步骤:(1)停止进程执行,保存现场信息到PCB(2)修改进程PCB有关内容,如进程状态由运行态改为等待态等,并把修改状态后的进程移入相应事件的等待队列中;(3)转入进程调度程序去调度其他进程运行。

进程唤醒步骤:(1)从相应的等待队列中移出进程;(2)修改进程PCB的有关信息,如进程状态改为就绪态,并移入就绪队列;(3)若被唤醒进程比当前运行进程优先级高,重新设置调度标志。

线程及其实现一、引入多线程的动机引入进程的目的是为了使多个程序并发执行,以改善资源使用率、提高系统效率。

再引入线程,则是为了减少程序并发执行时所付出的时空开销,使得并发粒度更细、并发性更好。

进程的两项功能1.进程是资源分配和保护基本单位。

2.进程同时又是一个可独立调度和分派的基本单位。

进程作为一个资源拥有者,在创建、撤消、切换中,系统必须为之付出较大时空开销。

所以系统中进程的数量不宜过多,进程切换的频率不宜过高,但这也就限制了并发程度的进一步提高。

为解决此问题,人们想到将进程的上述两个功能分开,即对作为调度和分派的基本单位,不同时作为独立分配资源的单位;对拥有资源的单位,不对之进行频繁切换,线程因而产生。

多线程环境中进程的定义进程是操作系统中除处理器外进行的资源分配和保护的基本单位,它有一个独立的虚拟地址空间,用来容纳进程映像(如与进程关联的程序与数据),并以进程为单位对各种资源实施保护,如受保护地访问处理器、文件、外部设备及其他进程(进程间通信)。

1.多线程环境中的线程概念线程是操作系统进程中能够并发执行的实体,是处理器调度和分派的基本单位。

每个进程内可包含多个可并发执行的线程。

线程自己基本不拥有系统资源,只拥有少量必不可少的资源:程序计数器、一组寄存器、栈。

同属一个进程的线程共享进程所拥有的主存空间和资源。

2.引入线程的好处创建一个新线程花费时间少(结束亦如此)两个线程的切换花费时间少因为同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核3.线程与进程的比较线程具有进程的许多特征,故又称轻型进程,传统进程称重型进程。

在引入线程的OS中,每一进程都拥有多个线程,至少一个。

(1)调度在传统OS中,拥有资源、独立调度和分派的基本单位都是进程,在引入线程的系统中,线程是调度和分派的基本单位,而进程是拥有资源的基本单位。

在同一个进程内线程切换不会产生进程切换,由一个进程内的线程切换到另一个进程内的线程时,将会引起进程切换。

(2)并发性在引入线程的系统中,进程之间可并发,同一进程内的各线程之间也能并发执行。

因而系统具有更好的并发性。

(3)拥有资源无论是传统OS,还是引入线程的OS,进程都是拥有资源的独立单位,线程一般不拥有系统资源,但它可以访问隶属进程的资源。

即一个进程的所有资源可供进程内的所有线程共享。

(4)系统开销进程的创建和撤消的开销要远大于线程创建和撤消的开销,进程切换时,当前进程的CPU环境要保存,新进程的CPU环境要设置,线程切换时只须保存和设置少量寄存器,并不涉及存储管理方面的操作,可见,进程切换的开销远大于线程切换的开销。

相关文档
最新文档