内容发布更新时间 : 2025/7/29 15:43:01星期一 下面是文章的全部内容请认真阅读。
操作系统实验报告四
[实验题目]
磁盘调度算法SSTF、SCAN、C-SCAN [实验目的]
通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易理解,使磁盘调度的特点更简单明了,能使使用者加深对最短寻道时间优先算法、扫描算法以及循环扫描算法的理解。 [实验内容]
编程实现如下内容:
1. 最短寻道时间优先算法(SSTF); 2. 扫描算法(SCAN)(又叫电梯调度算法); 3. 循环扫描算法(CSCAN) 代码如下:
#define _CRT_SECURE_NO_WARNINGS #include
/*最短寻道时间函数SSTF*/ void SSTF(int a[], int n){ int temp; int now;
int sum = 0, i, j, k=0;
//冒泡排序法对磁道号进行排序
printf(\排序后的磁道分布:\\n\ for (i = 0; i < n; i++){
for (j = i + 1; j < n; j++){ if (a[i]>a[j]){ temp = a[i];
a[i] = a[j]; a[j] = temp; } }
printf(\ if (i % 10 == 9){ printf(\ } }
printf(\
printf(\请输入当前磁道号:\\n\ scanf(\ if (a[0] >=now){
printf(\当前访问的磁道%d\\n\ for (i = 0; i < n-1; i++){
printf(\当前访问的磁道:\\t%d\\n\ }
sum = a[n - 1] - now;
printf(\移动的总磁道数:%d\\n\ }
else if (a[n - 1] <= now){
printf(\当前访问的磁道:%d\\n\ for (j=n-1; i
printf(\当前访问的磁道:\\t%d\\n\
}
sum = now-a[0];
printf(\移动的总磁道数:%d\\n\ }
else{
while (a[k] < now){ k++; }
j = k-1; i = 0;
while ((j>=0)&&(k
if (now - a[j] >= a[k] - now){
printf(\当前访问的磁道:\\t%d\\n\
sum += a[k] - now; now = a[k]; k++;
}
else{
printf(\当前访问的磁道:\\t%d\\n\ sum += now - a[j]; now = a[j]; j--; } }
if (k > n-1){
for (int t = j; t > 0; t--){ i++;
if (t == j){
printf(\当前访问的磁道:\\t%d\\n\ }
else{
printf(\当前访问的磁道:\\t%d\\n\ } }
sum += a[n - 1] - a[0]; }
if (j <0){
for (int t = k; t < n; t++){ i++;
if (t == k){
printf(\当前访问的磁道:\\t%d\\n\ }
else{
printf(\当前访问的磁道:\\t%d\\n\ } }
sum += a[n - 1] - a[0]; } }
printf(\经过的总磁道数为:%d\\n\
printf(\移动的平均磁道数:%.2lf\\n\ printf(\请再次输入你想使用的方法:\\n\ }
/*扫描算法*/
void SCAN(int a[], int n){ int temp; int now;
int sum = 0, i, j, k = 0;
//冒泡排序法对磁道号进行排序
printf(\排序后的磁道分布:\\n\ for (i = 0; i < n; i++){
for (j = i + 1; j < n; j++){ if (a[i]>a[j]){ temp = a[i]; a[i] = a[j]; a[j] = temp; } }
printf(\ if (i % 10 == 9){ printf(\ } }
printf(\请输入当前磁道号:\\n\ scanf(\ if (a[0] >= now){
printf(\当前访问的磁道:%d\\n\ for (i = 0; i < n - 1; i++){
printf(\当前访问的磁道:\\t%d\\n\
}
sum = a[n - 1] - now;
printf(\移动的总磁道数:%d\\n\ }
else if (a[n - 1] <= now){
printf(\当前访问的磁道:%d\\n\ for ( j = n - 1; i
printf(\当前访问的磁道:\\t%d\\n\
}
sum = now - a[0];
printf(\移动的总磁道数:%d\\n\ }
else{
int d;
while (a[k] < now){ k++; }
j = k - 1;
printf(\请输入当前磁头移动的方向(0向内,1向外):\\n\ scanf(\ if (d == 1){
for (int t = k; t < n; t++){
printf(\当前访问的磁道:\\t%d\\n\ sum += a[t] - now; now = a[t]; }
for (int t = j; t >=0; t--){
printf(\当前访问的磁道:\\t%d\\n\ }
sum += a[n - 1] - a[0]; }
else if (d == 0){
for (int t = j; t >= 0; t--){
printf(\当前访问的磁道:\\t%d\\n\ sum += now - a[t]; now = a[t]; }
for (int t = k; t < n; t++){
printf(\当前访问的磁道:\\t%d\\n\ }
sum += a[n - 1] - a[0]; }
else{
printf(\输入错误,重新回到选择算法界面!\\n\ } }
printf(\经过的总磁道数为:%d\\n\
printf(\移动的平均磁道数:%.2lf\\n\ printf(\请再次输入你想使用的方法:\\n\}
/*循环扫描算法*/
void CSCAN(int a[], int n){ int temp; int now;
int sum = 0, i, j, k = 0; //冒泡排序法对磁道号进行排序
printf(\排序后的磁道分布:\\n\ for (i = 0; i < n; i++){
for (j = i + 1; j < n; j++){ if (a[i]>a[j]){ temp = a[i]; a[i] = a[j];