
- •Державний заклад
- •Збірник лабораторних робіт
- •Пояснювальна записка
- •Інструкція з техніки безпеки та правил поведінки в комп'ютерному класі
- •Комплекс вправ для очей
- •Комплекс вправ для поліпшення мозкового кровообігу
- •Перелік лабораторних та практичних робіт включених у збірник
- •Лабораторна робота №1
- •Лабораторна робота №2
- •Лабораторна робота №3
- •Лабораторна робота №4
- •Лабораторна робота №5
- •Лабораторна робота №6
- •Лабораторна робота №7
- •Лабораторна робота №8
- •Лабораторна робота №9
- •Перелік літератури
Лабораторна робота №3
Тема: ”Збір відомостей про систему та управління процесами ”
Мета роботи:
1. Отримання практичних навиків роботи з операційною системою Linux CentOS – ознайомлення з роботою в терміналі, вивчення основних дій при управлінні процесами.
2. Ознайомлення з системою команд для збору відомостей та управління процесами, отримання практичних навиків їх використання.
Матеріальне забезпечення занять
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. Номери сигналів
Номер |
Назва |
Опис |
01 |
SIGHUP |
Звільнення лінії (hangup). |
02 |
SIGINT |
Переривання (interrupt). |
03 |
SIGQUIT |
Вихід (quit). |
04 |
SIGILL |
Некоректна команда (illegal instruction). Чи не встановлювати заново при перехопленні. |
05 |
SIGTRAP |
Переривання трасування (trace trap). Не встановлюється заново при перехопленні |
06 |
SIGIOT або SIGABRT |
Машинна команда IOT |
07 |
SIGEMT |
Машинна команда EMT |
08 |
SIGFPE |
Виняткова ситуація при виконанні операції з числами (floating-point exception) |
09 |
SIGKILL |
Знищення процесу (kill). Не перехоплюється і не ігнорується |
10 |
SIGBUS |
Помилка шини (bus error) |
11 |
SIGSEGV |
Некоректне звернення до сегменту пам'яті (segmentation violation) |
12 |
SIGSYS |
Некоректний параметр системного виклику (bad argument to system call) |
13 |
SIGPIPE |
Запис в канал, з якого нікому читати (write on a pipe with no one to read it) |
14 |
SIGALRM |
Будильник |
15 |
SIGTERM |
Програмний сигнал завершення |
16 |
SIGUSR1 |
Визначається користувачем сигнал 1 |
17 |
SIGUSR2 |
Визначається користувачем сигнал 2 |
18 |
SIGCLD |
Завершення породженого процесу (death of a child) |
19 |
SIGPWR |
Помилка харчування |
22 |
|
Реєстрація вибіркового події |
Сигнали (точніше їх номери) описані у файлі 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.
Команди для управління процесами
Команда ps
Призначена для виведення інформації про виконувані процеси. Дана команда має багато параметрів, про які ви можете прочитати в керівництві (man ps). Розглянемо найбільш часто використовувані, табл.3.2.:
Таблиця 3.2. Основні параметри команди ps
Параметр |
Опис |
-a |
відобразити всі процеси, пов'язані з терміналом (відображаються процеси всіх користувачів) |
-e |
відобразити всі процеси |
-t список терміналів |
відобразити процеси, пов'язані з терміналами |
-u ідентифікатори користувачів |
відобразити процеси, пов'язані з даними ідентифікаторами |
-g ідентифікатори груп |
відобразити процеси, пов'язані з даними ідентифікаторами груп |
-x |
відобразити всі процеси, не пов'язані з терміналом |
Наприклад, після введення команди ps-a буде отримано наступне:
PID TTY TIME CMD
1007 tty1 00:00:00 bash
1036 tty2 00:00:00 bash
1424 tty1 00:00:02 mc
1447 pts / 0 00:00:02 mpg123
2309 tty2 00:00:00 ps
Для виведення інформації про конкретний процес користуються командою:
# Ps-ax | grep httpd
698? S 0:01 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1261? S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1262? S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1263? S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1264? S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1268? S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1269? S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1270? S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1271? S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1272? S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1273? S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
1280 × S 0:00 httpd-DHAVE_PHP4-DHAVE_PROXY-DHAVE_ACCESS-DHAVE_A
У наведеному вище прикладі використовується перенаправлення вводу/ виводу між програмами ps і grep, і як результат отримуємо інформацію про всі процеси, що містяться у рядку запуску "httpd".
Проте на практиці набагато простіше використовувати параметр -с програми ps замість перенаправлення вводу виводу і параметр -e замість -ax.
Програма top
Призначена для виведення інформації про процеси в реальному часі. Процеси сортуються по максимальному займаному процесорному часу, але можна змінити порядок сортування (див. man top). Програма також повідомляє про вільні системні ресурси.
# Top
7:49 pm up 5 min, 2 users, load average: 0.03, 0.20, 0.11
56 processes: 55 sleeping, 1 running, 0 zombie, 0 stopped
CPU states: 7.6% user, 9.8% system, 0.0% nice, 82.5% idle
Mem: 130660K av, 94652K used, 36008K free, 0K shrd, 5220K buff
Swap: 72256K av, 0K used, 72256K free 60704K cached
PID USER PRI NI SIZE RSS SHARE STAT% CPU% MEM TIME COMMAND
1067 root 14 0892892680 R 2.8 0.6 0:00 top
1 root 0 0468468404 S 0.0 0.3 0:06 init
2 root 0 0 0 0 0 SW 0.0 0.0 0:00 kflushd
3 root 0 0 0 0 0 SW 0.0 0.0 0:00 kupdate
4 root 0 0 0 0 0 SW 0.0 0.0 0:00 kswapd
5 root -20 -20 0 0 0 SW <0.0 0.0 0:00 mdrecoveryd
Переглянути інформацію про оперативну пам'ять можна за допомогою команди free, а про дискову – df. Інформація про зареєстрованих в системі користувачів доступна по команді w.
Зміна пріоритету процесу – команда nice
nice [-коефіцієнт зниження] команда [аргумент]
Команда nice виконує вказану команду зі зниженим пріоритетом, коефіцієнт зниження вказується в діапазоні 1 .. 19 (за замовчуванням він дорівнює 10). Суперкористувач може підвищувати пріоритет команди, для цього потрібно вказати негативний коефіцієнт, наприклад - 10. Якщо вказати коефіцієнт більше 19, то він буде розглядатися як 19.
nohup – ігнорування сигналів переривання
nohup команда [аргумент]
nohup виконує запуск команди в режимі ігнорування сигналів. Не ігноруються тільки сигнали SIGHUP і SIGQUIT.
kill – примусове завершення процесу
kill [-номер сигналу] PID
де PID – ідентифікатор процесу, який можна дізнатися за допомогою команди ps.
Команди виконання процесів у фоновому режимі - jobs, fg, bg
Команда jobs виводить список процесів, які виконуються у фоновому режимі, fg – переводить процес в нормальний режим ("на передній план" – foreground), а bg – у фоновий.
Запустити програму у фоновому режимі можна за допомогою конструкції
<команда> &
Завдання для попередньої підготовки.
1. Вивчити відповідний теоретичний матеріал.
2. Опрацювати контрольні запитання.
3. Підготовити звіт.
Хід роботи.
1. Увімкніть комп'ютер з інстальованою ОС Linux CentOS.
2. Виберіть ім'я користувача та пароль для входу в систему.
3. Запустіть термінал та виконайте наступні дії:
- визначити ім'я поточної UNIX-системи за допомогою команди uname -a;
- вивести вміст директорії proc за допомогою команди ls /proc;
- вивести поточні сеанси користувачів за допомогою команди who;
- вивести інформацію про всі процеси, що виконуються, за допомогою команди ps aux;
- залишити у виводі попередньої команди тільки системні процеси за допомогою команди ps aux | grep -v user;
- вивести ієрархію процесів за допомогою команди pstree;
- розглянути поведінку процесів інтерактивно за допомогою команди top.
4. Проаналізуйте результати, отримані з п.3., та охарактеризуйте дану операційну систему та її стан.
5.Запустіть термінал та виконайте наступні дії, що дозволять познайомитись з виконанням задач в фоновому режимі (потрібно мати права суперкористувача):
- запустити тривалу команду, наприклад find / > files.txt;
- призупинити виконання попередньої команди за допомогою натискання комбінації клавіш Ctrl + Z;
user@desktop ~ $ find / > files.txt
[1]+ Stopped find / > files.txt
user@desktop ~ $
- подивитися поточний список запущених завдань командної оболонки за допомогою команди jobs;
user@desktop ~ $ jobs
[1]+ Stopped find / > files.txt
- відновити виконання завдання можна командою fg 1, аргументом якої є номер завдання;
user@desktop ~ $ fg 1
find / > files.txt
- ще раз призупинити процес;
- запустити завдання у фоновому режимі за допомогою команди bg 1;
user@desktop ~ $ fg 1
[1]+ find / > files.txt &
user@desktop ~ $
Обробка результатів
1. За результатами роботи оформити звіт.
2. Привести короткий опис виконаних дій.
3. Проаналізувати отримані результати.
Звіт повинен містити:
Назва і мета лабораторної роботи.
Прилади та обладнання.
Завдання та результати роботи.
Відповіді на контрольні запитання.
Висновки
Контрольні запитання
Як серед будь-яких трьох процесів визначити, який з них використовує найбільший обсяг пам'яті? Який відсоток пам’яті він споживає від загального обсягу?
Як отримати ієрархію батьківських процесів для поточної командної оболонки?
В якому файлі в директорії /proc зберігається інформація про системну пам'ять?.