Linux-IO模型

笔记来自Linux五大网络IO模型图解

什么是IO
我们常说的IO,指的是文件的输入和输出,但是在操作系统层面是如何定义IO的呢?到底什么样的过程可以叫做是一次IO呢?拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目的是把它读取到内存中。可以把这个步骤简化成==把数据从硬件(硬盘)中读取到用户空间中==

Linux下主要有以下五种I/O模型

  • 阻塞I/O(blocking IO)
  • 非阻塞I/O (nonblocking I/O)
  • I/O 复用 (I/O multiplexing)
  • 信号驱动I/O (signal driven I/O (SIGIO))
  • 异步I/O (asynchronous I/O)

阻塞io(同步io)
发起请求就一直等待,直到数据返回,好比你去商场试衣间,里面有人,那你就一直在门外等着【全程阻塞】

image.png

非阻塞io(同步io)
不管有没有数据都返回,没有就隔一段时间再来请求,如此循环。好比你要喝水,水还没烧开,你就==隔段时间去看一下==饮水机,直到水烧开为止。应用进程与内核交互,目的未达到之前,不再一味的等着,而是直接返回。然后通过轮询的方式,不停的去问内核数据准备有没有准备好。如果某一次轮询发现数据已经准备好了,那就把数据拷贝到用户空间中【复制数据时阻塞】

image.png

信号驱动io(同步io)
事先发出一个请求,当有数据后会返回一个标识回调,这时你可以去请求数据,好比银行排号,当叫到你的时候,你就可以去处理业务了【复制数据时阻塞】

image.png

io复用(同步io)
I/O是指网络I/O,多路指多个TCP连接(即socket或者channel),复用指复用一个或几个线程。意思说一个或一组线程处理多个连接,比如课堂上学生做完了作业就举手,老师就下去检查作业,(对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听,可以同时对多个读/写操作的IO函数进行轮询检测,直到有数据可读或可写时,才真正调用IO操作函数)【复制数据时阻塞】

image.png

异步io【window没有】
发出请求就返回,剩下的事情会异步自动完成,不需要做任何处理,好比有事秘书干,自己啥也不用管

image.png

同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO;如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO

NodeJS和Java的区别
这个问题实际问的是同步IO和异步IO的区别

他们之间最大的区别就是线程数,nodejs跟js一样是单线程的,Java是多线程的,什么意思呢,把一个服务器比作一个餐厅,线程就是里面的服务生,nodejs只有一个服务生,每有一个客人进店就跑去下菜单,菜单送到厨房,但是不会等厨房做完而是留下一个回调函数,让厨房做好了叫他,他去服务下一个客人,而java是一个客人派一个服务生专门服务,服务商会等着厨房把菜做完,这也是为什么java查数据库是异步的,但是不管服务器查多久他都不会先执行后面的同步函数的原因

文件上传,文件读取,查数据库都是IO应用,而NodeJS的这种单线程的做法就是异步IO,Java的做法是同步IO

那nodejs也太辣鸡了吧,确实,他的定位本身就是轻量级服务器语言,跟常年排在编程版的前五名的Java确实比不了,更不可能去接受几百万的并发什么的,这个服务生顶不住,但是他可以多开几个餐厅啊,因为他本身很小,占用不了多少内存,店小耐不住我全球连锁啊,233333

上面比喻当然是最通俗的比喻,真正的系统哪能这么肤浅,更高端点的理解查看【Node/EventLoop】笔记

猜你喜欢

转载自www.cnblogs.com/pengdt/p/12240736.html