linux网络编程(事件驱动模式)

linux网络编程(事件驱动模式)

ID:34372827

大小:317.04 KB

页数:8页

时间:2019-03-05

linux网络编程(事件驱动模式)_第1页
linux网络编程(事件驱动模式)_第2页
linux网络编程(事件驱动模式)_第3页
linux网络编程(事件驱动模式)_第4页
linux网络编程(事件驱动模式)_第5页
资源描述:

《linux网络编程(事件驱动模式)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、前言事件驱动为广大的程序员所熟悉,其最为人津津乐道的是在图形化界面编程中的应用;事实上,在网络编程中事件驱动也被广泛使用,并大规模部署在高连接数高吞吐量的服务器程序中,如http服务器程序、ftp服务器程序等。相比于传统的网络编程方式,事件驱动能够极大的降低资源占用,增大服务接待能力,并提高网络传输效率。关于本文提及的服务器模型,搜索网络可以查阅到很多的实现代码,所以,本文将不拘泥于源代码的陈列与分析,而侧重模型的介绍和比较。使用libev事件驱动库的服务器模型将给出实现代码。本文涉及到线程/时间图例,只为表明线程在各个IO上确实存在阻塞时延,

2、但并不保证时延比例的正确性和IO执行先后的正确性;另外,本文所提及到的接口也只是笔者熟悉的Unix/Linux接口,并未推荐Windows接口,读者可以自行查阅对应的Windows接口。阻塞型的网络编程接口几乎所有的程序员第一次接触到的网络编程都是从listen()、send()、recv()等接口开始的。使用这些接口可以很方便的构建服务器/客户机的模型。我们假设希望建立一个简单的服务器程序,实现向单个客户机提供类似于“一问一答”的内容服务。图图图1.图1.1.简单的一问一答的服务器1.简单的一问一答的服务器//客户机模型/客户机模型我们注意到

3、,大部分的socket接口都是阻塞型的。所谓阻塞型接口是指系统调用(一般是IO接口)不返回调用结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回。实际上,除非特别指定,几乎所有的IO接口(包括socket接口)都是阻塞型的。这给网络编程带来了一个很大的问题,如在调用send()的同时,线程将被阻塞,在此期间,线程将无法执行任何运算或响应任何的网络请求。这给多客户机、多业务逻辑的网络编程带来了挑战。这时,很多程序员可能会选择多线程的方式来解决这个问题。多线程的服务器程序应对多客户机的网络应用,最简单的解决方式是在服务器端使用多

4、线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。具体使用多进程还是多线程,并没有一个特定的模式。传统意义上,进程的开销要远远大于线程,所以,如果需要同时为较多的客户机提供服务,则不推荐使用多进程;如果单个服务执行体需要消耗较多的CPU资源,譬如需要进行大规模或长时间的数据运算或文件访问,则进程较为安全。通常,使用pthread_create()创建新线程,fork()创建新进程。我们假设对上述的服务器/客户机模型,提出更高的要求,即让服务器同时为多个客户机提供一问一答

5、的服务。于是有了如下的模型。图图图2.图2.2.多线程的服务器模型2.多线程的服务器模型在上述的线程/时间图例中,主线程持续等待客户端的连接请求,如果有连接,则创建新线程,并在新线程中提供为前例同样的问答服务。很多初学者可能不明白为何一个socket可以accept多次。实际上,socket的设计者可能特意为多客户机的情况留下了伏笔,让accept()能够返回一个新的socket。下面是accept接口的原型:intaccept(ints,structsockaddr*addr,socklen_t*addrlen);输入参数s是从socket(

6、),bind()和listen()中沿用下来的socket句柄值。执行完bind()和listen()后,操作系统已经开始在指定的端口处监听所有的连接请求,如果有请求,则将该连接请求加入请求队列。调用accept()接口正是从sockets的请求队列抽取第一个连接信息,创建一个与s同类的新的socket返回句柄。新的socket句柄即是后续read()和recv()的输入参数。如果请求队列当前没有请求,则accept()将进入阻塞状态直到有请求进入队列。上述多线程的服务器模型似乎完美的解决了为多个客户机提供问答服务的要求,但其实并不尽然。如果要

7、同时响应成百上千路的连接请求,则无论多线程还是多进程都会严重占据系统资源,降低系统对外界响应效率,而线程与进程本身也更容易进入假死状态。很多程序员可能会考虑使用“线程池线程池”或“连接池连接池”。“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲的线程重新承担新的执行任务。“连接池”维持连接的缓存池,尽量重用已有的连接、减少创建和关闭连接的频率。这两种技术都可以很好的降低系统开销,都被广泛应用很多大型系统,如websphere、tomcat和各种数据库等。但是,“线程池”和“连接池”技术也只是在一定程度上缓解了频繁调用I

8、O接口带来的资源占用。而且,所谓“池”始终有其上限,当请求大大超过上限时,“池”构成的系统对外界的响应并不比没有池的时候效果好多少。所以使用“池”必须

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。