Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_СГTУ new v10.doc
Скачиваний:
101
Добавлен:
12.11.2019
Размер:
4.13 Mб
Скачать

Завершение потока

При завершении потока различают два случая:

1) «естественное» завершение выполнения потока из кода самого потока;

2) завершение потока извне, из кода другого потока или по сигналу. Для этого действия, в отличии от «естественного » завершения, используется термин – отмена.

Завершение потока происходит при достижении функцией потока своего естественного конца, выполнения оператора return или выполнения потоком вызова void pthread_exit(). Если поток принадлежит к категории ожидаемых, то он может возвратить результат своей работы другому потоку, ожидающему его завершения на вызове pthread_join(). Если поток отсоединенный, то по его завершении все системные ресурсы, задействованные потоком, освобождаются немедленно. Для последнего потока процесса вызов void pthread_exit() эквивалентен exit().

Отмена потока значительно более сложная задача. Это связанно с тем, что необходимо корректно завершить все системные объекты (файловые дискрипторы, блоки динамической памяти, примитивы синхронизации и др.), связанные с отменяемым потоком.

Для отмены (принудительного завершения) потока используется вызов

int pthread_cancel(pthread_t thread);

где в качестве параметра указывается TID отменяемого потока (см. пример sy22.cc в [17]). Однако этот вызов не отменяет поток, а только запрашивает возможность отмены потока. Поток может отказаться выполнять любые отмены, вызвав из своей функции потока: int pthread_setcancelstate(int state, int* oldstate).

Отмена потока состоит из следующих этапов:

  1. выполняются все процедуры завершения, занесенные ранее в стек завершения вызовами pthread_cleanup_push();

  2. выполняются деструкторы собственных данных потока;

  3. отменяемый поток завершается;

  4. действие отмены – асинхронный с точки зрения вызывающего pthread_cancel() кода, поэтому вызывающий отмену поток должен дождаться завершения потока на вызове pthread_join().

3.5. Управление потоками и процессами в qnx6

Микроядро QNX и администратор процессов обеспечивают управление памятью и защиту адресного пространства одного процесса от других с помощью блока управления памятью. С помощью них ОС может завершить процесс сразу после возникновения ошибки доступа к памяти. ОС узнает о месте ошибочной инструкции и может запустить символьный отладчик, начиная с этой инструкции. Микроядро делит физическую память на страницы размером 4 кБайта. Процессор использует набор из множества таблиц страниц, хранящихся в системной памяти. Эти таблицы служат для описания того, как виртуальный адрес преобразуется процессором для доступа к физизической памяти [19]. Во время выполнения потока в таблицу страниц заносятся данные о том, как адреса памяти, используемые потоком, отображаются в физической памяти системы. Для сохранения высокой производительности процессор выполняет кэширование часто используемых сегментов памяти. В QNX предусмотрено управление на уровне таблиц страниц. С ними связаны биты, определяющие атрибуты каждой страницы. Страницы могут лишь различаться по степени доступа. Память выполняет процесс со страницы «только чтение» для кода и «чтение и запись» для данных. Когда применяется операция приостановки одного, и выполнения другого приоритетов, она указывает блок управления памятью применить для потока другой набор таблиц страниц. Если меняется контекст в потоке между процессами, изменения блока управления не требуется. Так же применяются аппаратные таймеры, он присоединяется к процессу, и если передачи сигнала нет, процесс перезагружается. Для пользовательских процессов отводится 2,5 Гб адресного пространства. А оставшиеся 1,5 Гб отводится для микроядра.