开销的问题:每个线程都需要一个独立的栈空间,在多线程并行运行的时候,这些栈的数据可能需要来回的拷贝,这额外消耗
了CPU。同时由于每个线程都需要占用栈空间,所以在大量线程存在的时候,内存的消耗也是巨大的。而异步回调模型则能
很好的解决这些问题,不过异步回调更像是“手工版”的并行处理,需要开发者自己去实现如何“并行”的问题。
异步回调基于非阻塞的I/O操作(网络和文件),这样我们就不用在调用读写函数的时候“卡”在那一句函数调用,而是立刻返
回“有无数据”的结果。而Linux的epoll技术,则利用底层内核的机制,让我们可以快速的“查找”到有数据可以读写的连接\文件。
由于每个操作都是非阻塞的,所以我们的程序可以只用一个进程,就处理大量并发的请求。因为只有一个进程,所以所有的数
据处理,其顺序都是固定的,不可能出现多线程中,两个函数的语句交错执行的情况,因此也不需要各种“锁”。从这个角度
看,异步非阻塞的技术,是大大简化了开发的过程。由于只有一个线程,也不需要有线程切换之类的开销,所以异步非阻塞成
为很多对吞吐量、并发有较高要求的系统首选。
int epoll_create(int size);//创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
缓冲技术
在互联网服务中,大部分的用户交互,都是需要立刻返回结果的,所以对于延迟有一定的要求。而类似网络游戏之类服务,延
迟更是要求缩短到几十毫秒以内。所以为了降低延迟,缓冲是互联网服务中最常见的技术之一。
早期的WEB系统中,如果每个HTTP请求的处理,都去数据库(MySQL)读写一次,那么数据库很快就会因为连接数占满而
停止响应。因为一般的数据库,支持的连接数都只有几百,而WEB的应用的并发请求,轻松能到几千。这也是很多设计不良
的网站人一多就卡死的最直接原因。为了尽量减少对数据库的连接和访问,人们设计了很多缓冲系统——把从数据库中查询的
结果存放到更快的设施上,如果没有相关联的修改,就直接从这里读。
最典型的WEB应用缓冲系统是Memcache。由于PHP本身的线程结构,是不带状态的。早期PHP本身甚至连操作“堆”内存的方
法都没有,所以那些持久的状态,就一定要存放到另外一个进程里。而Memcache就是一个简单可靠的存放临时状态的开源软
件。很多PHP应用现在的处理逻辑,都是先从数据库读取数据,然后写入Memcache;当下次请求来的时候,先尝试从
Memcache里面读取数据,这样就有可能大大减少对数据库的访问。