进程控制报告

合集下载

进程控制实验报告

进程控制实验报告

一、实验目的本次实验旨在通过Linux操作系统的实践操作,加深对进程控制概念的理解。

通过学习进程的创建、调度、同步、通信等基本操作,掌握进程控制的基本方法,并了解进程间通信的机制。

二、实验环境1. 硬件环境:Intel(R) Core(TM) i5-3210M CPU2.50GHz,4.00GB内存。

2. 软件环境:64位Linux操作系统。

三、实验内容1. 进程的创建与终止2. 进程的调度与优先级3. 进程同步与互斥4. 进程间通信四、实验步骤1. 进程的创建与终止(1)使用`fork()`函数创建子进程,通过比较返回值判断创建是否成功。

```cpid_t pid = fork();if (pid < 0) {perror("fork failed");exit(1);}```(2)使用`exit()`函数终止进程。

```cexit(0);```2. 进程的调度与优先级(1)使用`nice()`函数调整进程优先级。

```cnice(10); // 降低进程优先级```(2)使用`priority_seta()`函数设置进程优先级。

```cstruct sched_param param;param.sched_priority = 10;if (sched_setscheduler(pid, SCHED_RR, &param) == -1) { perror("sched_setscheduler failed");exit(1);}```3. 进程同步与互斥(1)使用`semaphore_t`类型的信号量实现进程同步。

```csemaphore_t sem;sem_init(&sem, 0, 1);sem_wait(&sem);// 执行临界区代码sem_post(&sem);sem_destroy(&sem);```(2)使用`mutex_t`类型的互斥锁实现进程互斥。

操作系统进程控制实验报告

操作系统进程控制实验报告

操作系统进程控制实验报告硬件环境:处理器:Intel(R) Core(TM) i5-3210M CPU @2.50GHz 2.50GHz安装内存:4.00GB系统类型:64位操作系统软件环境:Linux系统一、实验目的加深对于进程并发执行概念的理解。

实践并发进程的创建和控制方法。

观察和体验进程的动态特性。

进一步理解进程生命期期间创建、变换、撤销状态变换的过程。

掌握进程控制的方法,了解父子进程间的控制和协作关系。

练习Linux系统中进程创建与控制有关的系统调用的编程和调试技术。

二、实验步骤(1)分析实例实验(2)进行独立实验(3)思考并完成实验报告实验截图:思考:说明它们反映出操作系统教材中进程及处理机管理一节讲解的进程的哪些特征和功能?在真实的操作系统中它是怎样实现和反映出教材中讲解的进程的生命期、进程的实体和进程状态控制的。

你对于进程概念和并发概念有哪些新的理解和认识?子进程是如何创建和执行新程序的?信号的机理是什么?怎样利用信号实现进程控制?根据实验程序、调试过程和结果分析写出实验报告。

1.进程的概念:进程不仅是一段程序代码,还包括当前活动(通过程序计数器和寄存器中的内容来表示),另外,进程还包括进程堆栈段,和数据段等。

2.并发概念:是指进程之间交替并发执行3.进程通过系统调用fork()函数创建子进程,子进程由唯一的pid值标示,pid通常是一个整数值。

通过fork创建的子进程实际上是父进程的克隆体,通过复制原来进程的地址空间而成,父子进程同时执行fork之后的程序。

但是父子进程的pid值不同,可以通过对pid的判断,使父子进程执行不同的程序。

子进程如果想执行不同的程序,需要系统调用exec()函数装入新的程序执行。

4.信号的机理:信号是用来通知进程某个特定的事件已经发生。

信号是由特定的事件产生,信号必须要发送到进程,一旦发送,进程必须得到处理。

信号可以可以有系统默认处理也可以用户自定义处理。

操作系统实验3-进程控制

