Сокет (програмний інтерфейс)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

[[== Статус зображення Файл:Soc.gif == Дякуємо за те, що ви завантажили на сервер Вікіпедії зображення Файл:Soc.gif. Однак на сторінці опису зображення немає супровідної інформації відносно джерела, авторства та ліцензії, або ця інформація неповна чи невірна. Якщо ви не є автором даного зображення, ви повинні якось обґрунтувати свої права завантажувати його у Вікіпедію. Також у цьому випадку необхідно вказати джерело зображення, тобто дати посилання на сайт (або інше джерело), з якого ви взяли дане зображення, а також умови використання зображень із даного сайту.

На сторінці опису зображення завжди вказуйте шаблон з ліцензією, під якою випущене дане зображення. Якщо ви є його автором, ви можете використати шаблон {{GFDL-self}} для того, щоб ліцензувати зображення під GFDL або {{PD-self}}. Щоб довідатись про те, які ще існують шаблони з ліцензіями, дивіться статтю Вікіпедія:Шаблони:Авторські права або Короткий довідник.

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

Дякуємо за розуміння.]] Сокети (англ. socket - поглиблення, гніздо, роз'єм) - назва програмного інтерфейсу для забезпечення обміну даними між процес ами . Процеси при такому обміні можуть виконуватися як на одній ЕОМ, так і на різних ЕОМ, пов'язаних між собою мережею. Сокет - абстрактний об'єкт, що представляє кінцеву точку з'єднання.

Слід розрізнятиклієнтські ісерверні сокети. Клієнтські сокети грубо можна порівняти з кінцевими апаратами телефонної мережі, а серверні - з комутаторами. Клієнтський додаток (наприклад, браузер) використовує лише клієнтські сокети, а серверне (наприклад, веб-сервер, якому браузер посилає запити) - як клієнтські, так і серверні сокети.

Інтерфейс сокетів вперше з'явився в BSD Unix. Програмний інтерфейс сокетів описаний в стандарті POSIX.1 І в тій чи іншій мірі підтримуєтьсяусімасучасними операційними системами.


Принципи сокетів

Кожен процес може створитислухаєсокет (серверний сокет) іприв'язатийого до якого-небудь порту операційної системи (в UNIX непривілейованих процеси не можуть використовувати порти менше 1024). Хто слухає процес зазвичай знаходиться в циклі очікування, тобто прокидається при появі нового з'єднання. При цьому зберігається можливість перевірити наявність сполук на даний момент, встановити тайм-аут для операції і т.д.

Кожен сокет має свою адресу. ОС сімейства UNIX можуть підтримувати багато типів адрес, але обов'язковими є INET-адресу і UNIX-адресу. Якщо прив'язати сокет до UNIX-адресою, то буде створений спеціальний файл (файл сокета) по заданому шляху, через який зможуть повідомлятися будь-які локальні процеси шляхом читання / запису з нього (див. Доменний сокет Unix ). Сокети типу INET доступні з мережі і вимагають виділення номера порту.

Зазвичай клієнт явнопід'єднуєтьсядо слухача, після чого будь-яке читання або запис через його файловий дескриптор будуть передавати дані між ним і сервером.

Unix domain socket

Unix domain socket (Доменний сокет Unix) таIPC-сокет (сокет між процесами взаємодії) - кінцева точка обміну даними, схожа з Інтернет-сокет ом, але не використовує мережевий протокол для взаємодії (обміну даними). Він використовується в операційних системах, що підтримують стандарт POSIX, для між процесами взаємодії. Коректним терміном стандарту POSIX єPOSIX Local IPC Sockets.

Доменні з'єднання Unix є по суті квантовими потоками, сильно нагадуючи мережеві з'єднання, але при цьому всі дані залишаються всередині одного комп'ютера (тобто обмін даними відбувається локально). UDS використовують файлову систему як адресний простір імен, тобто. вони представляються процесами як Інода у файловій системі. Це дозволяє двом різним процесам відкривати один і той же сокет для взаємодії між собою. Проте, поточний взаємодія (обмін даними) не використовує файлову систему, а тільки буфери пам'яті ядра.

На додаток до відсилаються даними процеси можуть відсилати файлові дескриптори через з'єднання на основі UDS (включаючи файлові дескриптори для доменних сокетів), використовуючи системні виклики sendmsg () і recvmsg (). Це означає, що доменні сокети можуть бути використані як об'єктно-можливісний комунікаційна система.

Mmap - POSIX-сумісний системний виклик Unix, що дозволяє виконати відображення файлу або влаштування на пам'ять. Є методом введення / виводу через відображення файлу на пам'ять і природним чином реалізує виділення сторінок за запитом, оскільки спочатку вміст файлу не читається з диска і не використовує фізичну пам'ять взагалі. Реальне зчитування з диска проводиться в «лінивому» режимі, тобто при здійсненні доступу до певного місця.

У Linux, Mac OS X і BSD mmap може створювати кілька типів відображень.

Анонімні відображення - відображення простору віртуальної пам'яті процесу, а не файлу в просторі файлової системи. З цієї причини анонімне відображення схоже з функцією malloc і використовується в деяких реалізаціях malloc для певних розміщень. Слід зауважити, що анонімні відображення не є частиною стандарту POSIX, хоча і реалізовані майже у всіх системах.

Файлові відображення дозволяють відобразити файл у віртуальній пам'яті. Доступ до цих ділянок пам'яті призводить до читання файлу. Якщо відображення розподілено між процесами, запис в цей простір в одному процесі вплине на інші процеси. Якщо використовується приватне (private) відображення, то зміни не будуть видні іншим процесам і не будуть записані в файл.

Процес читання або запису в пов'язаний файл не завжди призводить до очікуваного результату, оскільки сегменти файлу копіюються в оперативну пам'ять і періодично вивантажуються на диск, проте синхронізація може бути форсована за допомогою системного виклику msync.

mmap файлів може значно зменшити навантаження на пам'ять для додатків, що здійснюють доступ до одного файлу. Якщо файл відображений в пам'яті, додатки можуть розділяти ділянку пам'яті, укладає файл, замість завантаження файлу для кожної програми, що бажає здійснити доступ до нього.

До пам'яті, розподіленої за допомогою mmap, можна здійснювати доступ з дочірніх процесів.

mmap можна використовувати для реалізації між процесами взаємодії (IPC). У сучасних операційних системах mmap зазвичай краще взаємодії через розподілену пам'ять в System V.

Основна відмінність між розподіленою пам'яттю System V (shmem) і введенням-виведенням з розподілом пам'яті (mmap) полягає в тому, що розподілена пам'ять System V постійна: не будучи явно видалені, дані будуть зберігатися в пам'яті і залишатися доступними до тих пір, поки система не буде відключена. Пам'ять mmap не є постійною між запусками програми (тільки якщо відображення не зарезервовано у файлі).

D-Bus

D-Bus - система межпроцессного взаємодії, яка дозволяє додаткам в операційній системі спілкуватися один з одним.

D-Bus є частиною проекту freedesktop.org. Вона володіє високою швидкістю роботи, не залежить від робочого середовища, працює на POSIX-сумісних операційних системах, також існує версія для Windows (поки що на стадії розробки). Складається з двох частин: демона і низкоуровнего API. У графічному середовищі KDE для цього не так давно використовувався DCOP, але інші настільні середовища (наприклад, GNOME) не мали аналогічних систем.

Існувала можливість комунікації у вигляді CORBA, SOAP або XML-RPC, але CORBA використовує велику кількість ресурсів (KDE і GNOME пройшли етап його використання за час свого існування), а SOAP і XML-RPC призначені для веб-сервісів.

Раніше GNOME використовував Bonobo, заснований на CORBA, але через залежність від GObject, Bonobo не використовувався в інших робочих середовищах, а низька швидкодія CORBA позначалося на швидкості всього середовища.

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

Кожне повідомлення D-BUS, передане по шині, має свого відправника і свого одержувача, їх адреси називаються шляхами об'єктів, оскільки D-BUS припускає, що кожен додаток складається з набору об'єктів, а повідомлення пересилаються не між додатками, а між об'єктами цих самих додатків.

Кожен об'єкт може підтримувати один або більше інтерфейсів, які представлені тут у вигляді іменованих груп методів і сигналів - аналогічно інтерфейсам Glib, Qt або Java.

D-BUS також передбачає концепцію сервісів. Сервіс - унікальне місце розташування додатки на шині. При запуску програма реєструє один або кілька сервісів, якими воно буде володіти до тих пір, поки самостійно не звільнить, до цього моменту ніяке інше застосування, що претендує на той же сервіс, зайняти його не зможе. Іменуються сервіси аналогічно інтерфейсам.

Сервіси роблять доступною ще одну функцію - запуск необхідних програм у разі надходження повідомлень для них. Для цього повинна бути включена автоактівація, а в конфігурації D-BUS за цим сервісом повинно бути закріплено один додаток. Тоді D-BUS зможе його запустити при появі повідомлення.

Після закриття програми асоційовані сервіси також разрегістріруются, а D-BUS посилає сигнал про те, що сервіс закритий. Інші програми можуть отримувати такі сигнали і відповідним чином реагувати.

Після підключення до шини додаток повинен вказати, які повідомлення воно бажає отримувати, шляхом додавання масок збігів (matchers). Маски є наборами правил для повідомлень, які будуть доставлятися додатком, фільтрація може грунтуватися на інтерфейсах, шляхи об'єктів і методах. Таким чином, додатки будуть отримувати лише те, що їм необхідно, проблеми доставки в цьому випадку бере на себе D-BUS.

Повідомлення в D-BUS бувають чотирьох видів: виклики методів, результати викликів методів, сигнали і помилки. Перші призначені для виконання методів над об'єктами, підключеними до D-BUS; посилаючи таке повідомлення, ви видаєте завдання об'єкту, а він після обробки зобов'язаний повернути вам або результат виклику, яку помилку через повідомлення відповідних типів. Сигнальні ж повідомлення, як їм і належить, нітрохи не піклуються про те, що і як робиться об'єктами, вони вільні сприймати їх як завгодно (так само як і не отримувати їх зовсім).

Щоб повідомлення досягло певного об'єкта, необхідний спосіб послатися на об'єкт. У багатьох мовах програмування це реалізується за допомогою покажчика. Однак, ці покажчики реалізуються як адреси пам'яті, пов'язані з локального адресного простору програми, і не можуть бути передані від одного додатка іншому.

Тому в D-Bus у кожного об'єкта своє, унікальне ім'я, яке виглядає як шлях у файловій системі. Наприклад, об'єкт може бути іменований як/ org/kde/kspread/sheets/3/cells/4/5. Кращі імена, які несуть якусь смислове навантаження, тим не менш, розробники можуть вибрати і ім'я/ com/mycompany/c5yo817y0c1y1c5b, якщо це має сенс для їх застосування.

Імена об'єктів знаходяться в просторі імен, щоб забезпечити розмежування різних програмних модулів. Просторів імен зазвичай дається префікс, специфічний для розробника, наприклад/ org / kde.

Див також

Шаблон:Compu-net-stub