2015-05-09 3 views
1

Я пытаюсь справиться с perl. Я пытаюсь написать несколько сценариев в качестве имитатора планирования. FCFS, SSTF и Scan and LookАлгоритм имитации жесткого диска (отслеживание времени следования) Perl

У меня есть один массив со списком запросов блока, а другой - как буфер. Сначала я копирую по первому запросу, затем мне нужно выяснить время, необходимое для перехода от первого ко второму блоку.

буфер читает в блоках на 1 мс в, искать, искать и время доступа все 1мс, чтобы сделать вычисления немного проще, имитатор всегда начинается на блоке 1 трек 1.

http://postimg.org/image/d9osb8tkj/

поэтому, если первый блок равен 5, время поиска будет равным 3 мс для перехода к началу 5-го блока, время поиска будет равным нулю, так как оно будет на одной и той же дорожке, и время доступа для чтения блока будет всегда равным 1 мс. Это означает, что время для этого запроса будет равным 4 мс, поэтому симулятор будет читать в следующих 4 запросах в буфер. Вначале это было первым, это будет порядок, на который поданы заявки.

Так что если следующий запрос на обслуживание - 12, то рука находится на конце 5-го блока, поэтому потребуется 2 мс, чтобы добраться до правильной дорожки, затем 1 мс, чтобы добраться до начала 12-го блока, а еще 1 мс для доступа к нему ,

Мне просто интересно, может ли кто-нибудь дать мне представление о том, как я мог бы выразить это как алгоритм. Просто некоторые указатели были бы очень оценены.

+0

Um, если вы начинаете на 1.1 и нужно, чтобы добраться до 1.5, вам нужно прокрутить 4, а не 3. –

ответ

0

написать класс HardDiskSim::Abstract, 3 подводные лодки seek_time(), spin_time() и read_time()

Написать подкласс AbstractDisk для каждого различного набора значений/логики для трех методов.

пихты пример:

package HardDiskSim::Simple; 
use base qw(HardDiskSim::Abstract); 

our $SECTORS_PER_TRACK = 5; 
our $SEEK_TTIM_PER_TRACK = 1; 
sub read_time { return 1 } 
sub seek_time { 
    my $block = @_; 
    my $tracks_to_seek = int($block/$SECTORS_PER_TRACK); 
    return $tracks_to_seek * $SEEK_TTIM_PER_TRACK; 
} 

sub spin_time { 
    # compute head position at end of seek using seek time and RPM of disk 
    # compute number of sectors to spin past using computed head position 
    # return number_of_sectors_to_spin_past * time_per_sector 
} 

Я имел удовольствие от написания такого рода кода в Fortran, для класса, еще в 1985 году

 Смежные вопросы

  • Нет связанных вопросов^_^