Операционные системы. Марапулец Ю.В. - 22 стр.

UptoLike

Составители: 

Выполнению этих операций способствуют две дополнительные функции.
Функция GetPageBaseEntry получает в качестве аргумента индекс массива и
возвращает индекс первого элемента соответствующего страничного блока.
Иными словами, эта функция производит округление до ближайшего меньшего
значения, кратного четырем. Функция AdjustLookupTable удаляет запись,
выделенную в списке, и смещает все последующие элементы для заполнения
образовавшейся пустоты.
void DeleteItem ( void )
{
int iCurSel; // позиция текущей выбранной строки в списке
int iPlace; // позиция текущей выбранной строки в массиве элементов
int iStart; // позиция первого элемента в той странице памяти,
// где находится выбранный элемент
int i; // переменная цикла
BOOL bFree; // TRUE, если все 4 элемента, содержащиеся в данной
// странице памяти, не используются
BOOL bTest; // для проверки результатов
// определяет смещение в памяти текущей выбранной записи
iCurSel = ListBox_GetCurSel( hwndList ) ;
iPLace = iListLookup [iCurSel] ;
// обнуляет удаленный элемент
FillMemory( & (pBase [iPlace * ITEM_SIZE] ) , ITEM_SIZE, 0 );
// помечает этот элемент как свободный
bInUse[iPlace] = FALSE;
На данном этапе определяется номер первого элемента в текущей
странице памяти. Если все четыре элемента, которые находятся на данной
странице, свободны, закрепление страницы отменяется.
iStart = GetPageBaseEntry( iPlace ) ;
bFree = TRUE;
for( i = 0; i < 4; i++ ) // проверка четырех записей
{
if( bInUse[i + iStart] ) // используется?
{
bFree = FALSE; // страница занята
}
}
Если не используется вся страница памяти, она освобождается.
if( bFree ) // свободна ли страница?
{ // ДА; освободить ее
22
      Выполнению этих операций способствуют две дополнительные функции.
Функция GetPageBaseEntry получает в качестве аргумента индекс массива и
возвращает индекс первого элемента соответствующего страничного блока.
Иными словами, эта функция производит округление до ближайшего меньшего
значения, кратного четырем. Функция AdjustLookupTable удаляет запись,
выделенную в списке, и смещает все последующие элементы для заполнения
образовавшейся пустоты.

void DeleteItem ( void )
{
      int iCurSel;        // позиция текущей выбранной строки в списке
      int iPlace;     // позиция текущей выбранной строки в массиве элементов
      int iStart;         // позиция первого элемента в той странице памяти,
                            // где находится выбранный элемент
      int i;                    // переменная цикла
      BOOL bFree; // TRUE, если все 4 элемента, содержащиеся в данной
                            // странице памяти, не используются
      BOOL bTest;               // для проверки результатов
        // определяет смещение в памяти текущей выбранной записи
      iCurSel = ListBox_GetCurSel( hwndList ) ;
      iPLace = iListLookup [iCurSel] ;
         // обнуляет удаленный элемент
      FillMemory( & (pBase [iPlace * ITEM_SIZE] ) , ITEM_SIZE, 0 );
            // помечает этот элемент как свободный
      bInUse[iPlace] = FALSE;

     На данном этапе определяется номер первого элемента в текущей
странице памяти. Если все четыре элемента, которые находятся на данной
странице, свободны, закрепление страницы отменяется.

      iStart = GetPageBaseEntry( iPlace ) ;
      bFree = TRUE;
      for( i = 0; i < 4; i++ )         // проверка четырех записей
      {
              if( bInUse[i + iStart] )       // используется?
              {
                     bFree = FALSE;                // страница занята
              }
      }

      Если не используется вся страница памяти, она освобождается.

      if( bFree )               // свободна ли страница?
      {                     // ДА; освободить ее

                                          22