Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Матеріальне забезпечення занять. 2. Oпераційна система Linux CentOS.






1. ЕОМ типу IBM PC.

2. Oпераційна система Linux CentOS.

Короткі теоретичні відомості:

Процеси та потоки в Linux.

Процес в Linux (як і в UNIX) – це програма, яка виконується в окремому віртуальному адресному просторі. Коли користувач реєструється в системі, автоматично створюється процес, в якому виконується оболонка (shell), наприклад, /bin /bash.

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

Ядро надає системні виклики для створення нових процесів і для управління породженими процесами. Будь-яка програма може почати виконуватися тільки якщо інший процес її запустить або станеться якесь переривання (наприклад, переривання зовнішнього пристрою).

У зв'язку з розвитком SMP (Symmetric Multiprocessor Architectures) в ядро ​ ​ Linux було запроваджено механізм ниток або потоків управління (threads). Потік – це процес, який виконується у віртуальній пам'яті, що використовується разом з іншими потоками процесу, який має окрему віртуальну пам'ять.

Якщо інтерпретатору (shell) зустрічається команда, відповідна виконуваному файлу, інтерпретатор виконує її, починаючи з точки входу (entry point). Для С-програм entry point – це функція main. Запущена програма теж може створити процес, тобто запустити якусь програму і її виконання теж почнеться з функції main.

Для створення процесів використовуються два системних виклики: fork() і exec.fork() створює новий адресний простір, який повністю ідентичний адресному простору основного процесу. Після виконання цього системного виклику ми отримуємо два абсолютно однакових процеси – основний і породжений. Функція fork () повертає 0 у породженому процесі і PID (Process ID – ідентифікатор породженого процесу) – в основному. PID – це ціле число.

Тепер, коли ми вже створили процес, ми можемо запустити програму за допомогою виклику exec. Параметрами функції exec є ім'я виконуваного файлу і, якщо потрібно, параметри, які будуть передані цій програмі. У адресний простір породженого за допомогою fork () процесу буде завантажена нова програма та її виконання розпочнеться з точки входу (адреса функції main).

Як приклад розглянемо рагмент програми:

if (fork()==0) wait(0);

else execl(" ls", " ls", 0); /* порожденный процесс */

Тепер розглянемо детальніше, що ж робиться при виконанні виклику fork ():

1. Виділяється пам'ять для описувача нового процесу в таблиці процесів.

2. Призначається ідентифікатор процесу PID.

3. Створюється логічна копія процесу, який виконує fork () – повне копіювання вмісту віртуальної пам'яті батьківського процесу, копіювання складових ядерного статичного і динамічного контекстів процесу-предка.

4. Збільшуються лічильники відкриття файлів (породжений процес успадковує всі відкриті файли батьківського процесу).

5. Повертається PID в точку повернення з системного виклику в батьківському процесі і 0 - в процесі-нащадку.

Загальна схема управління процесами.

Кожен процес може породжувати повністю ідентичний процес за допомогою fork (). Батьківський процес може чекати закінчення виконання всіх своїх процесів-нащадків за допомогою системного виклику wait.

У будь-який момент часу процес може змінити вміст свого образу пам'яті, використовуючи один з різновидів виклику exec. Кожен процес реагує на сигнали і може встановити власну реакцію на сигнали, що виробляються операційною системою. Пріоритет процесу може бути змінений за допомогою системного виклику nice.

Сигнал – спосіб інформування процесу ядром про відбування якоїсь події. Якщо виникає кілька однотипних подій, процесу буде поданий тільки один сигнал. Сигнал означає, що відбулася подія, але ядро ​ ​ не повідомляє скільки таких подій відбулося.

Приклади сигналів:

- закінчення породженого процесу (наприклад, через системний виклик exit);

- виникнення виняткової ситуації;

- сигнали, що надходять від користувача при натисканні певних клавіш.

Встановити реакцію на надходження сигналу можна з допомогою системного виклику signal:

func = signal (snum, function);

snum – номер сигналу, а function – адреса функції, яка повинна бути виконана при надходженні зазначеного сигналу. Значення, що повертається – адреса функції, яка буде реагувати на надходження сигналу. Замість function можна вказати нуль або одиницю. Якщо було вказано нуль, то при надходженні сигналу snum виконання процесу буде перервано аналогічно викликом exit. Якщо вказати одиницю, даний сигнал буде проігнорований, але це можливо не для всіх процесів.

