本文在别人的文章基础上(http://foxhack.blog.51cto.com/96963/25908 ),自己稍加改动,希望对初学者有所帮助。
老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系。他们的信会被邮递员投递到他们的信箱里。
这和Socket模型非常类似。下面我就以老陈接收信件为例讲解Socket I/O模型~~~
一:select模型
老陈非常想看到女儿的信。以至于他每隔10分钟就下楼检查信箱,看是否有女儿的信~~~~~
在这种情况下,"下楼检查信箱"然后回到楼上耽误了老陈太多的时间,以至于老陈无法做其他工作。
select模型和老陈的这种情况非常相似:周而复始地去检查......如果有数据......接收/ 发送.......
使用线程来select应该是通用的做法:
http://tangfeng.iteye.com/blog/518135
二:WSAAsyncSelect模型
后来,老陈使用了微软公司的新式信箱。这种信箱非常先进,一旦信箱里有新的信件,盖茨就会给老陈打电话:喂,大爷,你有新的信件了!从此,老陈再也不必频繁上下楼检查信箱了,牙也不疼了,你瞅准了,蓝天......不是,微软~~~~~~~~
微软提供的WSAAsyncSelect模型就是这个意思。
WSAAsyncSelect 模型是Windows下最简单易用的一种Socket I/O模型。使用这种模型时,Windows会把网络事件以消息的形势通知应用程序。
http://tangfeng.iteye.com/blog/518141
三:WSAEventSelect模型
后来,微软的信箱非常畅销,购买微软信箱的人以百万计数......以至于盖茨每天24小时给客户打电话,累得腰酸背痛,喝啥都不好使~~~~~~
微软改进了他们的信箱:在客户的家中添加一个附加装置,这个装置会监视客户的信箱,每当新的信件来临,此装置会发出"新信件到达"声,提醒老陈去收信。盖茨终于可以睡觉了。
http://tangfeng.iteye.com/blog/518142
四:Overlapped I/O 事件通知模型
后来,微软通过调查发现,老陈不喜欢上下楼收发信件,因为上下楼其实很浪费时间。于是微软再次改进他们的信箱。新式的信箱采用了更为先进的技术,只要用户告诉微软自己的家在几楼几号,新式信箱会把信件直接传送到用户的家中,然后告诉用户,你的信件已经放到你的家中了!老陈很高兴,因为他不必再亲自收发信件了!
Overlapped I/O 事件通知模型和WSAEventSelect模型在实现上非常相似,主要区别在"Overlapped",Overlapped模型是让应用程序使用重叠数据结构(WSAOVERLAPPED),一次投递一个或多个Winsock I/O请求。这些提交的请求完成后,应用程序会收到通知。什么意思呢?就是说,如果你想从socket上接收数据,只需要告诉系统,由系统为你接收数据,而你需要做的只是为系统提供一个缓冲区~~~~~
http://tangfeng.iteye.com/blog/518146
五:Overlapped I/O 完成例程模型
老陈接收到新的信件后,一般的程序是:打开信封----掏出信纸----阅读信件----回复信件......为了进一步减轻用户负担,微软又开发了一种新的技术:用户只要告诉微软对信件的操作步骤,微软信箱将按照这些步骤去处理信件,不再需要用户亲自拆信/阅读 /回复了!老陈终于过上了小资生活!
http://tangfeng.iteye.com/blog/518146
六:IOCP模型
微软信箱似乎很完美,老陈也很满意。但是在一些大公司情况却完全不同!这些大公司有数以万计的信箱,每秒钟都有数以百计的信件需要处理,以至于微软信箱经常因超负荷运转而崩溃!需要重新启动!微软不得不使出杀手锏......
微软给每个大公司派了一名名叫"Completion Port"的超级机器人,让这个机器人去处理那些信件!
"Windows NT小组注意到这些应用程序的性能没有预料的那么高。特别的,处理很多同时的客户请求意味着很多线程并发地运行在系统中。因为所有这些线程都是可运行的 [没有被挂起和等待发生什么事],Microsoft意识到NT内核花费了太多的时间来转换运行线程的上下文[Context],线程就没有得到很多 CPU时间来做它们的工作。大家可能也都感觉到并行模型的瓶颈在于它为每一个客户请求都创建了一个新线程。创建线程比起创建进程开销要小,但也远不是没有开销的。我们不妨设想一下:如果事先开好N个线程,让它们在那hold[堵塞],然后可以将所有用户的请求都投递到一个消息队列中去。然后那N个线程逐一从消息队列中去取出消息并加以处理。就可以避免针对每一个用户请求都开线程。不仅减少了线程的资源,也提高了线程的利用率。理论上很不错,你想我等泛泛之辈都能想出来的问题,Microsoft又怎会没有考虑到呢?"-----摘自nonocast的《理解I/O Completion Port》
先看一下IOCP模型的实现:
http://tangfeng.iteye.com/blog/518148
IOCP不是一个普通的对象,不需要考虑线程安全问题。它会自动调配访问它的线程:如果某个socket上有一个线程A正在访问,那么线程B的访问请求会被分配到另外一个socket。这一切都是由系统自动调配的,我们无需过问。
分享到:
相关推荐
以下是六种Socket I/O模型的详细解释: 1. **select模型**: 这是最基础的I/O模型,它允许程序监视多个文件描述符(如Socket)的状态。在select模型中,程序会定期调用`select`函数,检查是否有可读写事件发生。在...
从给定的文档片段来看,主要讨论了网络编程中的Socket与不同I/O模型的应用,特别是对Windows环境下Socket的I/O模型进行了深入探讨。下面将详细解释文档中提及的关键知识点: ### Socket与I/O模型 #### Socket简介 ...
下面我们将深入探讨Linux中其他的Socket I/O模型。 二、同步非阻塞模型 在同步非阻塞模型中,老陈不再傻傻地等待信件,而是每隔一段时间就去收发室查看有没有女儿的信。当没有信时,邮递员会告诉他没有新信(即系统...
7. **异步I/O和非阻塞模式**:介绍如何实现高效的Socket通信,避免阻塞主线程。 8. **高级Socket主题**:可能包括SOCK_STREAM与SOCK_DGRAM的区别,TCP和UDP的特点,以及SSL/TLS加密的Socket通信。 9. **实例代码**:...
- **主要内容:** 本书详细讲解了Java NIO (New I/O) API的使用方法。 - **涵盖知识点:** - NIO的基本概念 - Channel和Buffer的使用 - 文件映射缓冲区 - 散列和收集 - Socket通道编程 - 多路复用器Selector...
介绍了Java的序列化机制和I/O流的概念。 #### 15. **建立连接:网络套接字和多线程** - 讲述网络编程和并发处理的基本原理,包括TCP/IP协议、Socket编程以及Java中的线程模型。 #### 16. **数据结构:集合和泛型*...
- **socketpair()—quick full-duplex pipes**:介绍socketpair()函数,它可以快速创建全双工的管道。 #### 十三、更多IPC资源 - **Books**:列出了一些关于UNIX IPC的参考书籍。 - **Other online documentation*...
这本书通过丰富多样的图像、幽默风趣的语言以及互动性强的学习模式,使得原本枯燥的编程概念变得生动易懂,让学习者在愉快的氛围中掌握Java编程。 一、Java基础知识 1. 类与对象:书中首先介绍了面向对象编程的基础...
- **可读性**:作者采用了通俗易懂的语言风格,并融入了一些幽默元素,使得阅读体验更加轻松愉快。 - **历史视角**:在介绍某些特性时,还会穿插一些有趣的历史背景资料,让读者能够更深入地了解这些特性的由来和...
《Head First Java中文第2版》是一本专为初学者设计的Java编程教材,它以其独特的教学方式,通过丰富的图像、幽默的语言和实际案例,帮助读者深入浅出地理解Java编程概念。这本书不仅覆盖了Java语言的基础知识,还...
这本书的独特之处在于它的非传统教学方法,利用大量的图片、游戏和幽默元素,使学习过程更加有趣且有效。 在阅读这本中文版的《Head First Java》时,你将深入了解到以下关键知识点: 1. **Java基础**:了解Java的...