操作系统实验3-进程控制
DWORD dwVerReq=::GetProcessVersion(dwIdThis);
WORD wMajorReq=(WORD)(dwVerReq>16);
WORD wMinorReq=(WORD)(dwVerReq&0xffff);
::cout<<"Process ID:"<<dwIdThis<<",requires OS:"<<wMajorReq<<wMinorReq<<::endl;
{
//改变优先级
::SetPriorityClass(
::GetCurrentProcess(), //利用这一进程
HIGH_PRIORITY_CLASS); //改变为high
//报告给用户
::cout<<"Task Manager should indicate this "
"process is high priority."<<::endl;
//设置版本信息的数据结构,以便保存操作系统的版本信息
OSVERSIONINFOEX osvix;
::ZeroMemory(&osvix,sizeof(osvix));
osvix.dwOSVersionInfoSize=sizeof(osvix);
//提取版本信息和报告
::GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvix));
Parent();
}
return 0;
}
分析:程序4-3.cpp说明了一个进程从“生”到“死”的整个一生,第一次执行时,它创建一个子进程,其行为如同“父亲”。在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex()API发出“死亡”信号。然后用Sleep()API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。

进程控制实验报告

进程控制实验报告

测试过程: (实验中出现的问题、错误、解决方法)创建好项目和文件, 对文件进行编译和运行, 编译没有错误, 但是运行总是提示有2个错误。

解决办法:在新建项目的时候“新建”, 然后新建文件, 程序就可以正常的运行了。

实验总结:1、课下没有对Microsoft Visual c++ 6.0进行深入的研究, 还是好多问题不知道怎么解决, 好好钻研一下这个很有必要的啊!评语与成绩:教师签名:年月日实验名称进程控制实验类型验证性实验时间实验环境Windows xp 、Microsoft Visual c++ 6.0实验目的与要求:1.通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作, 进一步熟悉操作系统的进程概念, 理解Windows 2000进程的“一生”。

2.通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法。

实验内容:本实验给出了三段程序:创建进程、正在运行的进程和终止进程, 阅读程序回答所提问题, 分析运行结果。

一、实验步骤: (算法描述、源程序、操作步骤和方法)二、创建进程回答问题:1.该程序是一个简单使用CreateProcess()API函数的例子。

首先形成简单的命令行, 提供当前EXE文件的指定文件名和代表生成克隆进程的号码。

大多数参数都可取默认值, 但是创建标志参数使用了CREATE_NEW_CONSOLE标志, 指示新进程分配自己的控制台, 这使得运行程序时, 在任务栏上产生许多活动标记。

然后该克隆进程的创建方法关闭传递过来的句柄并返回main ()函数。

在关闭程序之前, 每一进程的执行主线程暂停一下, 以便让用户看到其中的至少一个窗口。

