一、“丑话”说在前头
稍稍有点操作系统基础的朋友应该知道进程的调度算法,在这里“所长”还是给大家略微介绍一下接下来要模拟的几种算法:
- 先来先服务(FCFS)
采用FCFS调度,先请求CPU的进程会先分配到CPU。
使用FCFS调度的等待时间通常较长,CPU利用率也会较低 - 最短作业优先调度(SJF)
采用SJF调度会选择具有最短CPU运行时间的进程分配CPU使用权。如果两个进程的CPU区间相同,则按照FCFS来进行选择。
SJF调度可以证明是最佳的,它降低了平均等待时间。 - 轮转法调度(RR)
RR调度将CPU时间分为较小的时间片,调度程序循环就绪队列。为每一个进程分配不超过一个时间片的CPU。
RR调度专门用于分时系统。 - 优先级调度
每一个进程都有一个优先级与其关联,具有最高优先级的进程会分配到CPU。
优先级调度的一个主要问题是优先级较低的进程会产生饥饿现象。
二、编程模拟
1. 思路整理
1.创建主线程,主线程创建子线程,子线程有一个虚拟PCB
2.主线程创建20个子线程,分别实现FCFS调度、SJF调度、RR调度、优先级调度,并且计算每个调度的平均等待时间。
3.对于每个子线程,在其运行期间,输出其占用的时间标号(例如,第3个线程占用了第10秒的CPU时间,输出为:“Thread3:10”)。
2. 代码(仅供参考)
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<pthread.h>
#include<time.h>
#include<iostream>
#define Thread_Num 20
using namespace std;
pthread_mutex_t Device_mutex ;
//Virtual PCB of threads
struct VirtualPCB
{
int tid;
int priority;
int waittime;
int runtime;
int arrivetime;
int visited;
int tempruntime;
public:
int gettid()
{
return tid;
}
int getwaittime()
{
return waittime;
}
int getpriority()
{
return priority;
}
int getruntime()
{
return runtime;
}
int getarrivetime()
{
return arrivetime;
}
void setvisit(int a)
{
visited=a;
}
int getvisit()
{
return visited;
}
int gettempruntime()
{
return tempruntime;
}
void setwaittime(int n)
{
waittime = n;
}
void settempruntime(int n)
{
tempruntime = tempruntime - n;
}
}TCB[Thread_Num];
//Function to initial virtual PCB
void t_init()
{
int n;
srand(time(NULL));
for(n =0;n<Thread_Num;n++)
{
TCB[n].tid = n + 1;//用线程创建序号作为虚拟进程id
//用随机数随机产生虚拟PCB的值
TCB[n].priority = 1 + rand()%19;
TCB[n].runtime = 1 + rand()%19;
TCB[n].arrivetime = 0;//模拟时,默认进程按创建顺序依次在0时刻到达
TCB[n].waittime = 0;
TCB