随笔分类 -  IO模型

摘要:引言:前面一章简单介绍了关于epoll 的使用方式,这一章介绍一下一个简单的反应堆模型,没有实现超时机制的管理。最主要的是要介绍一下关于异步事件反应堆的设计方式。反应堆的模型图在上一张可以看到,但是那个是盗来的一张图,twisted 的反应堆。今天给不熟悉这个部分的朋友介绍一下基于 epoll 的反应堆,过程类似于libevent.反应堆可以提供几个操作:(0)创建一个反应堆:mc_event_base_t * mc_base_new(void) ;返回一个操作句柄. (1)为某一个需要监听的文件描述符加入回调函数,并注册事件类型。int mc_event_set( mc_event_t *. 阅读全文
posted @ 2012-04-25 16:00 _Boz 阅读(5624) 评论(0) 推荐(6) 编辑
摘要:引言:上一篇说到了线程池方式来处理服务器端的并发,并给出了一个线程池的方案(半同步,半异步方式)。各有各的好处吧,今天来讲讲关于非阻塞的异步IO。说到异步IO,其实现在很难实现真正的异步,大部分情况下仍然需要阻塞在某个多路复用函数,比如select 或者 epoll 上,得到就绪描述符,然后调用注册在相应描述符上的回调函数。这种方式是现在的反应堆设计的基本思路。我截取一段反应堆模型的图给大家看看。这个图是截取至 python的 twisted 服务器的反应堆文章介绍,但是大致和我们需要的理念一样。事件循环阻塞查看描述符是否就绪,当就绪后返回可读或可写的描述符,也有可能带外数据或者出错等情况。因 阅读全文
posted @ 2012-04-23 19:07 _Boz 阅读(15000) 评论(3) 推荐(8) 编辑
摘要:引言:上篇文章说到了多进程并发式的服务端模型,如上一篇文章所述,进程的频繁创建会导致服务器不堪负载,那这一篇博客主要讲述的是线程模型和线程池的方式来提高服务端的负载能力。同时比较一下不同的模型的好处与坏处。(如果不加以说明,我们都是考虑开发是基于GNU/Linux的)在Linux下创建一个线程的方式很简单,pthread_create() 函数来创建线程,其中的一个参数的回调函数,也就是线程本身的执行体函数。void *thread_entry( void * args );这里不过多的强调怎样利用线程等来创建执行体以及其他的系统调用怎样使用的。那么,在服务端的线程使用方式一般为三种种:(1) 阅读全文
posted @ 2012-04-22 10:08 _Boz 阅读(12587) 评论(11) 推荐(5) 编辑
摘要:引言:上篇文章讲到同步阻塞迭代式的进程方式,这篇文章讲述一下关于处理单进程阻塞于系统调用的情况。使用方式是多进程的方式,可以减少很大一部分的因为进程阻塞所带来的服务器无法响应问题。基本思想是这样,如上篇文章所述,在单进程阻塞在read() 系统调用的时候,会导致服务器无法响应其他的连接请求,那么我们可以通过在服务器fork() 出很多子进程来处理业务,而主进程负责 accept() 其他的客户连接。主体框架是这样:for(;;){ fd = accept(...); ret = fork() ; switch( ret ) { case -1 : do_err_handler()... 阅读全文
posted @ 2012-04-21 10:35 _Boz 阅读(5289) 评论(2) 推荐(2) 编辑
摘要:引言:似乎现在阻碍服务端大部分情况下都属于IO瓶颈,硬盘的转速等,而计算的瓶颈大部分云端计算采用分布式计算,如基于GFS的MapReduce模型,网格计算或者其他的一些分布式处理。所以,现在服务端的服务衡量指标基本集中在并发量,QPS,响应速度,稳定性等。其中一部分也不乏大量的计算,属于CPU密集型的,根据业务的不同应该做相应的调整。今天的话题是浅谈一下几种常用的IO模型。理解IO 模型是网络编程的重点。最简单的同步迭代IO模型:核心代码就是这样,这里我们假设前面的监听套接口已建立。即已绑定套接口,并调用了listen()函数。同步迭代IO大致如下,我们假设现在的模型是这样的,服务端监听客户端 阅读全文
posted @ 2012-04-21 09:14 _Boz 阅读(4237) 评论(0) 推荐(4) 编辑

4AI?Z:cp1z?_RJQle1]Gs;P!T)RHroW|