2、CreateProcess()函数有几个核心参数?本实验程序中设置的各个参数的值是什么?答、CreateProcess()函数有10个核心参数参数的值为: CreateProcess(szFilename, //产生这个EXE的应用程序的名称szCmdLine, //告诉其行为像一个子进程的标志NULL, //缺省的进程安全性NULL, //缺省的线程安全性FALSE, //不继承句柄CREATE_NEW_CONSOLE, //使用新的控制台NULL, //新的环境NULL, //当前目录&si, //启动信息&pi);3.程序运行时屏幕显示的信息是什么?答、三、运行进程1、回答问题:2、给出运行结果(当前PID信息、操作系统版本、系统提示信息)答、运行结果为:2.如何获得当前的PID和操作系统版本可利用GetCurrentProcessId()API函数查看系统当前进程的标识符(pid), 该pid在整个系统中都可使用。

进程控制实验报告

进程控制实验报告

进程控制实验报告进程控制实验报告引言:进程控制是操作系统中的重要概念之一,它负责管理和调度计算机系统中的各个进程,确保它们能够按照一定的顺序和优先级进行执行。

本实验旨在通过编写一个简单的进程控制程序,加深对进程控制的理解,并探索其在实际应用中的作用。

实验目的:1. 理解进程控制的基本概念和原理;2. 掌握进程创建、终止和切换的方法;3. 熟悉进程调度算法的实现;4. 分析进程控制在实际应用中的意义和效果。

实验过程:本次实验中,我们选择使用C语言编写一个简单的进程控制程序,通过创建多个进程并进行调度,观察它们的执行顺序和状态变化。

首先,我们定义了一个进程结构体,包含进程ID、进程状态和进程优先级等信息。

然后,我们编写了创建进程的函数,通过调用系统调用接口fork()来创建新的进程,并为其分配唯一的进程ID。

在进程创建完成后,我们实现了一个简单的进程调度算法,根据进程的优先级和状态来决定下一个要执行的进程。

我们使用了优先级队列来管理进程,将优先级高的进程排在队列的前面,以确保它们能够优先执行。

接下来,我们模拟了进程的运行过程,通过设置进程的状态和优先级,来模拟进程的创建、终止和切换。

我们观察到,当一个进程被创建时,它会被添加到就绪队列中,等待系统调度执行。

当一个进程的时间片用完或者发生阻塞时,它会被暂停并切换到下一个就绪进程执行。

实验结果:通过多次运行实验程序,我们观察到进程的创建、终止和切换过程。

我们发现,进程的创建是一个相对较慢的过程,而进程的切换则非常迅速。

这是因为进程的创建需要为其分配资源和初始化环境,而进程的切换只需要保存和恢复进程的状态即可。

我们还发现,进程的优先级对于进程的执行顺序有重要影响。

当一个进程的优先级较高时,它会被优先执行,而其他进程则需要等待。

这使得系统能够根据进程的重要性和紧急程度来进行合理的调度,提高系统的效率和响应速度。

讨论与总结:进程控制是操作系统中非常重要的一部分,它负责管理和调度计算机系统中的各个进程。

进程管理实验报告_共10篇 .doc

进程管理实验报告_共10篇 .doc

★进程管理实验报告_共10篇范文一:_进程管理实验报告进程管理实验报告一、进程与线程1.实验目的:1.通过本实验学习Linux中创建进程的方法。

2.学习系统调用fork的使用方法。

3.学习系统调用exec族调用的使用方法。

2.实验准备1.进程的创建创建一个进程的系统调用很简单,只要调用fork函数就可以了。

#includepid_tfork();当一个进程调用了fork以后,系统会创建一个子进程,这个子进程和父进程是不同的地方只有它的进程ID和父进程ID,其他的都一样,就像父进程克隆(clone)自己一样,当然创建两个一模一样的进程是没有意义的,为了区分父进程和子进程,我们必须跟踪fork调用返回值。

当fork调用失败的时候(内存不足或者是用户的最大进程数已到)fork返回—1,否则fork的返回值有重要的作用。

对于父进程fork返回子进程ID,而对于fork 子进程返回0,我们就是根据这个返回值来区分父子进程的。

2.关于fork的说明使用该函数时,该函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。

将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数可以是一个子进程获得其所有子进程的进程ID。

而fork函数使子进程得到的返回值是0的理由是:一个子进程只会有一个父进程,所以子进程总是可以调用函数getpid获得其父进程的进程ID。

3.系统调用exec族调用的说明父进程创建子进程后,子进程一般要执行不同的程序。

为了调用系统程序,我们可以使用系统调用exec族调用。

Exec族调用有以下五个函数:intexecl(constchar*path,constchar*arg,?);intexeclp(constchar*file,constchar*arg,?);intexecle(constchar*path,constchar*arg,?);intexecv(constchar*path,constchar*argv[]);intexecvp(constchar*file,constchar*argv[]);exec族调用可以执行给定程序。

进程管理实验报告分析(3篇)

第1篇一、实验背景进程管理是操作系统中的一个重要组成部分,它负责管理计算机系统中所有进程的创建、调度、同步、通信和终止等操作。

为了加深对进程管理的理解,我们进行了一系列实验,以下是对实验的分析和总结。

二、实验目的1. 加深对进程概念的理解,明确进程和程序的区别。

2. 进一步认识并发执行的实质。

3. 分析进程争用资源的现象,学习解决进程互斥的方法。

4. 了解Linux系统中进程通信的基本原理。

三、实验内容1. 使用系统调用fork()创建两个子进程,父进程和子进程分别显示不同的字符。

2. 修改程序,使每个进程循环显示一句话。

3. 使用signal()捕捉键盘中断信号,并通过kill()向子进程发送信号,实现进程的终止。

4. 分析利用软中断通信实现进程同步的机理。

四、实验结果与分析1. 实验一:父进程和子进程分别显示不同的字符在实验一中,我们使用fork()创建了一个父进程和两个子进程。

在父进程中,我们打印了字符'a',而在两个子进程中,我们分别打印了字符'b'和字符'c'。

实验结果显示,父进程和子进程的打印顺序是不确定的,这是因为进程的并发执行。

2. 实验二:每个进程循环显示一句话在实验二中,我们修改了程序,使每个进程循环显示一句话。

实验结果显示,父进程和子进程的打印顺序仍然是随机的。

这是因为并发执行的进程可能会同时占用CPU,导致打印顺序的不确定性。

3. 实验三:使用signal()捕捉键盘中断信号,并通过kill()向子进程发送信号在实验三中,我们使用signal()捕捉键盘中断信号(按c键),然后通过kill()向两个子进程发送信号,实现进程的终止。

实验结果显示,当按下c键时,两个子进程被终止,而父进程继续执行。

这表明signal()和kill()在进程控制方面具有重要作用。

4. 实验四:分析利用软中断通信实现进程同步的机理在实验四中,我们分析了利用软中断通信实现进程同步的机理。

进程控制与进程通信程序实验报告

进程控制与进程通信程序实验报告一、引言进程是计算机系统中最基本的概念之一,是操作系统中最小的资源管理单位。

进程控制与进程通信是操作系统中重要的内容,涉及到进程的创建、调度和终止,以及进程间的信息传递和同步管理。

本实验旨在通过编写进程控制与进程通信程序,加深对操作系统中进程管理和通信机制的理解。

二、实验目的1. 理解进程的概念和特点,掌握进程的创建、调度和终止方法。

2. 掌握进程通信的基本原理和方法,包括共享内存、管道、消息队列和信号量等。

3. 能够编写简单的进程控制和进程通信程序。

三、实验内容1. 进程控制实验:编写一个程序,实现进程的创建、调度和终止。

通过调用系统调用函数,创建多个子进程,并通过进程控制函数实现父子进程的协作与同步。

2. 进程通信实验:编写一个程序,实现进程间的信息传递和同步管理。

通过共享内存、管道、消息队列或信号量等机制,实现不同进程之间的数据交换和共享。

四、实验步骤1. 进程控制实验:(1)创建父进程和子进程:使用fork()函数创建子进程,并通过判断返回值来区分父子进程。

(2)调度子进程:使用wait()函数等待子进程的结束,以实现父子进程的同步。

(3)终止子进程:使用exit()函数终止子进程的运行。

2. 进程通信实验:(1)共享内存:使用shmget()函数创建共享内存段,使用shmat()函数映射共享内存到进程的地址空间,实现共享数据的读写。

(2)管道:使用pipe()函数创建管道,使用fork()函数创建子进程,通过读写管道实现进程间的数据传输。

(3)消息队列:使用msgget()函数创建消息队列,使用msgsnd()函数向消息队列发送消息,使用msgrcv()函数从消息队列接收消息,实现进程间的消息传递。

(4)信号量:使用semget()函数创建信号量,使用semop()函数对信号量进行P操作和V操作,实现进程间的同步和互斥。

五、实验结果通过实验,我们成功实现了进程的创建、调度和终止,以及进程间的信息传递和同步管理。

操作系统实验-进程控制

实验一、进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。

实践并发进程的创建和控制方法。

观察和体验进程的动态特性。

进一步理解进程生命期期间创建、变换、撤销状态变换的过程。

掌握进程控制的方法,了解父子进程间的控制和协作关系。

练习 Linux 系统中进程创建与控制有关的系统调用的编程和调试技术。

1.2 实验说明1)与进程创建、执行有关的系统调用说明 进程可以通过系统调用fork()创建子进程并和其子进程并发执行.子进程初始的执行映像是父进程的一个复本.子进程可以通过 exec()系统调用族装入一个新的执行程序。

