Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
всі білети.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
696 Кб
Скачать
☆

Архітектура операційних систем. Реалізація архітектури операційних систем. Монолітні системи.

Монолітні системи ОС, у яких усі базові функції сконцентровані в ядрі, називають монолітними системами. У разі реалізації монолітного ядра ОС стає продуктивнішою (проце­ сор не перемикається між режимами під час взаємодії між її компонентами), але менш надійною (весь її код виконується у привілейованому режимі, і помилка в кожному з компонентів є критичною). Монолітність ядра не означає, що всі його компоненти мають постійно перебу­ вати у пам'яті. Сучасні ОС дають можливість динамічно розміщувати в адресному просторі ядра фрагменти коду (модулі ядра). Реалізація модулів ядра дає можли­ вість також досягти його розширюваності (для додання нової функціональності досить розробити і завантажити у пам'ять відповідний модуль).

Керування процесами і потоками. Програмний інтерфейс керування потоками posix.

Керування потоками є частиною стандарту POSIX. Усі типи даних і функції, визначені стандартом, мають префікс pthread, для їхнього в Розглянемо структуру керуючого блоку процесу в Linux і відмінності його реалі-

зації у традиційних UNIX-системах [58, 95J.

Керуючий блок процесу в Linux відображається структурою даних task_struct.

До найважливіших полів цієї структури належать поля, що містять таку інформацію:

♦ ідентифікаційні дані (зокрема pid - ідентифікатор процесу);

♦ стан процесу (виконання, очікування тощо);

♦ покажчики на структури предка і нащадків;

♦ час створення процесу та загальний час виконання (так звані таймери процесу);

♦ стан процесора (вміст регістрів і лічильник інструкцій);

♦ атрибути безпеки процесу (uid, gid, euid, egid).икористання необхідно підключати заголовний файл pthread.h. Щоб додати новий потік у поточний процес, у POSIX використовують функцію pthread_create() :

#include<pthread.h>

int pthread_create(pthread_t 4h. pthread_attr_t *attr. void *(*thread_fun)(void *). void *arg):

th — покажчик на заздалегідь визначену структуру типу pthread_t, яка далі бу­ де передана в інші функції роботи з потоками

attr - покажчик на структуру з атрибутами потоку

thread_fun - покажчик на функцію потоку, що має описуватися як #include<pthread.h>

void *mythread_fun(void *value) { // виконання коду потоку }

arg - дані, що передаються у функцію потоку (туди вони потраплять як пара­ метр value).

Для завершення потоку достатньо дійти до кінця його функції потоку thread_fun() або викликати з неї pthread_exit():

void pthread_exit(void *retval);

Параметр retval задає код повернення. Наведемо приклад завершення потоку:

void *thread_fun(void *num) {

printf ("потік номер $d\n". (int)num); pthread_exit (0): }

Приєднання потоків POSIX. Для очікування завершення виконання потоків використовують функцію pthread _join(). Вона має такий синтаксис: int pthread_join(pthread_t th. void **status); Ця функція блокує потік, де вона була викликана, доти, поки потік, заданий дескриптором th, не завершить своє виконання. Потік, на який очікують, має існувати в тому самому процесі й не бути від'єднаним. Якщо status не є нульовим покаж­ чиком, після виклику він вказуватиме на дані, повернені потоком . Якщо потік уже завершився до моменту виклику функції pthread_join(), його інформація має бути зчитана негайно.Від'єднані потоки. Задання атрибутів потоків POSIX Для того, щоб отримати від'єднаний потік, треба задати відповідні атрибути потоку, виконавши такі дії.

Описати змінну для їхнього зберігання (атрибути потоку відображає структура даних pthread_attr_t): pthread_attr_t attr:

Ініціалізувати цю змінну так: pthread_attr_init(&attr);

Задати атрибут за допомогою виклику спеціальної функції (різним атрибутам відповідають різні функції). Для задання атрибута, який визначає, чи буде цей потік від'єднаним чи ні, ви­ користовують таку функцію: pthread_attr_setdetachstate(pthread_attr_t attr. int detachstate); Другим параметром може бути одне зі значень:PTHREAD_CREATE_JOINABLE (приєднуваний потік);РТНREAD_CREATE_DETACHЕD (від'єднаний потік). Ось приклад задання атрибута і його використання під час створення від'єд­ наного потоку: pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr. PTHREAD_CREATE_DETACHED): pthread_create(&th. &attr. ...): Завершуються такі потоки виходом із функції потоку.