Главная  Полное построение алгоритма 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [ 88 ] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

с РАЗМЕЩЕНИЕ СТРАНИЦЫ К В КОНЦЕ СПИСКА И УДАЛЕНИЕ

С ИЗ НАЧАЛА СПИСКА СТРАНИЦЫ , КОТОРАЯ ДОЛЬШЕ ВСЕХ

С НЕ ИСПОЛЬЗОВАЛАСЬ

FRAtlE(J) = К AFTER(END) = К BEFORE(K) = END END = К

TI = AFTER(FRONT)

BEFORE(TI) = G

AFTER(FRONT) « 0

FRONT = TI

FAULT(I) = 1

TOTAL - TOTAL t 1 160 CONTINUE 170 CONTINUE

С ПЕЧАТЬ РЕЗУЛЬТАТОВ С

WRITE (6,900) FRAMES,PAGES 900 Р0РМАТ(1НВ,39НАЛГ0РИТН УПРАВЛЕНИЯ СТРАНИЧНОЙ ПАМЯТЬЮ , 1 9Н LRU ДЛЯ ,1Э,1?.Н ОБЛАСТЕЙ И .13,8Н СТРАНИЦ)

WRITE (6,950)

950 F0RHAT(1HD,37HCTP0KA ОБРАЩЕНИЙ И ПОСЛЕДОВАТЕЛЬНОСТЬ, 1 8Н ОТКАЗОВ)

WHITE (6,1QQQ) (REF( I) ,I=1,N) WRITE (6,1000) (FAULT(1),I=1,N) 1000 FORMAT(1HO,40I3) С

С ПЕРВЫЕ =.FRAMES= ОТКАЗОВ - СВОБОДНЫЕ С

TOTAL . TOTAL - FRAMES RATE = FLOAT(TOTAL) / (N-FRAHES) WRITE (6,1010) TOTAL,RATE 1D10 FDRHAT(1H0,2m ЧИСЛО ОТКАЗОВ РАВНО ,13,11Н А ЧАСТОТА, 1 7Н РАВНА ,Р6.Э)

RETURN END