父进程可以使用 wait()或 waitpid()系统调用等待子进程的结束并负责收集和清理子进程的退出状态。

fork()系统调用语法:pid_t#include <unistd.h>fork(void);fork 成功创建子进程后将返回子进程的进程号,不成功会返回-1.exec 系统调用有一组 6 个函数,其中示例实验中引用了 execve 系统调用语法:#include <unistd.h>const char * envp[]);path 要装const char *argv[],int execve(const char *path,入的新的执行文件的绝对路径名字符串.argv[] 要传递给新执行程序的完整的命令参数列表(可以为空).envp[] 要传递给新执行程序的完整的环境变量参数列表(可以为空).Exec 执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。

如果 exec 调用失败,它会返回-1。

wait() 系统调用语法:#include <sys/types.h>pid_t#include <sys/wait.h>wait(int *status);status 用pid_t waitpid(pid_t pid,int *status,int option);于保留子进程的退出状态pid 可以为以下可能值:-1 等待所有 PGID 等于 PID 的绝对值的子进程1 等待所有子进程0 等待所有 PGID 等于调用进程的子进程>0 等待 PID 等于 pid 的子进程 option 规定了调用 waitpid 进程的行为:WNOHANG 没有子进程时立即返回WUNTRACED 没有报告状态的进程时返回wait 和 waitpid 执行成功将返回终止的子进程的进程号,不成功返回-1。

