Анимация
JavaScript


Главная  Библионтека 

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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 [ 221 ] 222 223 224 225

33. Gl. [Очистка полей связей.] Установить Р <- 1 и повторять операции LINK(P) 4- Л и Р 4- Р + SIZE(P) до тех пор, пока не будет выполнено условие Р = AVAIL. (Таким образом поля LINK в первых словах каждого узла устанавливаются равными Л. В большинстве случаев можно считать, что этот шаг не является необходимым, поскольку поле LINK(P) устанавливается равным Л на шаге G9 ниже, а также может быть сброшено распределителем памяти.)

G2. [Инициализация фазы маркировки.] Установить ТОР <- USE, LINK (ТОР) <- AVAIL, LINK (AVAIL) <- Л. (TOP указывает на вершину стека, как в алгоритме 2.3.5D.)

G3. [Поднятие стека.] Установить Р 4- ТОР, ТОР <- LINK(TOP). Если ТОР = Л, перейти к шагу G5.

G4. [Поместить новые связи в стек.] Для 1 < fc < Т(Р) выполнить следующие операции: установить Q <- LINK(P-l-fc); затем, если Q Л и LINK(Q) = Л, установить LINK(Q) 4- ТОР, ТОР <- Q, после чего вернуться к шагу G3.

G5. [Инициализация следующей фазы.] (Теперь Р = AVAIL и фаза маркировки завершена, так что первое слово каждого доступного узла имеет ненулевую связь LINK. Цель наших последующих действий - объединение смежных недоступных узлов для ускорения последующих шагов и назначение новых адресов доступным узлам.) Установить Q <- 1, LINK(AVAIL) <- Q, SIZE(AVAIL) О, Р <- 1. (Ячейка AVAIL используется в качестве ограничителя для указания конца цикла в последующих фазах.)

G6. [Присвоение новых адресов.] Если LINK(P) = Л, перейти к шагу G7. Если условие не соблюдено, то при SIZE(P) = О перейти к шагу G8, иначе - установить LINK(P) <- Q, Q <- Q -t- SIZE(P), Р <- Р -t- SIZE(P) и повторить этот шаг.

G7. [Слияние свободных областей.] Если LINK(Р-t-SIZE(Р)) = Л, увеличить SIZE(P) на SIZE(P + SIZE(P)) и повторить этот шаг. Иначе - установить Р 4- Р -Н SIZE(P) и вернуться к шагу G6.

G8. [Преобразование всех связей,] (Теперь в поле LINK первого слова каждого доступного узла содержится адрес, куда будет перемещен узел.) Установить USE <-LINK (USE) и AVAIL 4- Q. Затем установить Р 4- 1 и повторять следующие операции до тех пор, пока не будет выполнено условие SIZE(P) = 0: если LINK(P) ф Л, установить LINK(Q) <- LINK (LINK (Q)) для всех Q, таких, что Р < Q < Р -t- Т(Р) и LINK(Q) ф Л; затем независимо от значения LINK(P) установить Р 4- Р -t- SIZE(P).

G9. [Перемещение.] Установить Р 1 и повторять следующие операции до тех пор, пока не будет выполнено условие SIZE(P) = 0: установить Q 4- LINK(P) и, если Q Л, установить LINK(P) <- А и NODE(Q) NODE(P); затем независимо от того, справедливо ли условие Q = Л, установить Р <- P--SIZE(P). (Операция NODE(Q) 4- NODE(P) приводит к перемещению SIZE(P) слов; всегда Q < Р, так что перемещение этих слов из меньших адресов в большие безопасно.)

[Этот метод называется "сборщик мусора в LISP 2". Другой интересный метод, не требующий наличия поля LINK в начале узла, может основываться на идее связывания всех указателей на каждый узел. См. Lars-Erik Tliorelli, BIT 16 (1976), 426-441; R. В. К. Dewar and A. P. McCann, Software Practice & Exp. 7 (1977), 95-113; F. Lockwood Morris, CACM 21 (1978), 662-665, 22 (1979), 571; H. B. M. Jonkers, Inf. Proc. Letters 9 (1979), 26-30; J. J. Martin, CACM 25 (1982), 571-581; F. Lockwood Morris, Jnf. Proc. Letters 15 (1982), 139-142, 16 (1983), 215. Другие методы можно найти в работах В К. Haddon and W. М. Waite, Сотр. J. 10 (1967), 162-165; В. Wegbreit, Сотр. J. 15 (1972), 204-208; D. A. Zave, fnf Proc. Letters 3 (1975), 167-169. Коэн (Cohen) и Николау (Nicolau) проанализировали четыре из этих подходов в АСМ Trans. Prog. Languages and Systems 5 (1983), 532-553.]



34. Пусть TOP = гП, Q упрощения щага G4, что

S г12, Р = г13, к = г14, SIZE(P) = rI5. Л = О и LINK(O) ф 0. Шаг 01 опущен.

Положим также для

LINX

INFO EQU

SIZE EQU

G2. Инициализаиия Фазы маркировки. ТОР <- USE.

AVAIL

0,1(LINK)

LINK(ТОР) <- AVAIL.

0,2(LINK)

LINK(AVAIL) <- Л.

ENT3 0,1

a + 1

03. Поднятие стека. Р <- ТОР.

