本程序用于模拟进程。
总体思路为:用一个调度线程来模拟操作系统的调度进程,用一个线程来模拟一个进程。于是,对应于每一个被模拟的进程,都有相应的线程来模拟,并在调度线程的调度下,实现时间片轮转的调度算法。
具体实现:
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 用于显示当前运行进程以及当前就绪队列信息。
源代码如下:
#ifndef PCB_H #define PCB_H typedef struct PCB {
typedef struct {
typedef struct apply{
typedef struct {
enum STATUS { RUN, READY, WAIT }; void init(); #endif |
#include <stdio.h> pList pReadyList = new readyList; extern FILE* log; void initialPCB(pPCB p) {
|