Unix & o C
История o o o 40 -е и 50 -е годы – перфокарты 60 -е MULTICS (MULTiplexed Information and Computing Service — мультиплексная информационная и вычислительная служба) UNICS (UNiplexed Information and Computing Service — примитивная информационная и вычислительная служба).
o o o 70 -е годы UNIX на PDP-11/20, PDP-11/45 и PDP-11/70 Кен Томпсон решил переписать UNIX на языке высокого уровня Разработка языка С
Разновидности o o UNIX корпорации AT&T (1984 год) UNIX System III. (в дальнейшем System IV и System V) Berkeley UNIX 1 BSD (First Berkeley Software Distribution — программное изделие Калифорнийского университета, 1 я версия).
o o конец 80 -х – принятие стандарта POSIX (1003. 1) 1987 Система MINIX 1991 Linux GPL (GNU Public License — общедоступная лицензия)
Общая структура UNIX
Структура ядра
Процессы в системе UNIX o Единственными активными сущностями в системе UNIX являются процессы
Создание процессов o Системный вызов fork создает точную копию исходного процесса, называемого родительским процессом
Некоторые системные вызовы, относящиеся к процессам Системный вызов Описание pid=fork() Создать дочерний процесс, идентичный родительскому pid=waitpid(pid, &statloc, opts) Ждать завершения дочернего процесса s=execve(name, argv, envp) Заменить образ памяти процесса exit(status) Завершить выполнение процесса и вернуть статус s=sigaction(sig, &act, Soldact) Определить действие, выполняемое приходе сигнала s=sigreturn(&context) Вернуть управление после обработки сигнала s=sigprocmask(how, &set, &old) Исследовать или изменить маску сигнала s=sigpending(set) Получить или установить блокированные сигналы s=sigsuspend(sigmask) Заменить маску сигнала и приостановить процесс s=kill(pid, sig) Послать сигнал процессу residual=alarm(seconds) Установить будильник s=pause() Приостановить выполнение процесса до следующего сигнала
Системные вызовы управления потоками Основные вызовы управления потоками стандарта POSIX Вызов Описание pthread_create Создать новый поток в адресном пространстве вызывающего процесса pthreadexit Завершить вызывающий процесс pthreadjoin Подождать, пока не заверш. Реализация ится процесс Создать новый мьютекс pthread_mutex_init процессов в UNIX pthread_mutex_destroy Уничтожить мьютекс pthread_mutex_lock Заблокировать мьютекс pthread_mutex_unlock Разблокировать мьютекс pthreadcondjnit Создать условную переменную pthread_cond_destroy Уничтожить условную переменную pth read_cond_wait Ждать условную переменную pthread_cond_signal Разблокировать один поток, ждущий условную переменную
Реализация процессов в UNIX o o Параметры планирования. Образ памяти. Сигналы Разное.
Структура пользователя o o o Машинные регистры Состояние системного вызова Таблица дескрипторов файлов Учетная информация Стек ядра
Планирование в системе UNIX o Два уровня планирования n n o Низкоуровневый алгоритм выбирает следующий процесс из набора процессов в памяти и готовых к работе Высокоуровневый алгоритм перемещает процессы из памяти на диск и обратно Priority = CPU_usage + nice + base.
Планирование в системе Linux o o o Потоки реального времени, обслуживаемые по if (class ==real_time) goodness = 1000 + priority; алгоритму FIFO (First in First Out —> 0) goodness if (class == timesharing && quantum первым прибыл — + priority; = quantum первым обслужен). Потоки реального времени, quantum == 0) в if (class == timesharing && обслуживаемые порядке циклической очереди. goodness = 0; Потоки разделения времени
Управление памятью в UNIX
Свопинг o o o Системному вызову fork требовалась память для дочернего процесса. Системный вызов brk собирался расширить сегмент данных. Разросшемуся стеку требовалась дополнительная память.
Постраничная подкачка в системе UNIX
Управление памятью в Linux