0,1(LINK)

a + 1

ТОР <- LINK(ТОР).

a + 1

Перейти к шагу G5 при ТОР = Л.

0,3(T)

04. Поместить новые связи в стек, к <-Т(Р).

a + b

fc = 0?

INC3

Р <- Р + 1.

DEC4

fc<-fc-l.

0,3(LINK)

Q <- LINK(P).

0,2(LINK)

JANZ

Переход, если LINK(Q) Ф Л.

0,2(LINK)

Иначе -установить LINK (Q) •(-ТОР,

ENTl

a - 1

ТОР <- Q.

ENT2

05. Инициализация следующей фазы. 0 4-1.

LINK(AVAIL) •(- 1, SIZE(AVAIL) •(-О.

ENT3

Р <- 1.

0,3(LINK)

LINK(P) <- Q.

INC2

Q <- Q + SIZE(P).

INC3

Р <- P + SIZE(P).

0.3(LINK)

a + 1

Об. Присвоение новых адресов.

0.3(SIZE)

a + c+ 1

a + c+ 1

Переход, если LINK(P) = Л.

JSNZ

a + 1

Переход, если SIZE(P) ф 0.

08. Преобразование всех связей.

0.1(LINK)

USE <-LINK (USE).

AVAIL

AVAIL <- Q.

ENT3

P <- 1.

0,6(SIZE)

INCS

rI5 •(- rI5 + SIZE (P + SIZE(P) ).

ENT6

c + d

07. Слияние свободных областей.

INC6

c + d

rI6 <- P + SIZE(P).

0.6(LINK)

c + d

c + d

Переход, если LINK(rI6) = Л.

0,3(SIZE)

SIZE(P) <-rI5.

INCS 0,S

P <- P + SIZE(P).

DEC4

fc<- fc-1.



INC2

Q4- Q+1.

0.2(LINK)

0,6(LINK)

0,2(LINK)

LINK(Q) <- LINK(LINK(Q)).

J4NZ

a + b

Переход, если к фО.

INC3

a + с

Р <- Р+ SIZE(P).

0,3(LINK)

1+a + c

0,3(SIZE)

1+a + c

1+a + c

LINK(P) = Л?

0,3(T)

1 + a

к <- Т(Р).

ENT2

1 + a

Q <- Р.

J5NZ

1 + a

Переход, пока не будет получено SIZE(P)

ENT3

G9. Перемещение. Р 1.

ENTl

Установить гП для операции MOVE.

0,3(LINK)

LINK(P) <- Л.

*+l(4:4)

MOVE

0,3(.)

NODE (rll) <- NODE(P), rll <- rll + SIZE(P)

INC3

a + с

P<-P + SIZE(P).

0,3(LINK)

1+a + c

0,3(SIZE)

1+a + c

1+a + c

Переход, если LINK(P) = Л.

J5NZ

1 + a

Переход, пока не будет получено SIZE(P)

В строке 66 предполагается, что размер каждого узла достаточно мал, так что он может быть перемещен с помощью одной операции MOVE. Похоже, что это предположение применимо в большинстве случаев такой сборки мусора.

Общее время работы данной программы составляет (44а + 17Ь + 2u) + 25с + 8d + 47) и, где а - количество доступных узлов, b - количество полей связи в них, с - ксхличество недоступных узлов, которым не предшествует недоступный узел, d-количество недоступных узлов, которым предшествует недоступный узел, и w - общее количество слов в доступных узлах. Если в памяти содержится п узлов, и рп из них недоступно, то можно оценить а = (1 - р)п, с = (1 - р)рп, d = рп, например узлы, состоящие в среднем из пяти слов, в среднем с двумя полями связей на узел и памятью на 1000 узлов. Тогда при Р-\ программа требует 374и времени на восстановление одного свободного узла; при р = j время работы составляет 104и, а при Р = f - всего ЗЗи.

36. Посетитель, который пришел один, может сесть на одно из 16 мест - 1, 3, 4, 6, ..., 23. Если приходит пара, для нее должно оставаться свободное место, так как иначе минимум два посетителя будут находиться на местах (1, 2, 3), минимум два - на местах (4,5, 6), ..., минимум два-на местах (19, 20, 21) и минимум один-на месте 22 или 23, так что в этот момент в закусочной будет находиться как минимум 15 человек.

37. Хозяйка усадила первых 16 одиноких мужчин. В результате между занятыми местами есть 17 промежутков, включая промежутки на концах ряда мест (предполагается, что между соседними занятыми местами имеется промежуток нулевой длины). Общее количество пустых мест, т. е. сумма всех семнадцати промежутков, равна 6. Предположим, что имеется X промежутков нечетной длины; тогда к услугам вновь вошедшей пары - 6 - х свободных мест. (Заметьте, что 6-ж четно и > 0.) Теперь каждый посетитель номер 1, 3, 5, 7, 9, 11, 13, 15 слева направо, у которого четны промежутки с обеих сторон, встает и уходит. Каждый нечетный промежуток препятствует уходу не более одного из посетителей, следовательно, уйдут по меньшей мере 8 - ж человек. Остается все еще только 6 - ж мест для того, чтобы посадить вошедшие пары, которых вдруг оказывается (8 - ж)/2.



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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 [ 221 ] 222 223 224 225