Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Стратегии дискового планирования(LOOK)

11K
06 октября 2008 года
mitrof4nov
68 / / 10.09.2007
Доброго всем времени суток. Подскажите пожалуйста, будьте любезны, решение небольшой задачи.
Имеется файл «in.txt» имеет вид:
……………….
23
45
12
56
12
……………….
Где числа – номера дорожек одной поверхности некоторого диска. Имеется буфер на 15 запросов к дорожке. Необходимо смоделировать работу алгоритмов дискового планирования по данным в буфере. После обработки буфер опустошается, и в него добавляются следующие 15 записей из очереди файла «in.txt». Положение считывающей головки при опустошении и заполнении буфера не изменяется. Результаты работы представить в файле «out.txt» в виде очереди дорожек, к которым будет обращение.


Вот код, в котором есть стратегии fifo, sstf, rss.

Код:
#!/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.

Это модификация метода 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");


Помогите с LOOK пожалуйста!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог