操作系统实验一——模拟进程调度时间片轮转算法

该博客介绍了如何使用C语言模拟操作系统中的进程调度,重点是时间片轮转算法。通过定义PCB结构体,创建ReadyList和FreeList数据结构,以及使用状态枚举来管理进程状态。博客详细阐述了调度线程scheduleThread和模拟进程线程processThread的职责,并解释了每个时间片内进程执行的规则。此外,还提到了动态创建和撤销进程的功能,以及运行结果的记录方式。
摘要由CSDN通过智能技术生成

本程序用于模拟进程。
总体思路为:用一个调度线程来模拟操作系统的调度进程,用一个线程来模拟一个进程。于是,对应于每一个被模拟的进程,都有相应的线程来模拟,并在调度线程的调度下,实现时间片轮转的调度算法。
具体实现:
PCB块的数据结构:
typedef struct PCB {
 int id;
 char name[20];
 int status;
 int ax, bx, cx, dx;
 int pc;
 int psw;
 struct PCB* next;
 HANDLE hThis;
 DWORD threadID;
 int count;
}PCB, *pPCB;

ReadyList 和 FreeList的数据结构:
typedef struct {
 pPCB head;
 pPCB tail;
 int pcbNum;
}readyList, freeList, *pList;

状态列表:
enum STATUS { RUN, READY, WAIT };

PCB块总数:
const int PCB_LIMIT = 10;

在本程序中,调度线程为DWORD WINAPI scheduleThread(LPVOID lpParameter)。模拟进程的线程为:DWORD WINAPI processThread(LPVOID lpParameter)。

程序中每个时间片设置为1秒,其中每个进程在每个时间片内可以运行两条指令,将导致其pc加2。每个进程的各个寄存器,在进程生成时自动生成。

程序可以动态的创建进程,动态的撤销进程,并将最终的运行结果写在process_log.txt文件中。程序的运行界面如下:(可直接运行文件夹可执行程序中的Pro_test。)
create pro_name pro_len(如create p0 10)用于创建一个新进程。
remove pro_name (如remove p0)用于撤销一个进程。
current 用于显示当前运行进程以及当前就绪队列信息。

源代码如下:

pcb.h
#ifndef PCB_H
#define PCB_H

typedef struct PCB {
 int id;
 char name[20];
 int status;
 int ax, bx, cx, dx;
 int pc;
 int psw;
 struct PCB* next;
 HANDLE hThis;
 DWORD threadID;
 int count;
}PCB, *pPCB;

typedef struct {
 pPCB head;
 pPCB tail;
 int pcbNum;
}readyList, freeList, *pList;

typedef struct apply{
 char name[20];
 int time;
 struct apply* next;
}applyProcess, *applyList;

typedef struct {
 applyList head;
 applyList tail;
 int applyNum;
}applyQueue;

enum STATUS { RUN, READY, WAIT };
const int PCB_LIMIT = 10;

void init();
void createProcess(char* name, int ax);
void addApplyProcess(char* name, int time);
void createIfAnyApply();
void scheduleProcess();
void removeProcess(char* name);
void fprintReadyList();
void printCurrent();

#endif


pcb.cpp

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include "pcb.h"
#include "funCode.h"

pList   pReadyList = new readyList;
pList   pFreeList = new freeList;
pPCB   runPCB;
bool   firstTime = true;
applyQueue*  queue = new applyQueue;
HANDLE   hSchedule = NULL;
bool   schIsActive &#

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
(1)、假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式 (2)、每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“要求运行时间”。 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。 (3)、处理器调度总是选择标志单元指示的进程运行。由于本实验模拟处理器调度的功能,所以,对被选中的进程并不实际启动运行 (4)、进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程要求运行时间≠已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应把它的状态修改为“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。 (5)、若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。 (6)、在所设计的称序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进称对列的变化。 (7)、为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值