Страница 40 из 60
Буферизация
При использовании разряженной матрицы вместо обычных пере- менных можно применять динамическое выделение памяти под матрицу. Пусть, например, имеется два процесса А и В, выполняющиеся в од- ной программе. Предположим, что процесс А требует при работе 60% доступной памяти, а при работе процесса В требуется 55% памяти. Если в процессе А и в процессе В память будет выделяться с по- мощью локальных переменных, то процесс А не сможет обратиться к процессу В, а процесс В не сможет обратиться к процессу А, пос- кольку потребуется более 100% памяти. Если процесс А не обращает- ся к процессу В, то никаких трудностей не будет. Трудности поя- вятся при попытке процесса А обратиться к процессу В. Выход из этого положения заключается в динамическом выделении памяти и для процесса А и для процесса В с освобождением памяти перед обраще- нием одного процесса к другому процессу. Другими словами, если при выполнении каждого процесса, А и В, требуется более половины имеющейся доступной памяти и процесс А обращается к процессу В, то должно использоваться динамическое распределение памяти. В этом случае процессы А и В будут получать в свое распоряжение па- мять, когда она им действительно потребуется.
Предположим, что при выполнении некоторой программы, исполь- зующей две указанные ниже функции, остается 100 000 байт неис- пользованной памяти.
procedure B; forward; procedure A; var a:array[1..600000] of char; . . . begin . . . B; . . . end; procedure B; var b:array[1..55000] of char; begin . . . end;
Здесь каждый из процессов А и В имеет локальные переменные, на которые расходуется более половины имеющейся доступной памяти. В данном случае нельзя будет выполнить процесс В, поскольку памя- ти недостаточно для выделения 55 000 байт под локальный массив "в". В подобных случаях трудности часто оказываются непреодолимы- ми, но в некоторых случаях кое-что сделать можно. Если процесс А не требует сохранения содержимого массива "а" при выполнении про- цесса В, то процессы А и В могут совместно использовать один участок памяти. Это можно обеспечить динамическим выделением па- мяти под массивы А и В. Процесс А перед обращением к процессу В должен освободить память и затем вновь ее получить после заверше- ния процесса В. Программа должна иметь следующую структуру:
procedure B; forward; procedure A; var a:^array[1..600000] of char; begin New(a); . . . Dispose(a); { освобождение памяти для процесса В } B; New(a); { новое выделение памяти } . . . Dispose; end;
procedure B; var b:^array[1..55000] of char; begin New(b); . . . Dispose(b); end;
При выполнении процесса В существует только указатель "а". Хотя этим методом вы будете пользоваться нечасто, его следует хо- рошо знать, поскольку он часто является единственным способом ре- шения подобных проблем.
|