Энциклопедия Turbo Pascal. Главы 1-4
Страница 40. Буферизация


Буферизация

     При использовании  разряженной  матрицы вместо обычных пере-
менных можно применять динамическое выделение памяти под матрицу.
Пусть,  например, имеется два процесса А и В, выполняющиеся в од-
ной программе.  Предположим, что процесс А требует при работе 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;

     При выполнении процесса В существует только  указатель  "а".
Хотя этим методом вы будете пользоваться нечасто, его следует хо-
рошо знать, поскольку он часто является единственным способом ре-
шения подобных проблем.


 
« Предыдущая статья