Резюме: Разбиране на BIO и NIO
Наскоро вероятно разгледах изходния код на ZooKeeper и Mina и открих, че и двата са реализирани в Java NIO, така че е необходимо да се разбере какво е NIO. Следва моето резюме, базирано на онлайн информация. За да спестя време, нарисувах диаграмата небрежно, стига да успея да постигна смисъла.
Въвеждането:
BIO: Синхронно блокиращ IO, режимът на реализация на сървъра е да се свързва по една нишка наведнъж, тоест, когато клиентът има заявка за връзка, сървърът трябва да стартира нишка за обработка; ако тази връзка не направи нищо, това ще причини ненужна допълнителна натоварване на нишките, разбира се, може да се подобри чрез механизма за пул на нишки.
NIO: Синхронен неблокиращ вход, режимът на сървърна реализация е една заявка на нишка, тоест заявката за връзка, изпратена от клиента, ще бъде регистрирана в мултиплексора, а мултиплексорът ще стартира нишка за обработка, когато връзката има I/O заявка.
AIO (NIO.2): Асинхронен неблокиращ вход, режимът на сървърна имплементация е да се заяви ефективно една нишка, а I/O заявките на клиента първо се изпълняват от операционната система и след това уведомява сървърното приложение да стартира нишката за обработка.
БИОГРАФИЯ
Синхронно блокиране на входа, вярвам, че всеки, който е научил програмиране на операционна система или друг език, е запознат – в цикъла while сървърът извиква метода за приемане, за да изчака заявката за връзка от приемащия клиент; след като заявката за връзка бъде получена, комуникационен сокет може да се създаде на този комуникационен сокет за операции по четене и запис, в този момент вече не може да приема други заявки за клиентска връзка, може само да изчака изпълнението на операцията с текущо свързания клиент.
Ако BIO иска да може да обработва няколко клиентски заявки едновременно, трябва да използва многонишковост, т.е. всеки път, когато приемните блокове чакат клиентска заявка, след като заявката за връзка бъде получена, се създава комуникационен сокет и се отваря нова нишка за обработка на заявката за четене и запис на данни на този сокет, и след това веднага продължава да приема и чака други заявки за връзка с клиента, тоест се създава нишка за всяка клиентска заявка да се обработва поотделно, схемата вероятно е следната:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg
Въпреки че сървърът има висока паралелност в момента, тоест може да обработва няколко клиентски заявки едновременно, това създава проблем, тъй като с увеличаване на броя на отворените нишки се използва твърде много памет, което води до забавяне или дори срив на сървъра, а NIO може да реши този проблем до известна степен.
NIO
Ключът към синхронния неблокиращ вход е да се възприеме идея, управлявана от събития, за реализиране на мултиплексор.
Най-голямата разлика между NIO и BIO е, че трябва само да отвориш нишка, за да обработваш IO събития от няколко клиента.
Това е мултиплексор, който може да слуша IO събития от множество клиенти:
А. Ако сървърът слуша заявката за връзка на клиента, той ще установи комуникационен сокет за него (канал в Java) и след това ще се върне, за да продължи слушането.
Б. Ако сървърът слуша данните, изпратени от клиента, който е създал комуникационен сокет, той ще извика съответния интерфейс за обработка на получените данни, а ако има няколко клиента едновременно, данните също могат да бъдат обработени последователно.
В. Слушайте заявките за връзка от множество клиенти и получавайте заявки за данни, както и когато имате данни за изпращане.
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 методът е подходящ за ситуации, при които броят на връзките е относително малък и фиксиран, което изисква големи сървърни ресурси и е ограничено до приложения.
|