Реализация алгоритма LFU аналогична реализации предыдущих двух алгоритмов. Основное отличие состоит в использовании массива FREQ, элемент которого FREQ{/C) равен числу появлений страницы К в цепочке обращений. Когда происходит страничный отказ, мы удаляем из памяти страницу /, обладающую наименьшим значением FREQ(y). Если две или более страниц, находящихся в памяти, обладают одинаковым наименьшим значением частоты, то мы удаляем ту из них, которая находится в памяти дольше. Для этого проверяется массив ENTER, где ENTER (/) равно времени последнего поступления страницы J в память, т. е. если REF(/)=/C вызывает страничный отказ, то мы устанавливаем ENTER (/()=/. Эта реализация приведена на рис. 5.4.4.

Теперь испытаем эти алгоритмы управления страничной памятью. Для каждого алгоритма мы построим цепочку обращений длины N и запишем число страничных отказов (TOTAL) в этой цепочке. Частотой отказов для каждого алгоритма будет отношение (TOTAL - FRAMES)/(Л/-FRAMES), где FRAMES - число страничных областей в памяти. Причина уменьшения как TOTAL, так и на величину FRAMES состоит в том, что мы рассматриваем первые FRAMES отказов как «свободные», так как при этих отказах все алгоритмы одинаково заполняют свободные области страницами»

Для выработки плана проверки мы должны принять несколько упрощающих предположений:

1. Программы, генерирующие цепочку обращений, будут иметь 20 страниц. Первые 6 страниц будут заняты текстом программы, а остальные 14 - данными (рис. 5.4.5).

2. Так как частота страничных отказов для любого алгоритма сильно зависит от отношения PAGES к FRAMES, мы будем менять FRAMES от 2 до 18 шагами по 2 единицы. При каждом значении FRAMES будем использовать для вычисления частоты страничных отказов одну и ту же строку обращений.

3. Самые существенные предположения относятся к механизму генерации цепочки обращений. В идеальном случае она должна быть «представительна» относительно обращений к страницам, которые генерируются «типичной» 20-страничной программой с 14 страницами данных. К сожалению, очень трудно решить, какую программу считать типичной. Поэтому мы сделаем несколько предположений, основываясь на рис. 5.4.5.

Рассмотрим операторы А=В-\-С и GO ТО 400, находящиеся во второй странице; переменные А, В ц С запоминаются на страницах данных с номерами 12, 15 и 19 соответственно. При трансляции в код ассемблера эти операторы, по-видимому, породят строку обращений 2-19-2-15-2-12-2-3. Это наводит на мысль, что строки обращений, вероятно, состоят из перемежающихся обращений к страницам программы и к страницам данных, причем изредка встречаются пары последовательных обращений к страницам текста про-



SUBROUTINE LFU (REF.N,FRAMES.PAGES)

ЭТА ПОДПРОГРАММА ПОДУЧАЕТ НА ВХОД ПОСДЕДОВАТЕЛЬНОСТЬ

HEF(1).....REF(N) ОБРАЩЕНИЙ К СТРАНИЦАМ , ЦЕЛОЕ

=FRAMES= УКАЗЫВАЕТ ЧИСЛО СТРАНИЧНЫХ ОБЛАСТЕЙ, А ЦЕЛОЕ =fAGES= УКАЗЫВАЕТ ЧИСЛО РАЗЛИЧНЫХ СТРАНИЦ. ПОДПРОГРАММА НАХОДИТ ЧИСЛО СТРАНИЧНЫХ ОТКАЗОВ , ВЫЗВАННЫХ ДАННОЙ ПОСЛЕДОВАТЕЛЬНОСТЬЮ ПРИ ИСПОЛЬЗОВАНИИ АЛГОРИТМА ЗАМЕЩЕНИЯ LFU. ПОДПРОГРАММА ПЕЧАТАЕТ СТРОКУ ОБРАЩЕНИЙ REF(1)...REF(N), ПОСЛЕДОВАТЕЛЬНОСТЬ FAULT(1)...FAULT(N), ГДЕ FAULT(I)=1, ЕСЛИ REF(I) ВЫЗЫВАЕТ СТРАНИЧНЫЙ ОТКАЗ , И FAULT(J)=0 В ОСТАЛЬНЫХ СЛУЧАЯХ. ОНА ТАКЖЕ ПЕЧАТАЕТ ОБЩЕЕ ЧИСЛО СТРАНИЧНЫХ ОТКАЗОВ, ВЫЗВАННЫХ ДАННОЙ ПОСЛЕДОВАТЕЛЬНОСТЬЮ и ЧАСТОТУ ОТКАЗОВ ДЛЯ ЭТОГО ЧИСЛА СТРАНИЧНЫХ ОБЛАСТЕЙ

=== ФОРМАЛЬНЫЕ ПАРАМЕТРЫ

REF(1)...REF(N) СТРОКА ОБРАЩЕНИЙ К СТРАНИЦАМ

FRAMES ЧИСЛО СТРАНИЧНЫХ ОБЛАСТЕЙ

PAGES ЧИСЛО СТРАНИЦ ПРОГРАММЫ

=== ВНУТРЕННИЕ ПЕРЕМЕННЫЕ

ENTER( I) FAULTd)

FRAMEd)

FREQII)

TABLE! I) TOTAL

ЗАПОМИНАЕТ САМОЕ ПОСЛЕДНЕЕ ОБРАЩЕНИЕ К СТРАНИЦЕ 1.

И ЕСЛИ REFd) ВЫЗЫВАЕТ СТРАНИЧНЫЙ ОТКАЗ, =0 В ОСТАЛЬНЫХ СЛУЧАЯХ

=J ЕСЛИ СТРАНИЦА J В ОБЛАСТИ I

ЧИСЛО ПОЯВЛЕНИЙ СТРАНИЦЫ I В СТРОКЕ ОБРАЩЕНИЙ

=J ЕСлИ СТРАНИЦА I РАЗМЕЩЕНА В ОБЛАСТИ J, =D ЕСЛИ СТРАНИЦЫ I НЕТ В ПАМЯТИ

ОБЩЕЕ ЧИСЛО СТРАНИЧНЫХ ОТКАЗОВ. ВЫЗВАННЫХ REFd)...REF(N)

INTEGER REF(N).FRAMES,PAGES

I NT EG ER E NTE R(100),FAULT(10ОО).FRAME(50J,FREQ(10OJ INTEGER TABLEdOD) .TOTAL

Рис. 5.4.4. Реализация алгоритма LFU.



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [ 88 ] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

0.0019