Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Використання поділюваної пам’ятіСодержание книги
Поиск на нашем сайте
Процеси можуть взаємодіяти один з одним безпосередньо шляхом поділу (спільного використання) ділянок віртуального адресного простору та обміну даними через поділювану пам’ять. Процеси ведуть читання і запис даних в області поділюваної пам’яті, використовуючи для цього ті самі машинні команди, що й при роботі зі звичайною пам’яттю. Після створення області поділюваної пам’яті та приєднання її до віртуального адресного простору процесу ця область стає доступною так само, як будь-яка ділянка віртуальної пам’яті; для доступу до даних, що перебувають у ній, не потрібні звертання до якихось додаткових системних функцій. Механізм поділу пам’яті має багато спільного з механізмом функціонування файлової системи. Але на відміну від файлів ядро не має відомостей про те, які процеси можуть використати механізм поділюваної пам’яті, а, отже, воно не може автоматично очищати невикористовувані структури механізму взаємодії процесів, оскільки ядру не відомо, які із цих структур більше не потрібні. Таким чином, процеси, що завершилися внаслідок виникнення помилки, можуть залишити після себе непотрібні і не використовувані структури, що перевантажують і засмічують систему. Для того, щоб уникнути подібних ситуацій, необхідно з великою обережністю користуватися цим механізмом і обов’язково видаляти поділювану пам’ять після використання.
Семафори У наш час все більше значення надається великим обчислювальним системам, таким як багатопроцесорні обчислювальні комплекси та мережі ЕОМ. Основним засобом збільшення потужностей обчислювальних машин є підвищення в них рівня паралелізму. Очевидно, що паралельність в апаратурі відбивається й на програмному забезпеченні. У зв’язку із цим значно зростає інтерес до паралельних процесів і проблем їхньої синхронізації. На сьогоднішній день запропонована велика кількість різних систем синхронізації процесів. До них відносяться: – блокування пам’яті; – семафори; – критичні області; – умовні критичні області; – монітори; – виключаючі області тощо. Один зі способів синхронізації паралельних процесів – семафори Дейкстри, реалізовані в ОС LINUX. Синхронізація процесів Визначимо поняття процесу як завдання, виконуваного в ос. Оскільки завдання в багатовикористовуваній системі повинні виконуватися незалежно і можуть виконуватися паралельно, то і процеси, що їх представляють, повинні бути незалежними і паралельно викону-ваними. Процесам для роботи часто потрібні різні пристрої та допоміжні програми, які можна назвати відповідно апаратними і програмними ресурсами. Якщо ми хочемо ефективно використати ці ресурси, то ті й інші повинні спільно використатися декількома процесами. Такі спільно використовувані ресурси називаються поділюваними ресурсами. Якщо за умовами роботи потрібно, щоб поділювані ресурси одномоментно були доступні тільки одному процесу, то такі ресурси називаються критичними. Під незалежністю процесів розуміється, що крім (досить рідких) моментів явного зв’язку, процеси розглядаються як зовсім незалежні один від одного. Але насправді вони не є цілком незалежними, тому що вони можуть використати в процесі свого виконання ті самі ресурси. Процес упорядкування зв’язку між конкуруючими процесами називається синхронізацією. Синхронізація задається за допомогою синхронізуючих правил. Реалізація таких правил здійснюється за допомогою засобів синхронізації. Елементарні прийоми синхронізації, такі як використання загальних змінних, мають ряд недоліків, які іноді приводять до неможливості одержання правильних рішень. Тому виникла необхідність у створенні спеціальних синхронізуючих примітивів. Такі примітиви за назвою P та V -операції були запропоновані Дейкстрою в 1968 р. Ці операції можуть виконуватися тільки над спеціальними змінними, називаними семафорами або семафорними змінними. Семафори є цілими величинами та спочатку були визначені як приймаючі тільки ненегативні значення. Крім того, якщо їх використати для рішення завдань взаємного виключення, то область їх значень може бути обмежена лише 0 або 1. Однак надалі була показана важлива область застосування семафорів, що приймають будь-які цілі позитивні значення. Такі семафори одержали назву “загальних семафорів” на відміну від “двійкових семафорів”, використовуваних у завданнях взаємного виключення. P та V операції є єдиними операціями, виконуваними над семафорами. Іноді вони називаються семафорними операціями. Дамо визначення P та V- операцій у тому вигляді, у якому вони були запропоновані Дейкстрою. V -операція (V (S)) – операція з одним аргументом, що повинен бути семафором. Ця операція збільшує значення аргументу на 1. P- операція (P (S)) – операція з одним аргументом, що повинен бути семафором. Її призначення – зменшити величину аргументу на 1, якщо тільки результуюче значення не стає негативним. Завершення P -операції, тобто рішення про те, що дійсний момент є підходящим для виконання зменшення і наступне зменшення значення аргументу, повинне розглядатися як неподільна операція. Ці визначення справедливі як для загальних, так для двійкових семафорів. Реалізація семафорів Системні виклики для роботи із семафорами містяться в пакеті IPC (підключається файл описів – <sys/ipc.h>). Ці виклики забезпечують синхронізацію виконання паралельних процесів, виконуючи набір дій тільки над групою семафорів (засобами низького рівня). Linux підтримує числові семафори (як розширення двійкових семафорів). Семафори Linux носять не обов’язковий, а повідомний характер. Це означає, що зв’язок між семафором і тим ресурсом (ресурсами), доступ до якого розмежовує семафор, є чисто логічним. Якщо при звертанні до цього ресурсу процес не запросить доступ до нього через семафор, ніхто не перешкодить процесу одержати цей доступ (при наявності відповідних прав). Таким чином, процеси повинні заздалегідь домовлятися про використання семафорів. Кожен семафор у системі Linux являє собою набір значень (вектор семафорів). Пов’язані із семафорами системні функції є узагальненням операцій P та V- семафорів Дейкстри, у них допускається одночасне виконання декількох операцій (над семафорами, що належать одному вектору, так звані векторні операції). Ядро виконує операції комплексно; жоден зі сторонніх процесів не зможе переустановлювати значення семафорів, поки всі операції не будуть виконані. Якщо ядро з якихось причин не може виконати всі операції, воно не виконує ні однієї; процес припиняє свою роботу доти, поки ця можливість не буде надана. Семафор в LINUX складається з наступних елементів: – значення семафора; – ідентифікатор останнього із процесів, що працювали із семафором; – кількість процесів, що очікують збільшення значення семафора; – кількість процесів, що очікують моменту, коли значення семафора стане рівним 0. Для створення набору семафорів та одержання доступу до них використається системна функція semget, для виконання різних керуючих операцій над набором – функція semctl, для роботи зі значеннями семафорів – функція semop.
Системні виклики для роботи з поділюваною пам’яттю Системні виклики для роботи з поділюваною пам’яттю в ОС Linux описані в бібліотеці <sys/shm.h>. Функція shmget створює нову область поділюваної пам’яті або повертає адресу вже існуючої області, функція shmat логічно приєднує область до віртуального адресного простору процесу, функція shmdt від’єднує її, а функція shmctl дозволяє одержувати інформацію про стан поділюваної пам’яті та робити над нею операції. SHMGET Створення області поділюваної пам’яті або одержання номера дескриптора існуючої області: int shmget(key_t key, int size, int flag); id = shmget(key, size, flag); де id – ідентифікатор області поділюваної пам’яті, key – номер області, size – обсяг області в байтах, flag – параметри створення і права доступу. Ядро використає key для ведення пошуку в таблиці поділюваної пам’яті: якщо підходящий запис виявлений і є дозвіл на доступ, ядро повертає викликаючому процесу зазначений у записі дескриптор. Якщо запис не знайдений і користувач встановив прапор IPC_CREAT, що вказує на необхідність створення нової області, ядро перевіряє знаходження розміру області у встановлених системою межах і виділяє область. Ядро записує установки прав доступу, розмір області та покажчик на відповідний запис таблиці областей у таблицю поділюваної пам’яті і встановлює прапор, що свідчить про те, що з областю не зв’язана окрема пам’ять. Області виділяється пам’ять (таблиці сторінок і т.п.) тільки тоді, коли процес приєднує область до свого адресного простору. Ядро встановлює також прапор, що говорить про те, що по завершенні останнього пов’язаного з областю процесу область не повинна звільнятися. Таким чином, дані в поділюваній пам’яті залишаються в цілості, навіть якщо вона не належить жодному із процесів (як частина віртуального адресного простору останнього). SHMAT Приєднує область поділюваної пам’яті до віртуального адресного простору процесу: void *shmat(int id, void *addr, int flag); virtaddr = shmat(id, addr, flag); Значення id, що повертається функцією shmget, ідентифікує область поділюваної пам’яті, addr є віртуальною адресою, за якою користувач хоче підключити область, а за допомогою прапорів (flag) можна вказати, чи призначена область тільки для читання і чи потрібно ядру округляти значення зазначеної користувачем адреси. Значення, що повертається функцією virtaddr, являє собою віртуальну адресу, за якою ядро зробило підключення області і яка не завжди збігається з адресою, зазначеною користувачем. На початку виконання системної функції shmat ядро перевіряє наявність у процесу необхідних прав доступу до області. Воно досліджує зазначену користувачем адресу; якщо вона дорівнює 0, ядро вибирає віртуальну адресу на свій розсуд. Область поділюваної пам’яті не повинна перетинатися у віртуальному адресному просторі процесу з іншими областями; отже, її вибір повинен проводитись розумно й обережно. Так, наприклад, процес може збільшити розмір приналежної йому області даних за допомогою системного виклику brk, і нова область даних буде містити адреси, суміжні з колишньою областю; тому ядру не слід приєднувати область поділюваної пам’яті занадто близько до області даних процесу. Так само не слід розміщати область поділюваної пам’яті поблизу від вершини стека, щоб стек при своєму наступному збільшенні не залазив за її межі. Якщо, наприклад, стек росте в напрямку збільшення адрес, найкраще розмістити область поділюваної пам’яті безпосередньо перед початком області стека. Ядро перевіряє можливість розміщення області поділюваної пам’яті в адресному просторі процесу й приєднує її, якщо це можливо. Якщо викликаючий процес є першим процесом, що приєднує область, ядро виділяє для області всі необхідні таблиці, записує час приєднання у відповідне поле таблиці поділюваної пам’яті та повертає процесу віртуальну адресу, за якою область була фактично підключена. SHMDT Від’єднання області поділюваної пам’яті від віртуального адресного простору процесу: int shmdt(void *addr); де addr – віртуальна адреса, повернута функцією shmat. Процес використає віртуальну адресу поділюваної пам’яті, а не її ідентифікатор, оскільки цей ідентифікатор може бути вилучений із системи. Ядро робить пошук області за зазначеною адресою та від’єднує її від адресного простору процесу. Оскільки в таблицях областей відсутні зворотні покажчики на таблицю поділюваної пам’яті, ядру доводиться переглядати таблицю поділюваної пам’яті в пошуках запису, що вказує на дану область, і записувати у відповідне поле час останнього відключення області. Від’єднання області від віртуального адресного простору процесу не означає видалення області: відомості про неї залишаються в таблиці поділюваної пам’яті, дані, що містяться в ній, також зберігаються. Очищення таблиць і звільнення пам’яті можна добитись за допомогою відповідного прапора в операції shmctl. SHMCTL Одержання інформації про стан області поділюваної пам’яті та установка параметрів для неї: int shmctl(int id, int cmd, struct shmid_ds *buf); Значення id (повертається функцією shmget) ідентифікує запис таблиці поділюваної пам’яті, cmd визначає тип операції, а buf є адресою користувальницької структури, що зберігає інформацію про стан області. Типи операцій описуються списком визначень у файлі sys/ipc.h: #define IPC_RMID 10 //видалити ідентифікатор (область) #define IPC_SET 11 //установити параметри #define IPC_STAT 12 //одержати параметри За допомогою команди (прапорця) IPC_RMID можна видалити область id. Видаляючи область поділюваної пам’яті, ядро звільняє відповідний їй запис у таблиці поділюваної пам’яті та переглядає таблицю областей: якщо область не була приєднана до жодного із процесів, ядро звільняє запис таблиці і всі виділені області ресурси. Якщо ж область як і раніше підключена до якихось процесів (значення лічильника посилань на неї більше 0), ядро тільки скидає прапор, що говорить про те, що по завершенні останнього пов’язаного з нею процесу область не повинна звільнятися. Процеси, що вже використовують область поділюваної пам’яті, продовжують працювати з нею, нові ж процеси не можуть приєднати її. Коли всі процеси відключать область, ядро звільнить її.
|
||||
Последнее изменение этой страницы: 2016-04-26; просмотров: 238; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.72.220 (0.012 с.) |