进程报告

操作系统实验报告书学院名称:学生姓名:专业名称:班级:学号:时间:实验一题目进程1、实验目的与要求1.目的通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。

2.要求2、实验环境1.硬件(1) 主机:Pentium III 以上;(2) 内存:128MB 以上;(3) 显示器:VGA 或更高;(4) 硬盘空间:至少100MB 以上剩余空间。

2.软件Linux 操作系统,内核2.4.26 以上,预装有X-Window 、vi、gcc、gdb 和任意web 浏览器。

三.实验内容1.补充POSIX 下进程控制的残缺版实验程序2.回答下列问题:(1) 你最初认为运行结果会怎么样?(2)实际的结果什么样?有什么特点?试对产生该现象的原因进行分析(3) proc_number 这个全局变量在各个子进程里的值相同吗?为什么?(4)kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?(5)使用kill 命令可以在进程的外部杀死进程。

进程怎样能主动退出?这两种退出方式哪种更好一些?四、回答相关问题1. 补充完全的源程序#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<signal.h>#include<ctype.h>#define MAX_CHILD_NUMBER 10/* 允许建立的子进程个数最大值 */ #define SLEEP_INTERV AL 1/* 子进程睡眠时间 */int proc_number=0; /* 子进程的编号,从0开始 */void do_something();int main(int argc,char *argv[]){int child_proc_number=MAX_CHILD_NUMBER; /* 子进程个数 */int i,ch;pid_t child_pid;pid_t pid[10]={0};/* 存放每个子进程的id */if(argc>1){child_proc_number=atoi(argv[1]);child_proc_number=(child_proc_number>10)?10:child_proc_number;/* 命令行参数中的第一个参数表示建立几个子进程,最多10个 */ }/*建立child_proc_number个子进程* 子进程要执行* proc_number = i;* do_something();* 父进程把子进程的id保存到pid[i] */for(i=0;i<child_proc_number;i++){child_pid=fork();if(child_pid== -1){perror("creat error!\n");return 1;}else if(child_pid>0)pid[i]=child_pid;else{proc_number=i;do_something();}}/* 让用户选择杀死哪个进程。

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

实验题目内存分配算法
学号 201226860114 姓名梁奕晓
班级实验班1201
一、实验目的
利用教师提供的图形包代码,编写程序,实现内存的分配算法(最佳适配和邻近适配)。

二、背景知识
本实验要求利用事先已经编写好的图形包软件模拟内存的分配。

实现动态分区的分配算法。

最佳适配算法选择内存空闲块中最适合进程大小的块分配。

邻近适配算法从上一次分配的地址开始查找符合要求的块,所查找到的第一个满足要求的空闲块就分配给进程。

三、主要程序
1.MemAllocate.cpp
功能:实现内存的分配。

程序中实现了首次适配算法
2.MemoryView.cpp
功能:利用图形化软件包显示程序结果
3.OSgraphics软件包
功能:定义了各种图形的显示,包括矩形、图形、线条、文本等的显示
四、实验内容与步骤
在所提供的程序基础之上实现最佳适配和邻近适配算法。

增加测试案例,验证程序的正确性
删除掉一个分配的进程(进程3)
重新分配一个进程,假设进程6大小为100
利用VC++6.0实现上述程序设计和调试操作。

通过阅读和分析实验程序,熟悉内存分配算法。