За допомогою системного виклику kill можна згенерувати сигнали і передати їх іншим процесам.

kill (pid, snum);

де pid – ідентифікатор процесу, а snum – номер сигналу, який буде переданий процесу. Зазвичай kill використовується для того, щоб примусово завершити (" вбити") процес.

Pid складається з ідентифікатора групи процесів і ідентифікатора процесу в групі. Якщо замість pid вказати нуль, то сигнал snum буде надіслано всім процесам, які належать до цієї групи (поняття групи процесів аналогічно групі користувачів). В одну групу включаються процеси, що мають загального предка, ідентифікатор групи процесу можна змінити за допомогою системного виклику setpgrp. Якщо замість pid вказати -1, ядро ​ ​ передасть сигнал всім процесам, ідентифікатор користувача яких дорівнює ідентифікатору поточного виконання процесу, який посилає сигнал.

В табл.3.1. приведені номери сигналів, що використовуються в Linux.

Таблиця 3.1. Номери сигналів

Номер Назва Опис
  SIGHUP Звільнення лінії (hangup).
  SIGINT Переривання (interrupt).
  SIGQUIT Вихід (quit).
  SIGILL Некоректна команда (illegal instruction). Чи не встановлювати заново при перехопленні.
  SIGTRAP Переривання трасування (trace trap). Не встановлюється заново при перехопленні
  SIGIOT або SIGABRT Машинна команда IOT
  SIGEMT Машинна команда EMT
  SIGFPE Виняткова ситуація при виконанні операції з числами (floating-point exception)
  SIGKILL Знищення процесу (kill). Не перехоплюється і не ігнорується
  SIGBUS Помилка шини (bus error)
  SIGSEGV Некоректне звернення до сегменту пам'яті (segmentation violation)
  SIGSYS Некоректний параметр системного виклику (bad argument to system call)
  SIGPIPE Запис в канал, з якого нікому читати (write on a pipe with no one to read it)
  SIGALRM Будильник
  SIGTERM Програмний сигнал завершення
  SIGUSR1 Визначається користувачем сигнал 1
  SIGUSR2 Визначається користувачем сигнал 2
  SIGCLD Завершення породженого процесу (death of a child)
  SIGPWR Помилка харчування
    Реєстрація вибіркового події

Сигнали (точніше їх номери) описані у файлі singnal.h

Для нормального завершення процесу використовується виклик

exit (status);

де status – це ціле число, яке повертається процесу-предку для його інформування про причини завершення процесу-нащадка.

Виклик exit може задаватися в будь-якій точці програми, але може бути і неявним, наприклад при виході з функції main (при програмуванні на C) оператор return 0 буде сприйнятий як системний виклик exit (0);

Перенаправлення вводу/виводу.

Практично всі операційні системи мають механізм перенаправлення вводу/ виводу. Linux не є виключенням з цього правила. Зазвичай програми вводять текстові дані з консолі (терміналу) і виводять дані на консоль. При введенні під консоллю розуміється клавіатура, а при виводі – дисплей терміналу. Клавіатура і дисплей – це, відповідно, стандартний ввід і вивід (stdin і stdout). Будь-яке введення/виведення можна інтерпретувати як введення з деякого файлу і виведення у файл.

Робота з файлами проводиться через їх дескриптори. Для організації вводу/виводу в UNIX використовуються три файли: stdin (дескриптор 1), stdout (2) і stderr (3).

Символ > використовується для перенаправлення стандартного виводу у файл. Приклад:

$ сat > newfile.txt

Стандартний введення команди cat буде перенаправлено в файл newfile.txt, який буде створений після виконання цієї команди. Якщо файл з такою назвою вже існує, то він буде перезаписаний. Натискання Ctrl+D зупинить пере-направлення і перериває виконання команди cat.

Символ < використовується для перепризначення стандартного вводу команди. Наприклад, при виконанні команди

cat < file.txt

як стандартне введення буде використаний файл file.txt, а не клавіатура.

Символ > > використовується для приєднання даних в кінець файлу (append) стандартного виводу команди. Наприклад, на відміну від випадку з символом >, виконання команди

cat > > newfile.txt

НЕ перезапише файл у разі його існування, а додасть дані в його кінець.

Символ | використовується для перенаправлення стандартного виводу однієї програми на стандартний ввід іншої.

Наприклад, ps-ax | grep httpd.

 

Команди для управління процесами






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.