操作系统:进程控制和内存管理模拟实现
要求设计代码运行结果测试
要求
(1)设计一个允许n个进程并发运行的OS进程管理模拟程序,模拟实现创建新进程原语、阻塞进程原语、唤醒进程原语,终止进程原语、调度进程原语等功能;每个进程用一个PCB表示,其内容可根据具体情况设置。进程调度算法可选择 FCFS、时间片轮转或其他任意一种。内存分配可采用可变分区策略+最佳适应算法(或页式等其他内存分配方案,自选一种),进程创建时需为进程分配内存空间,进程终止时需要回收进程的内存空间。 (2)程序在运行过程中能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。
设计
将进程设计为4个状态:创建、就绪、运行和阻塞。 进程调度采用优先级调度算法,是把处理机分配给就绪队列中优先级最高的进程可变分区分配根据进程的实际需要,动态地为之分配内存空间。为了实现可变分区分配,系统必须配备相应的数据结构,用以描述空闲分区和已分配分区的情况,为分配提供依据。最佳适应算法是指每次分配内存时,将满足要求、又是最小调度空闲分区分配出去。为了加速寻找,该算法要求将所有的空闲分区按照分区大小排列。
代码
#include
using namespace std;
/*
优先级调度算法,优先级大的进程先运行
可变分区策略+最佳适应算法
*/
/*进程控制块结构体*/
class PCB
{
public:
int id; //进程id
int state; //进程状态 -2创建, -1就绪, 0运行, 1阻塞
int priority; //优先级
int needTime; //运行完毕所需时间
int arrivedTime; //已运行时间
int sliceTime; //时间片时间 初始为5
int memorySize; //内存大小
int memoryStart; //内存起始
PCB* next;
};
/*进程队列*/
PCB* CreateTask; //创建
PCB* ReadyTask; //就绪
PCB* RunningTask; //运行
PCB* BlockTask; //阻塞
/*进程id*/
int id = 1;
/*空闲分区表*/
class Table
{
public:
int id; //分区号,从0开始
int size; //分区大小
int address; //分区始址
int state = 0; //状态 0空闲, 1占用
};
Table table[5];
/*函数声明*/
void ProcessControl(); //进程控制程序
void createProcess(); //创建进程
void deleteProcess(); //撤销进程
void blockProcess(); //阻塞进程
void awakeProcess(); //唤醒进程
void runProcess(); //运行进程
void scheduleProcess(); //进程调度
void getBigPriorityProcess(); //将最大优先级的就绪进程调度到运行进程
void showProcess(); //显示所有进程状态
void printProcess(PCB* test); //显示单个进程状态
int main()
{
CreateTask = NULL;
RunningTask = NULL;
ReadyTask = NULL;
BlockTask = NULL;
for (int i = 0; i < 5; i++) //空闲分区表始址为0,默认每个分区大小分别为5,6,7,8,9
{
table[i].id = i;
table[i].size = 5 + i;
table[i].address = i * 5;
}
cout next->memorySize;
test->next->arrivedTime = 0;
test->next->state = -2;
test->next->next = NULL;
test->next->sliceTime = 0;
test = test->next;
}
PCB* test = CreateTask;
while (test != NULL)
{
if (test->state == -2)
{
for (int i = 0; i < 5; i++)
{
if (table[i].state == 0 && test->memorySize memoryStart = table[i].address;
test->state = -1;
table[i].state = 1;
break;
}
}
}
if (test->state == -1)
{
if (test != NULL)
{
if (ReadyTask == NULL) //判断就绪队列是否为空
{
ReadyTask = (PCB*)malloc(sizeof(PCB));
ReadyTask->id = test->id;
ReadyTask->priority = test->priority;
ReadyTask->needTime = test->needTime;
ReadyTask->memorySize = test->memorySize;
ReadyTask->memoryStart = test->memoryStart;
ReadyTask->arrivedTime = 0;
ReadyTask->state = -1;
ReadyTask->sliceTime = 0;
ReadyTask->next = NULL;
}
else
{
PCB* test1 = ReadyTask;
while (test1->next != NULL)
{
test1 = test1->next;
}
test1->next = (PCB*)malloc(sizeof(PCB));
test1->next->id = test->id;
test1->next->priority = test->priority;
test1->next->needTime = test->needTime;
test1->next->memorySize = test->memorySize;
test1->next->memoryStart = test->memoryStart;
test1->next->arrivedTime = 0;
test1->next->state = -1;
test1->next->next = NULL;
test1->next->sliceTime = 0;
test1 = test1->next;
}
if (test == CreateTask)
{
CreateTask = test->next;
}
else
{
PCB* test1 = CreateTask;
while (test1->next->state != -1)
{
test1 = test1->next;
}
test1->next = test->next;
}
}
}
test = test->next;
}
cout next;
}
test2->next = test3->next;
test2->next->state = -1;
test3->next = test3->next->next;
test2->next->next = NULL;
}
}
scheduleProcess();
}
/*进程运行 运行一次时间片时间减1 进程已运行时间加1*/
void runProcess()
{
if (RunningTask != NULL)
{
cout sliceTime -= 1;
if (RunningTask->arrivedTime == RunningTask->needTime) //当运行进程完成
{
cout next != NULL)
{
num++; //计算就绪进程的数量
test = test->next;
}
test = ReadyTask;
test->priority += num;
while (test->next != NULL)
{
test = test->next;
test->priority += 1;
}
test->next = RunningTask;
test->next->state = -1;
test->next->next = NULL;
}
RunningTask = NULL;
cout 0) //当运行进程被阻塞
{
//将被阻塞进程放入阻塞进程
if (BlockTask == NULL)
{
BlockTask = RunningTask;
BlockTask->state = 1;
BlockTask->next = NULL;
}
else
{
PCB* test = BlockTask;
while (test->next != NULL)
{
test = test->next;
}
test->next = RunningTask;
test->next->state = 1;
test->next->next = NULL;
}
RunningTask = NULL;
cout state > 0) //判断是否符合切换运行进程条件
{
cout needTime == RunningTask->arrivedTime || RunningTask->state > 0)
{
getBigPriorityProcess();
}
else //运行进程队列不需切换进程但进入
{
cout next;
RunningTask->next = NULL;
RunningTask->sliceTime = 5;
}
else
{
test = ReadyTask;
while (test->next != NULL)
{
if (test->next->priority == max)
{
RunningTask = test->next;
RunningTask->state = 0;
test->next = test->next->next;
RunningTask->next = NULL;
RunningTask->sliceTime = 5;
}
break;
}
}
}
/*显示所有进程状态*/
void showProcess()
{
cout |