五、工具/准备工作
在开始本实验之前,请回顾教科书的相关内容
需要做以下准备:
一台运行Windows 2000 /XP 操作系统的计算机
计算机中需安装Visual C++ 6.0专业版或企业版
六、关键代码与系统截图
1、初始化
void CMemAllocate::InitJobs()
{
m_JobsHead = m_JobsEnd = 0;
AddAJobInEnd("Job1",1,180,NULL);
AddAJobInEnd("Job2",2,360,NULL);
AddAJobInEnd("Job3",3,180,NULL);
AddAJobInEnd("Job4",4,60,NULL);
AddAJobInEnd("Job5",5,20,NULL);
}
(部分截图
2、删除进程
void CMemAllocate::DeleteJob( int JobIndex) //删除进程
{
bool flag=false;
for (MemoryBlock * p = m_MemList; p != 0; p=p->nextPointer) if ( p->JobIndex == JobIndex )
{
if (p->prePointer==0)
{
if(p->nextPointer->JobIndex !=0)
p->JobIndex=0;
else if(p->nextPointer->JobIndex ==0)
{
p->JobIndex=0;
p->BlockLength += p->nextPointer->BlockLength;
if( p->nextPointer->nextPointer !=0)
p->nextPointer->nextPointer->prePointer=p;
p->nextPointer = p->nextPointer->nextPointer;
}
}
else if (p->nextPointer==0)
{
if(p->prePointer ->JobIndex !=0)
p->JobIndex==0;
else if(p->prePointer ->JobIndex ==0)
{
p->prePointer->BlockLength += p->BlockLength;
p->prePointer->nextPointer=0;
}
}
else
{
if(p->prePointer->JobIndex!=0 && p->nextPointer->JobIndex!=0) //直接归0
{
p->JobIndex=0;
}
else if(p->prePointer->JobIndex==0 && p->nextPointer->JobIndex==0) //前后合并
{
p->JobIndex=0;
p->prePointer->BlockLength += p->BlockLength+ p->nextPointer->BlockLength;
if( p->nextPointer->nextPointer !=0)
p->nextPointer->nextPointer->prePointer=p->prePointer;
p->prePointer->nextPointer = p->nextPointer->nextPointer;
}
else if(p->prePointer->JobIndex==0 && p->nextPointer->JobIndex!=0) //向前
{
p->prePointer->BlockLength += p->BlockLength;
p->prePointer->nextPointer = p->nextPointer;
p->nextPointer->prePointer =p->prePointer;
}
else if(p->prePointer->JobIndex!=0 && p->nextPointer->JobIndex==0) //向后
{
p->JobIndex=0;
p->BlockLength += p->nextPointer->BlockLength;
if( p->nextPointer->nextPointer !=0)
p->nextPointer->nextPointer->prePointer=p;
p->nextPointer = p->nextPointer->nextPointer;
}
}
flag=true;
break;
}
}
(删除进程3)
3、重新分配进程
void CMemAllocate::AllocateMem_NextAdapt(CMemAllocate::JCBInfo& job) {
for ( MemoryBlock * p = flag ->latestMemBlock; p != 0; p=p->nextPointer) //从最近一次分配的位置开始进行首次适配算法
{
if (job.JobLength <= p->BlockLength && p->JobIndex == 0) //如果作业需要空间小于内存块空间,分配
{
MemoryBlock * tmpMemBlock = new MemoryBlock;
tmpMemBlock ->BlockLength = job.JobLength;
tmpMemBlock ->JobIndex = job.JobIndex;
tmpMemBlock ->StartAddr = p->StartAddr;
tmpMemBlock ->nextPointer = p;
tmpMemBlock ->prePointer = p ->prePointer;
p->StartAddr = p->StartAddr + job.JobLength;
p->BlockLength = p->BlockLength -job.JobLength;
if (p->prePointer == 0 )
{
m_MemList = tmpMemBlock;
}
else
{
p->prePointer->nextPointer = tmpMemBlock;
}
p ->prePointer = tmpMemBlock;
flag ->latestMemBlock = tmpMemBlock;
flag ->JobIndex = job.JobIndex; //记录最近一次分配的作业号
break;
}
else
{
continue;
}
}
}。

相关文档
最新文档