「网络IO套路」当时就靠它追到女友
今天分享的基本上一面试就会被问的网络IO,文中涉及的代码部分不太重要,重要的是对这概念的理解。在看文章之前大家也可通过下面的思维导图看看自己是否能回答出来。 大纲 1 阻塞与非阻塞--开胃菜 阻塞 我们知道在调用某个函数的时候无非就是两种情况,要么 马上返回 ,然后根据返回值进行接下来的业务处理。当在使用 阻塞IO 的时候,应用程序会被无情的 挂起 ,等待内核完成操作,因为此时的内核可能将CPU时间切换到了其他需要的进程中,在我们的应用程序看来感觉被卡主(阻塞)了。 阻塞IO 传统阻塞IO模型 传统阻塞IO模型 特点: 通过阻塞式IO获取输入的数据 其中每个连接都采用独立的线程完成数据输入,业务处理以及数据返回的操作 这种方案有什么问题? 首先当并发较大的时候,需要创建大量的线程来处理连接,需要占用大量的系统资源。 连接建立完成以后,如果当前线程没有数据可读,将会阻塞在read操作上造成线程资源的浪费 鉴于上面的两个问题,通常是解决方案是啥呢? 第一种是 采用IO复用的模型 ,所谓IO复用模型即多个连接共享一个阻塞对象,应用程序只会在一个阻塞对象上等待。当某个连接有新的数据处理,操作系统直接 通知 应用程序,线程从阻塞状态返回并开始业务处理 第二种方案即采用 线程池复用的方式 。将连接完成后的业务处理任务分配给线程,一个线程处理多个连接的业务