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

ОГЛАВЛЕНИЕ

Буферизация

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

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