一、实验目的
磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验让学生理解和掌握磁盘调度的职能。
二、实验要求
模拟电梯调度算法,对磁盘进行移臂操作
三、数据结构
- 假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。
- 磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求而处于等待状态时,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。为此设置“驱动调度”进程。
- 由于磁盘与处理器是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的其它进程可以提出使用磁盘(这里我们只要求访问磁道),即动态申请访问磁道,为此设置“接受请求”进程。
- 为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,程序结构图参考附图:
- “接受请求”进程建立一张“进程请求I/O”表,指出等待访问磁盘的进程要求访问的磁道。
- 磁盘调度”的功能是查“请求I/O”表,当有等待访问的进程时,按电梯调度算法(SCAN算法)从中选择一个等待访问的进程,按其指定的要求访问磁道。SCAN算法参考课本第九章。算法模拟框图略。
- 附图中的“初始化”工作包括:初始化“请求I/O”表,设置置当前移臂方向;当前磁道号。并且假设程序运行前“请求I/O”表中已有若干进程(4~8个)申请访问相应磁道。
四、实验过程
五、附录
六、代码
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[100];
int b[100];
int now_location;
int num[200];
void begin_one(int &i)
{
while (i < 200)
{
if (num[i] == 1)
{
cout << i << " ";
num[i] = 0;
}
i++;
}
}
void begin_two(int &i)
{
while (i-- >= 0)
{
if (num[i] == 1)
{
cout << i << " ";
num[i] = 0;
}
}
}
void ctrl_c()
{
for (int i = 0; i < n; i++)
{
b[i] = a[i];
}
}
int main()
{
srand((unsigned)time(NULL));
n = rand() % 4 + 4;
cout << "等待申请访问的磁道号:" << endl;
for (int i = 0; i < n; i++)
{
b[i] = rand() % 200;
a[i] = b[i];
num[a[i]] = 1;
cout << a[i] << " ";
}
cout << endl;
int l = 0;
int t = rand() % 2;//0:从小到大 1:从大到小
cout << "磁盘的移动顺序为";
if (t == 1)
{
cout << "由内到外" << endl;
}
else
{
cout << "由外到内" << endl;
}
now_location = rand() % 200;
cout << "当前磁道号为: " << now_location << endl;;
do
{
cout << "请输入[0,1]之间的随机数" <<endl;
cout << "若随机数 > 1/2,则进行磁盘调度 "
<< "若随机数 <= 1/2,则接受请求 " << endl;
double m;
cin >> m;
int u;
for (int i = 0; i < n; i++)
{
num[a[i]] = 1;
}
if (m < 0.5)
{
cout << "请输入新进程的磁道号(<200)" << endl;
cin >> u;
n++;
a[n] = u;
ctrl_c();
b[n] = u;
num[u] = 1;
sort(b, b + n);
}
int i = now_location;
if (t == 1)
{
begin_two(i);
begin_one(i);
cout << endl;
}
else
{
begin_one(i);
begin_two(i);
cout << endl;
}
if (m < 0.5)
{
a[n] = 0;
ctrl_c();
n--;
}
cout << "是否终止程序(输入0终止程序)" << endl;
cin >> l;
} while (l);
return 0;
}