Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 12132|Відповідь: 1

[Зв'язок] Розуміння BIO та NIO

[Копіювати посилання]
Опубліковано 17.05.2019 15:34:50 | | |

Анотація: Розуміння BIO та NIO
Нещодавно я, мабуть, переглянув вихідний код ZooKeeper і Mina і виявив, що обидва реалізовані на Java NIO, тому потрібно з'ясувати, що таке NIO. Нижче наведено мій власний підсумок, заснований на інформації з інтернету: щоб заощадити час, я намалював діаграму невимушено, якщо зміг донести сенс.

Введення:
БІО: Синхронний блокуючий вихід, режим реалізації сервера полягає в підключенні одного потоку за раз, тобто коли клієнт має запит на підключення, сервер повинен запустити потік для обробки, якщо це з'єднання нічого не дає, це спричиняє зайве навантаження на потоки, звісно, це можна покращити через механізм пулу потоків.
NIO: Синхронний неблокуючий вихід, режим реалізації сервера — це один запит на потік, тобто запит на з'єднання, надіскан клієнтом, реєструється на мультиплексорі, і мультиплексор запускає потік для обробки, коли з'єднання має запит на введення/вивод.
AIO (NIO.2): Асинхронний неблокуючий вихід, режим реалізації сервера полягає у фактичному запиті одного потоку, а запити клієнта спочатку виконується ОС, а потім повідомляє серверний додаток про запуск потоку для обробки.

БІОГРАФІЯ
Синхронне блокування IO, я вважаю, що всі, хто вивчав програмування операційної системи або будь-яку мову мережевого програмування, знайомі: у циклі while сервер викликає метод accept, щоб чекати запиту на з'єднання приймаючого клієнта; після отримання запиту на з'єднання на цьому сокеті можна встановити комунікаційний сокет для операцій читання та запису; наразі він більше не може приймати інші запити на підключення клієнта, може лише чекати виконання операції з поточним підключеним клієнтом.
Якщо BIO хоче одночасно обробляти кілька клієнтських запитів, він повинен використовувати багатопоточність, тобто кожного разу, коли блоки приймають чекають запиту клієнта, після отримання запиту на з'єднання встановлюється комунікаційний сокет і відкривається новий потік для обробки запиту на читання та запис даних цього сокета, а потім одразу продовжується приймати і чекати на інші запити на підключення клієнта, тобто створюється потік для кожного запиту на підключення клієнта окремо, схема, ймовірно, виглядає так:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg

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

NIO
Ключ до синхронного неблокуючого введення — прийняття ідеї, орієнтованої на події, для реалізації мультиплексора.
Найбільша різниця між NIO та BIO в тому, що потрібно відкрити потік лише для обробки подій IO від кількох клієнтів.
Це мультиплексор, який може прослуховувати події виводу від кількох клієнтів:
A. Якщо сервер слухає запит на підключення клієнта, він встановлює для нього комунікаційний сокет (канал у Java), а потім повертається для продовження прослуховування.
B. Якщо сервер слухає дані, надіслані клієнтом, який створив комунікаційний сокет, він викликає відповідний інтерфейс для обробки отриманих даних, і якщо одночасно є кілька клієнтів, дані також можуть бути оброблені по черзі.
C. Слухайте запити на підключення від кількох клієнтів і отримуйте запити на дані, а також слухайте, коли у вас є дані для надсилання.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg


Коротко кажучи, в одному потоці можна викликати мультиплексуючий інтерфейс (select у java), щоб блокувати та слухати запити на введення від кількох клієнтів одночасно, і після отримання IO запиту відповідна функція буде викликана для його обробки.

Відповідні сценарії застосування
На цьому етапі ви, можливо, помітили, що як тільки запит надходить (чи то кілька одночасно, чи лише один), буде викликана відповідна функція обробки IO для його обробки, отже:
(1) NIO підходить для обробки сценаріїв із великою кількістю з'єднань, але ці з'єднання відносно короткі (легка робота), такі як Jetty, Mina, ZooKeeper тощо, які всі реалізовані на основі java nio.
(2) Метод BIO підходить для ситуацій, коли кількість з'єднань відносно мала і фіксована, що вимагає великих ресурсів сервера і обмежене застосуваннями.





Попередній:Різниця між ajax, axios та fetch
Наступний:Відкритий фреймворк для планування вакансій Quartz
Опубліковано 21.05.2019 19:32:33 |
Вчитися вчитися
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com