#!/usr/bin/perl
ery:print "Choose the method: fifo-1, sstf-2, rss-3\n";
chomp($fr=<STDIN>);
# генерация чисел в файл in.txt
srand(time^$$);
my @arr=(0..1000);
open (F,"+>in.txt");
print F int(rand(@arr))."\n" for (0..10000);
close(F);
open(MYFILE, "in.txt"); #значения из файла in.txt записываются в массив
@ss=<MYFILE>;
close(MYFILE);
$k=$#ss;
#метод fifo
if($fr eq 1)
{
$i=0;
open(FILE, "+>out.txt");
while($i<=$k){
$j=0;
while($j<15){ #заполняется буфер по 15 значений
$buf[$j]=$ss[$i+$j];
$j++;
}
for($l=0;$l<15;$l++)
{
chomp($buf[$l]);
print FILE $buf[$l]." "; #копируются значения из буфера в файл out.txt
}
print FILE "\n";
$i=$i+$j;}
close(FILE);
}
#метод sstf
if($fr eq 2)
{
$i=0;
open(FILE, "+>out.txt");
while($i<=$k){
$j=0;
while($j<15){ #заполняется буфер по 15 значений
$buf[$j]=$ss[$i+$j];
$j++;
}
$p=0;
while($p<14){
$min=abs($buf[$p]-$buf[$p+1]);
for($r=$p+2;$r<15;$r++)
{$d=abs($buf[$p]-$buf[$r]);
if($min>$d)
{$min=$d;
$nom=$r;
$rt=$buf[$p+1];
$buf[$p+1]=$buf[$nom];
$buf[$nom]=$rt;
}
}
$p++;
}
for($l=0;$l<15;$l++)
{
chomp($buf[$l]);
print FILE $buf[$l]." "; #копируются значения из буфера в файл out.txt
}
print FILE "\n";
$i=$i+$j;}
close(FILE);
}
#метод rss
if($fr eq 3)
{
$i=0;
open(FILE, "+>out.txt");
while($i<=$k){
$j=0;
while($j<15){ #заполняется буфер по 15 значений
$buf[$j]=$ss[$i+$j];
$j++;
}
@buf1=sort{return(1) }(@buf);
for($l=0;$l<15;$l++)
{
chomp($buf1[$l]);
print FILE $buf1[$l]." "; #копируются значения из буфера в файл out.txt
}
print FILE "\n";
$i=$i+$j;}
close(FILE);
}
print "Repeat?(y/n)";
chomp($fo=<STDIN>);
if($fo eq "y")
{goto ery;}
Стратегии дискового планирования(LOOK)
Имеется файл «in.txt» имеет вид:
……………….
23
45
12
56
12
……………….
Где числа – номера дорожек одной поверхности некоторого диска. Имеется буфер на 15 запросов к дорожке. Необходимо смоделировать работу алгоритмов дискового планирования по данным в буфере. После обработки буфер опустошается, и в него добавляются следующие 15 записей из очереди файла «in.txt». Положение считывающей головки при опустошении и заполнении буфера не изменяется. Результаты работы представить в файле «out.txt» в виде очереди дорожек, к которым будет обращение.
Вот код, в котором есть стратегии fifo, sstf, rss.
Код:
Будьте так любезны помочь смоделировать еще метод LOOK.
Это модификация метода SCAN. Знаю как сделать C-LOOK, а насчет LOOK вообще не выходит.
Код:
open(F1, "in.txt") or die "Oshibka otkrytiya faila: $!"; #открываем файл in.txt
open(F2, ">tmp.txt"); #создаём файл tmp.txt - временный неотсортированный
@f2 = <F1>; #массив строк файла in.txt
$a=0; #вспомогательная переменная
$b=0; #вспомогательная переменная
for($i=0; $i<=$#f2; $i++) { #цикл по всем строчкам файла in.txt
for($j=$b; $j<($b+15); $j++) { #буфер на 15 записей
if($f2[$j] != "\n") {
chomp($f2[$j]);
if($j != $b+14) {
print F2 "$f2[$j]"." ";
$a=$a+1;
}
else {print F2 "$f2[$j]\n";}
}
}
$a=0;
$b=$b+15;
}
close(F1);
close(F2);
open(F2, "tmp.txt");
open(F3, ">tmp2.txt"); #создаём файл tmp2.txt - временный отсортированный
@f3 = <F2>;
for($z=0; $z<=$#f3; $z++) {
$/ = " "; # Задание другого разделителя записей
@line=<$f3[$z]>;
@sorted = sort {$b <=> $a} @line;
$/ = "\n"; # Восстановление разделителя по умолчанию
print F3 "@sorted\n";
}
close(F3);
close(F2);
unlink ("tmp.txt");
a: print "Ukazhite polozhenie golovki:\n"; #задаём положение головки от 1 до 100
chomp($polozh=<STDIN>);
if($polozh<0 or $polozh>100) {
print "Neverno ukazani dannie\n";
goto a;
};
open(F3, "tmp2.txt");
open(F4, ">out.txt");
$/ = "\n";
@f4 = <F3>;
for($g=0; $g<=$#f4; $g++) {
@string=<$f4[$g]>;
$/ = " "; # Задание другого разделителя записей
$n=0;
$m=0;
for($l=0; $l<=$#string; $l++) {
chomp($string[$l]);
if($string[$l] > $polozh) { #переменные, величина кот. больше знач. полож. головки
$rest[$n]=$string[$l];
$n=$n+1;
}
else { #переменные, величина кот. меньше знач. полож. головки
$min[$m]=$string[$l];
$m=$m+1;
}
}
#$/ = "\n"; # Восстановление разделителя по умолчанию
print F4 "[$polozh]"." "."@min"." "."@rest\n";
@min = (); #обнуляю массивы
@rest = ();
}
close(F3);
close(F4);
unlink ("tmp2.txt");
open(F2, ">tmp.txt"); #создаём файл tmp.txt - временный неотсортированный
@f2 = <F1>; #массив строк файла in.txt
$a=0; #вспомогательная переменная
$b=0; #вспомогательная переменная
for($i=0; $i<=$#f2; $i++) { #цикл по всем строчкам файла in.txt
for($j=$b; $j<($b+15); $j++) { #буфер на 15 записей
if($f2[$j] != "\n") {
chomp($f2[$j]);
if($j != $b+14) {
print F2 "$f2[$j]"." ";
$a=$a+1;
}
else {print F2 "$f2[$j]\n";}
}
}
$a=0;
$b=$b+15;
}
close(F1);
close(F2);
open(F2, "tmp.txt");
open(F3, ">tmp2.txt"); #создаём файл tmp2.txt - временный отсортированный
@f3 = <F2>;
for($z=0; $z<=$#f3; $z++) {
$/ = " "; # Задание другого разделителя записей
@line=<$f3[$z]>;
@sorted = sort {$b <=> $a} @line;
$/ = "\n"; # Восстановление разделителя по умолчанию
print F3 "@sorted\n";
}
close(F3);
close(F2);
unlink ("tmp.txt");
a: print "Ukazhite polozhenie golovki:\n"; #задаём положение головки от 1 до 100
chomp($polozh=<STDIN>);
if($polozh<0 or $polozh>100) {
print "Neverno ukazani dannie\n";
goto a;
};
open(F3, "tmp2.txt");
open(F4, ">out.txt");
$/ = "\n";
@f4 = <F3>;
for($g=0; $g<=$#f4; $g++) {
@string=<$f4[$g]>;
$/ = " "; # Задание другого разделителя записей
$n=0;
$m=0;
for($l=0; $l<=$#string; $l++) {
chomp($string[$l]);
if($string[$l] > $polozh) { #переменные, величина кот. больше знач. полож. головки
$rest[$n]=$string[$l];
$n=$n+1;
}
else { #переменные, величина кот. меньше знач. полож. головки
$min[$m]=$string[$l];
$m=$m+1;
}
}
#$/ = "\n"; # Восстановление разделителя по умолчанию
print F4 "[$polozh]"." "."@min"." "."@rest\n";
@min = (); #обнуляю массивы
@rest = ();
}
close(F3);
close(F4);
unlink ("tmp2.txt");
Помогите с LOOK пожалуйста!