Реферат Курсовая Конспект
Синопсис - раздел Образование, Лекція 4 5 Створення процесу # Include < Sys/resource.h > Int Setrlimit (Int Resource, Cons...
|
# include < sys/resource.h >
int setrlimit (int resource, const struct rlimit *rlp);
int getrlimit (int resource, struct rlimit *rlp);
int getrusage (int who, struct rusage *r_usage);
Функція setrlimit () використовується для встановлення обмежень на використання заданих ресурсів. Дана функція дозволяє встановити як жорстку так і м’яку межі. Параметр resource подає тип ресурсу. Значення типів ресурсів (та їх опис) подано в табл. 4. Жорсткі та м’які межі заданого ресурсу подаються параметром rlp, який вказує на структуру rlimit, яка містить два об’єкти типу rlim_t.
іекгсе rlimit
{
rlim_t rlim_cur;
rlim_t rlim_max;
};
Тип rlim_t – це цілий тип без знаку. Елемент rlim_cur містить значення біжучої, або м’якої межі, а елемент rlim_max – значення максимуму, або жорсткої межі. Елементам rlim_cur і rlim_max можемо надати довільні значення, а також символьні константи, визначені в оголошенні < sys/resource.h >.
RLIM_INFINITY | Відсутні обмеження |
RLIM_SAVED_MAX | Непередбачувана жорстка межа, яка зберігається |
RLIM_SAVED_CUR | Непередбачувана м’яка межа, яка зберігається |
Як жорстку, так і м’яку межі можемо встановити значенню RLIM_ INFINITY, що говорить – ресурс необмежений.
Таблиця 4. | Значення параметру resource | |
Визначення ресурсу | Опис | |
RLIMIT_CORE | Максимальний розмір файлу ядра в байтах, який може бути створено процесом | |
RLIMIT_CPU | Максимальний об’єм часу ЦП в секундах, який може бути використаний процесом | |
RLIMIT_DATA | Максимальний розмір розділу даних процесу в байтах | |
RLIMIT_FSIZE | Максимальний розмір файлу в байтах, який може бути створено процесом | |
RLIMIT_NOFILE | Збільшене на одиницю максимальне значення, яке система може призначити знову створеному дескриптору файлу | |
RLIMIT_STACK | Максимальний розмір стеку процесу в байтах | |
RLIMIT_AS | Максимальний розмір доступної пам’яті процесу в байтах | |
Функція getrlimit () повертає значення м’якої та жорсткої межу заданого ресурсу в об’єкт rlp. Обидві функції повертають значення 0 при успішному завершенні і число -1 в іншому випадку. Приклад встановлення м’якої межі для розміру файлів в байтах подано в лістінгу 3.
// Лістінг 3. Використання функції setrlimit () для встановлення м’якої межі
// для розміру файлу
# include < sys/resource.h >
// . . .
struct rlimit R_limit;
struct rlimit R_limit_values;
// . . .
R_limit.rlim_cur = 2000;
R_limit.rlim_max = RLIM_SAVED_MAX;
setrlimit (RLIMIT_FSIZE, &R_limit);
getrlimit (RLIMIT_FSIZE, &R_limit_values);
cout << “мяка межа для розміру файлів:”
<< R_limit_values.rlim_cur
<< endl;
// . . .
В лістінгу 3 м’яка межа для розміру встановлюється рівною 2000 байт, а жорстка межа – максимально можливому значенню. Функції setrlimit () передаються значення RLIMIT_FSIZE і R_limit, а функції getrlimit () – значення RLIMIT_FSIZE і R_limit_values. Після їх виконання на екран виводиться встановлене значення м’якої межі.
Функція getrusage () повертає інформацію про використання ресурсів процесом, що викликає. Вона також повертає інформацію про дочірній процес, завершення якого очікує процес, який викликає. Параметр who може мати наступні значення:
RUSAGE_SELF
RUSAGE_CHILDREN
Якщо параметру who передано значення RUSAGE_SELF, то інформація, яка повертається, біде належати (відноситися) до процесу, що викликає. Якщо ж параметр who містить значення RUSAGE_CHILDREN, то інформація, яка повертається буде належати (відноситися) до нащадка процесу, який викликає. Якщо, процес який викликає, не очікує завершення свого нащадка, інформація, пов’язана з ним, відкидається (не враховується). Інформація, яка повертається передається через параметр r_usage, який вказує на структуру rusage. Дана структура містить елементи, подані в таблиці 5. При вдалому виконанні функція повертає число 0, в іншому випадку – число -1.
Таблиця 5. Елементи структури rusage | |
Елемент структури | Опис |
struct timevai ru_utime | Час, затрачений користувачем |
struct timevai ru_sutime | Час, використаний системою |
long ru_maxrss | Максимальний розмір, встановлений для резидентної програми |
long ru_maxixrss | Розмір пам’яті, яка поділяється |
long ru_maxidrss | Розмір області даних, що не поділяються |
long ru_maxisrss | Розмір області стеків, що не поділяється |
long ru_minflt | Кількість запитів на сторінці |
long ru_majflt | Кількість помилок через відсутність сторінок |
long ru_nswap | Кількість (перекачек) сторінок |
long ru_inblock | Блочні операції по вводу даних |
long ru_oublock | блочні операції по виводу даних |
long ru_msgsnd | Кількість відправлених повідомлень |
long ru_msgrcv | Кількість отриманих повідомлень |
long ru_nsignals | Кількість отриманих сигналів |
long ru_nvcsw | Кількість передбачених перемикань контексту |
long ru_nivcsw | Кількість вимушених перемикань контексту |
5.3.Асинхронні і синхронні процеси
Асинхронні процеси виконуються незалежно один від одного. Це означає, що процес А буде виконуватися до завершення незалежно до процесу В. Між асинхронними процесами можуть бути прямі родинні (²батько-донька²) відносини, а можуть і не бути. Якщо процес А створює процес В, вини обидва можуть виконуватися незалежно, але в деякий момент батько повинен отримати статус завершення дочірнього процесу. Якщо між процесами немає прямих родинних відносин, у них може бути загальний предок.
Асинхронні процеси можуть виконуватися послідовно, паралельно або з перекриттям. Ці сценарії подано на рис. 4. В ситуації 1 до кінця виконується процес А, потім процес В і тільки потім виконується до кінця процес С. Це і є послідовне виконання процесів. В ситуації 2 процеси виконуються одночасно. Процеси А і В – активні процеси. Під час виконання процесу А процес В знаходиться в стані очікування. На протязі деякого інтервалу часу обидва процеси перебувають в режимі очікування. Потім процес В ²просинається², причому раніше процесу А, а через деякий час ²просинається² і процес А, і тепер обидва процеси виконуються одночасно. Дана ситуація показує, що обидва процеси можуть виконуватися одночасно на певному інтервалі часу. В ситуації 3 вико
нання процесів А і В перекриваються.
Асинхронні процеси можуть спільно використовувати наступні ресурси: файли і пам'ять. Це може вимагати (або не вимагати) синхронізації або взаємодії при розподілі ресурсів. Якщо процеси виконуються послідовно (ситуація 1), то вони не потребують ніякої синхронізації. Наприклад, всі три процеси А, В і С можуть поділяти деяку глобальну змінну. Процес А (перед тим як завершиться) записує значення в цю змінну, потім процес В під час свого виконання зчитує дані, що зберігаються в змінній і (перед тим як завершитися) записує до неї ²своє² значення. Потім під час свого виконання процес С зчитує дані з цієї змінної. Але в ситуації 2 і 3 процеси можуть спробувати одночасно модифікувати цю змінну, тому тут необхідна синхронізація доступу до змінної.
Ми визначаємо синхронні процеси як процеси, що виконуються почергово, коли один процес призупиняє своє виконання до тих пір, доки не завершиться другий. Наприклад, процес А, батьківський, при виконанні створює процес В, дочірній. Процес А призупиняє своє виконання до тих пір, доки не завершиться процес В. Після завершення процесу В його вихідний код розміщується в таблицю процесів. Тим самим процес А отримує повідомлення про завершення процесу В. Процес А може продовжити виконання, а потім завершиться або завершиться відразу. В цьому випадку виконання процесів А і В є синхронізованим. Сценарій синхронного виконання процесів А і В (для порівняння) також показано на рис. 4.
5.4. Створення синхронних та асинхронних процесів за допомогою функцій fork (), exec (), system () та posix_spawn ()
Функції fork (), fork-exec і posix_spawn () дозволяють реалізувати асинхронні процеси. При використанні функції fork () дублюється образ батьківського процесу. Після створення дочірнього процесу ця функція повертає батьку (через параметр) ідентифікатор (PID) процесу-нащадка і (звичайним шляхом) число 0, що означає – створення процесу пройшло успішно. При цьому батьківський процес не призупиняється; обидва процеси продовжують виконуватися незалежно від інструкції, яка знаходиться безпосередньо за викликом функції fork (). При створенні дочірнього процесу засобами fork-exec комбінації його образ ініціюється за допомогою образу нового процесу. Якщо функція exec () виконалася успішно (тобто успішно пройшла ініціалізація), то вона не повертає батьківському процесу ніякого значення. Функції posix_spawn () створюють образ дочірніх процесів та ініціюють їх. Окрім ідентифікатора (PID), що повертається через параметр функції posix_spawn () батьківському процесу, звичайним шляхом повертається значення, яке є індикатором успішного продовження процесу. Після виконання функції posix_spawn () обидва процеси виконуються одночасно. Функція system () дозволяє створювати синхронні процеси. При цьому створюється оболонка, яка виконує системну команду або запускає файл, що виконується. В цьому випадку батьківський процес призупиняється до тих пір, доки не завершиться дочірній процес і функція system () не поверне значення.
5.4. Функція wait ()
Асинхронний процес, викликавши функцію wait (), може призупинити виконання до тих пір, доки не завершиться дочірній процес. Після завершення дочірнього процесу батьківський процес, який очікує, зчитує статус завершення свого нащадка, щоб не допустити створення процесу-²зомбі². Функція wait () отримує статус завершення з таблиці процесів. Параметр status вказує на область, яка містить статус завершення дочірнього процесу. Якщо батьківський процес має не один, а декілька дочірніх процесів і деякі з них вже завершилися, функція wait () зчитує з таблиці процесів статус завершення тільки для одного дочірнього процесу. Якщо інформація про статус виявиться доступною ще до виконання функції wait (), ця функція завершиться миттєво. Якщо батьківський процес не має ні одного потомка, ця функція повертає код помилки. Функцію wait () можемо використати також в тому випадку, коли процес, що викликає повинен очікувати до тиж пір, доки не отримає сигнал, щоб потім виконати певні дії по його обробці.
– Конец работы –
Эта тема принадлежит разделу:
Синопсис... pstree a c h frac Hpid l n p u G frac U... pid frac user...
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Синопсис
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов