
- •Файловые системы
- •Понятие процессов в ос образ процесса
- •Распределенная память или общая память
- •Именованные/Неименованные каналы
- •Программный поток. Понятие и использование
- •Сегментная и страничная организация памяти. Виртуальная память
- •Сокеты tcp и udp
- •Объекты синхронизации
- •Состояние процессов
- •Принципы завершения процессов
Сокеты tcp и udp
Сокети (англ. socket - поглиблення, гніздо, роз'єм) - назва програмного інтерфейсу для забезпечення обміну даними між процесами. Процеси при такому обміні можуть виконуватися як на одній ЕОМ, так і на різних ЕОМ, пов'язаних між собою мережею. Сокет - абстрактний об'єкт, що представляє кінцеву точку з'єднання.
Слід розрізняти клієнтські і серверні сокети. Клієнтські сокети грубо можна порівняти з кінцевими апаратами телефонної мережі, а серверні - з комутаторами. Клієнтський додаток (наприклад, браузер) використовує лише клієнтські сокети, а серверне (наприклад, веб-сервер, якому браузер посилає запити) - як клієнтські, так і серверні сокети.
Інтерфейс сокетів вперше з'явився в BSD Unix. Програмний інтерфейс сокетів описаний в стандарті POSIX.1 і в тій чи іншій мірі підтримується всіма сучасними операційними системами.
Принципи сокетів. Кожен процес може створити слухає сокет (серверний сокет) і прив'язати його до якого-небудь порту операційної системи (в UNIX непривілейованих процеси не можуть використовувати порти менше 1024). Хто слухає процес зазвичай знаходиться в циклі очікування, тобто прокидається при появі нового з'єднання. При цьому зберігається можливість перевірити наявність сполук на даний момент, встановити тайм-аут для операції і т.д.
Кожен сокет має свою адресу. ОС сімейства UNIX можуть підтримувати багато типів адрес, але обов'язковими є INET-адресу та UNIX-адресу. Якщо прив'язати сокет до UNIX-адресою, то буде створений спеціальний файл (файл сокета) по заданому шляху, через який зможуть повідомлятися будь-які локальні процеси шляхом читання / запису з нього (див. Доменний сокет Unix). Сокети типу INET доступні з мережі і вимагають виділення номера порту.
Зазвичай клієнт явно під'єднується до слухача, після чого будь читання або запис через його файловий дескриптор будуть передавати дані між ним і сервером.
TCP реалізує концепцію з'єднання.
UDP грунтується на протоколі без встановлення з'єднань, тобто протокол, не гарантує доставку інформації. UDP-пакети можуть приходити не в зазначеному порядку, дублюватися і приходити більше одного разу, або навіть не доходити до адресата зовсім. Через ці мінімальних гарантій, UDP значно поступається протоколу TCP. Відсутність установки з'єднань означає відсутність потоків або з'єднань між двома хостами, тому що замість цього дані прибувають в датаграм.
Объекты синхронизации
Синхронізація (одночасний) в інформатиці позначає одне з двох: синхронізацію процесів, або синхронізацію даних.
Синхронізація процесів - приведення двох або кількох процесів до такого їх протіканню, коли певні стадії різних процесів відбуваються в певному порядку, або одночасно.
Синхронізація необхідна у будь-яких випадках, коли паралельно протікають процесів необхідно взаємодіяти. Для її організації використовуються засоби взаємодії між процесами. Серед найбільш часто використовуваних засобів - сигнали і повідомлення, семафори і мьютекс, канали (англ. pipe), спільно використовувана пам'ять.
Синхронізація даних - ліквідація відмінностей між двома копіями даних. Передбачається, що раніше ці копії були однакові, а потім одна з них, або обидві були незалежно змінені.
Спосіб синхронізації даних залежить від зроблених додаткових припущень. Головною проблемою тут є те, що незалежно зроблені зміни можуть бути несумісні один з одним (так званий «конфлікт правок»), і навіть теоретично не існує загального способу вирішення подібних ситуацій.
Подія (event). Мабуть, найпростіший і фундаментальний синхронізуючий об'єкт. Це всього лише прапор, якому функціями SetEvent / ResetEvent можна задати стан: сигналізуючий або нейтральний. Подія - це найзручніший спосіб передати сигнал очікує потоку, що якась подія здійснилося (бо воно так і називається), і можна продовжувати роботу. За допомогою події ми легко вирішимо проблему синхронізації при ініціалізації робочого потоку.
Треба зауважити, що існують дві помітно відрізняються різновиди подій. Ми можемо вибрати одну з них за допомогою другого параметра функції CreateEvent. Якщо він TRUE, створюється подія, стан якого управляється тільки вручну, тобто функціями SetEvent / ResetEvent. Якщо ж він FALSE, буде створено подію з автоскиданням. Це означає, що як тільки якийсь потік, що очікує даної події, буде звільнений сигналом від цієї події, воно автоматично буде скинуто назад в нейтральне стан. Найбільш яскраво їх відмінність виявляється в ситуації, коли одного події очікують відразу декілька потоків. Подія з ручним управлінням подібно стартовому пістолету.
Як тільки воно буде встановлено в сигналізуючий стан, будуть звільнені відразу всі потоки. Подія ж з автоскиданням схоже на турнікет у метро: воно відпустить лише один потік і повернеться в нейтральне стан.
Семафор - об'єкт, що дозволяє увійти в заданий ділянку коду не більше ніж n потокам.
Семафор - це об'єкт, з яким можна виконати три операції:
init (n): лічильник: = n
enter (): чекати поки лічильник стане більше 0; після цього зменшити лічильник на одиницю.
leave (): збільшити лічильник на одиницю.
Ось деякі з проблем, які можуть вирішувати семафори.
заборона одночасного виконання заданих ділянок коду;
почерговий доступ до критичного ресурсу (важливого ресурсу, для якого неможливий одночасний доступ).
Проблеми семафорів.
По-перше, можна написати програму з «витоком семафора», викликавши enter () і забувши викликати leave (). Рідше зустрічаються помилки, коли двічі викликається leave ().
По-друге, семафори чреваті взаємної блокуванням потоків.
Мьютекс (англ. mutex, від mutual exclusion - «взаємне виключення») - одномісний семафор, що служить у програмуванні для синхронізації одночасно виконуються потоків.
Мьютекс - це один з варіантів семафорні механізмів для організації взаємного виключення. Вони реалізовані в багатьох ОС, їхнє основне призначення - організація взаємного виключення для потоків з одного і того ж або з різних процесів.
Мьютекс - це найпростіші виконавчі семафори, які можуть знаходитися в одному з двох станів - зазначеному або невідміченим (відкритий і закритий відповідно). Коли який-небудь потік, що належить будь-якому процесу, стає власником об'єкта mutex, останній переводиться в невідмічені стан. Якщо завдання звільняє мьютекс, його стан стає відміченим.
Завдання мьютекса - захист об'єкту від доступу до нього інших потоків, відмінних від того, який заволодів мьютекс. У кожний конкретний момент тільки один потік може володіти об'єктом, захищеним мьютекс. Якщо іншому потоку буде потрібен доступ до змінної, захищеної мьютекс, то цей потік засинає до тих пір, поки мьютекс не буде звільнений.
Мета використання мьютекс - захист даних від пошкодження, а проте їм породжуються інші проблеми - такі, як взаємне блокування (клінч) і Стан гонки.