Linux Kernel (Ядро линукса) (часть 2)


Удаление адресного пространства процесса

Когда процесс завершает работу, ядро вызывает функцию exit mm (), чтобы та освободила адресное пространство, принадлежащее процессу:mm_release(tsk, tsk->mm) ;
if (! (mm = tsk->mm) ) / kernel thread ? / return; down_r ea d (&mm- >mmap_s em) ;
Функция mm_release возобновляет выполнение всех процессов, спящих” в completion-структуре tsk->vfork_done В типичном случае соответствующая очередь ожидания непуста, только если завершающий процесс был создан с помощью системного вызова vfork
Если завершающийся процесс не является потоком ядра, функция exit mmo должна освободить дескриптор памяти и все структуры, имеющие отношение к процессу. Во-первых, она проверяет, установлен ли флаг mm->core_waiters.

Если установлен, значит, процесс выполняет дамп содержимого памяти в файле core. Чтобы избежать порчи данных в файле core, функция использует COmpletion-CTpyKTypbl mm->core_done И mm->core_startup_done ДЛЯ Сериализа- ции выполнения облегченных процессов, совместно использующих дескриптор памяти mm.

Затем функция увеличивает главный счетчик обращений дескриптора памяти, сбрасывает поле mm дескриптора процесса и переводит процессор в "ленивый" режим TLB atomic_inc (&mm->mm_count) ; spin_lock(tsk->alloc_lock); tsk->mm = NULL; up_read (&mm->map_sem) ; enter_lazy_tlb(mm, current); spin_unlock(tsk->alloc_lock); mmput (mm) ;
Наконец, вызывается функция mmput (), которая освобождает локальную таблицу дескрипторов, дескрипторы областей памяти и Таблицы Страниц. Однако сам дескриптор памяти не освобождается, потому что функция exit mmo увеличила главный счетчик обращений. Дескриптор будет освобожден функцией finish task switcho, когда локальный процессор фактически прекратит выполнение данного процесса.

Предыдущая страница | 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 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...