// abc.cpp
// define...
#define MAX_PCB_NAME 12 // 进程最大名字长度
#define MAX_PROCESS 32 // 允许最大的进程数
// include...
#include "stdio.h"
#include "string.h"
// 进程状态
enum PCB_STATE
{
PS_NONE,
PS_STOP,
PS_RUN
};
// PCB结构
typedef struct PCB
{
char name[MAX_PCB_NAME];
int time;
int level;
PCB_STATE state;
}PCB, *LPPCB;
// Global...
PCB process[MAX_PROCESS];
// 初始化进程列表
void Init()
{
int i;
for(i=0; i<MAX_PROCESS; i++)
{
process[i].state = PS_NONE;
}
}
// 返回被执行的进程id,-1表示没有任何进程可以执行
int Run()
{
int i = 0;
int max = -1;
// 找到具备最大优先及的进程
for(i=0; i<MAX_PROCESS; i++)
{
if(process[i].state == PS_RUN)
{
max = i;
for(; i<MAX_PROCESS; i++)
{
if(process[i].state==PS_RUN && process[i].level>process[max].level ) max = i;
}
}
}
if(max == -1) return -1;
// 运行该进程
if(process[max].level > 0) process[max].level --;
process[max].time --;
if(process[max].time <= 0) process[max].state = PS_STOP;
return max;
}
// 开始一个进程,并返回进程id,-1表示没有进程被建立
int Start(char *name, int level, int time, PCB_STATE state)
{
int id = -1;
int i;
for(i=0; i<MAX_PROCESS; i++)
{
if(process[i].state == PS_NONE)
{
process[i].state = state;
process[i].level = level;
strcpy(process[i].name, name);
process[i].time = time;
id = i;
break;
}
}
return id;
}
// 用于输出状态,包括前5个进程的状态,优先及,当前运行id
void Dump(int id)
{
int i;
char buf[256];
char tmp[256];
sprintf(buf, "State[");
for(i=0; i<5; i++)
{
sprintf(tmp, "%2d ", process[i].state);
strcat(buf, tmp);
}
strcat(buf, "]/tLevel[");
for(i=0; i<5; i++)
{
sprintf(tmp, "%2d ", process[i].level );
strcat(buf, tmp);
}
strcat(buf, "]/tRunned[");
sprintf(tmp, "%2d", id);
strcat(buf, tmp);
strcat(buf, "]/n");
printf(buf);
}
void main()
{
int id;
char buf[256];
Init();
for(int i=0; i<5; i++)
{
sprintf(buf, "proc %d", i);
Start(buf, 10+i, 10, PS_RUN);
}
while(1)
{
id=Run();
if(id==-1) break;
Dump(id);
}
}
====================================================
附程序输出(只显示前5个进程)
查看方法:State表示状态2=运行,1=停止,0=无效
Level表示优先及,
Runned 表示上次运行的进程id,它是由上面一行中的level决定的
State[ 2 2 2 2 2 ] Level[10 11 12 13 13 ] Runned[ 4]
State[ 2 2 2 2 2 ] Level[10 11 12 12 13 ] Runned[ 3]
State[ 2 2 2 2 2 ] Level[10 11 12 12 12 ] Runned[ 4]
State[ 2 2 2 2 2 ] Level[10 11 11 12 12 ] Runned[ 2]
State[ 2 2 2 2 2 ] Level[10 11 11 11 12 ] Runned[ 3]
State[ 2 2 2 2 2 ] Level[10 11 11 11 11 ] Runned[ 4]
State[ 2 2 2 2 2 ] Level[10 10 11 11 11 ] Runned[ 1]
State[ 2 2 2 2 2 ] Level[10 10 10 11 11 ] Runned[ 2]
State[ 2 2 2 2 2 ] Level[10 10 10 10 11 ] Runned[ 3]
State[ 2 2 2 2 2 ] Level[10 10 10 10 10 ] Runned[ 4]
State[ 2 2 2 2 2 ] Level[ 9 10 10 10 10 ] Runned[ 0]
State[ 2 2 2 2 2 ] Level[ 9 9 10 10 10 ] Runned[ 1]
State[ 2 2 2 2 2 ] Level[ 9 9 9 10 10 ] Runned[ 2]
State[ 2 2 2 2 2 ] Level[ 9 9 9 9 10 ] Runned[ 3]
State[ 2 2 2 2 2 ] Level[ 9 9 9 9 9 ] Runned[ 4]
State[ 2 2 2 2 2 ] Level[ 8 9 9 9 9 ] Runned[ 0]
State[ 2 2 2 2 2 ] Level[ 8 8 9 9 9 ] Runned[ 1]
State[ 2 2 2 2 2 ] Level[ 8 8 8 9 9 ] Runned[ 2]
State[ 2 2 2 2 2 ] Level[ 8 8 8 8 9 ] Runned[ 3]
State[ 2 2 2 2 2 ] Level[ 8 8 8 8 8 ] Runned[ 4]
State[ 2 2 2 2 2 ] Level[ 7 8 8 8 8 ] Runned[ 0]
State[ 2 2 2 2 2 ] Level[ 7 7 8 8 8 ] Runned[ 1]
State[ 2 2 2 2 2 ] Level[ 7 7 7 8 8 ] Runned[ 2]
State[ 2 2 2 2 2 ] Level[ 7 7 7 7 8 ] Runned[ 3]
State[ 2 2 2 2 2 ] Level[ 7 7 7 7 7 ] Runned[ 4]
State[ 2 2 2 2 2 ] Level[ 6 7 7 7 7 ] Runned[ 0]
State[ 2 2 2 2 2 ] Level[ 6 6 7 7 7 ] Runned[ 1]
State[ 2 2 2 2 2 ] Level[ 6 6 6 7 7 ] Runned[ 2]
State[ 2 2 2 2 2 ] Level[ 6 6 6 6 7 ] Runned[ 3]
State[ 2 2 2 2 2 ] Level[ 6 6 6 6 6 ] Runned[ 4]
State[ 2 2 2 2 2 ] Level[ 5 6 6 6 6 ] Runned[ 0]
State[ 2 2 2 2 2 ] Level[ 5 5 6 6 6 ] Runned[ 1]
State[ 2 2 2 2 2 ] Level[ 5 5 5 6 6 ] Runned[ 2]
State[ 2 2 2 2 2 ] Level[ 5 5 5 5 6 ] Runned[ 3]
State[ 2 2 2 2 2 ] Level[ 5 5 5 5 5 ] Runned[ 4]
State[ 2 2 2 2 2 ] Level[ 4 5 5 5 5 ] Runned[ 0]
State[ 2 2 2 2 2 ] Level[ 4 4 5 5 5 ] Runned[ 1]
State[ 2 2 2 2 2 ] Level[ 4 4 4 5 5 ] Runned[ 2]
State[ 2 2 2 2 2 ] Level[ 4 4 4 4 5 ] Runned[ 3]
State[ 2 2 2 2 1 ] Level[ 4 4 4 4 4 ] Runned[ 4]
State[ 2 2 2 2 1 ] Level[ 3 4 4 4 4 ] Runned[ 0]
State[ 2 2 2 2 1 ] Level[ 3 3 4 4 4 ] Runned[ 1]
State[ 2 2 2 2 1 ] Level[ 3 3 3 4 4 ] Runned[ 2]
State[ 2 2 2 1 1 ] Level[ 3 3 3 3 4 ] Runned[ 3]
State[ 2 2 2 1 1 ] Level[ 2 3 3 3 4 ] Runned[ 0]
State[ 2 2 2 1 1 ] Level[ 2 2 3 3 4 ] Runned[ 1]
State[ 2 2 1 1 1 ] Level[ 2 2 2 3 4 ] Runned[ 2]
State[ 2 2 1 1 1 ] Level[ 1 2 2 3 4 ] Runned[ 0]
State[ 2 1 1 1 1 ] Level[ 1 1 2 3 4 ] Runned[ 1]
State[ 1 1 1 1 1 ] Level[ 0 1 2 3 4 ] Runned[ 0]
Press any key to continue
模拟单处理器情况下的进程调度
最新推荐文章于 2020-12-05 23:15:55 发布