摘要:
线程池服务模型是single thread 与 request per thread两种模型的折中方案,其在实现时通常需要借助任务队列,主线程往任务队列尾添加任务,线程池中的服务线程不断从任务队列头取任务并服务,如下图所示: 对于主线程和服务线程来说,任务队列是临界资源,需要加锁进行保护。主线程往任务队列添加任务时需要加锁,服务线程从任务队列取任务也许加锁,当服务线程发现任... 阅读全文
摘要:
网络服务器的实现不外乎两种情况,一是为某个业务单端开发服务器,二是实现通用网络服务器框架,前者的设计可能很大程度的受业务需求的影响,而后者则要保证简单易用,稳定服务,最好还有不错的性能。 服务器框架的优势在于让使用者快速的进行开发,只需要做很少的事情即可完成服务器的开发。在整个服务模型中,只有对请求任务的处理是预先不可知的,其他的逻辑基本上是固定的,故在实现框架时,将实际的处理部分以回调的形... 阅读全文
摘要:
多线程在网络编程中作用重大,由于创建/销毁线程、线程间通信的开销小,目前很多网络服务器都是用多线程(线程池)的模式对外提供服务。linux上开发多线程程序多使用pthread库,本文主要讨论使用C++封装pthread库时可能出现的问题。 封装pthread库主要有两种思路,第一种是简单的封装接口,如下所示: class simple_thread_t {
public:
int star... 阅读全文
摘要:
循环read(write) 在网络应用程序中,通常需要重复的调用read/write来读取到指定数量的数据,如下例: int wrapper_read(int fd, char *buf, int
size) { int ridx = 0; int rlen = 0; while(ridx <
size) { rlen = read(fd, buf + ridx, size
– ri... 阅读全文
摘要:
linux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
int poll(struct pollfd *fds,... 阅读全文
摘要:
关于listen的backup参数
listen的第二个参数,在网上有各种版本的解释,有人说是三次握手成功等待被accept的请求队列长度,有人说是尚未成功建立连接的队列长度,有人说是二者队列长度之和。 #man listen # man tcp 从man手册可以发现:从linux 2.2开始,backlog是指已经建立连接等待被accept的队列长度,而未成功建立连接的队列长度由tc... 阅读全文
摘要:
关于hash函数 hash函数主要用于将“大范围”映射到“小范围”,如MD5将任意长度的数据计算出128bit的签名值,RSHash等函数将任意长度的数据转换成32bit的无符号整型,好的hash函数拥有高性能以及低hash冲突。 hash函数主要通过加减乘除及移位等操作来计算最终结果,hash函数的分类参考: http://nicoleamanda.blog.163.com/blog/... 阅读全文
摘要:
有m个server、n个client,client发出的请求被随机发送到某一个server上,client的请求为串行模式,即每个请求被处理完后才能发送下一个请求,server处理每个请求的时间为T,server每次只能处理一个请求,其他的请求将排队等待。求当client发送请求无限多时,每个请求的平均服务时间? 请求次数无限多时,可以认为请求被均匀分不到各个server上: (1... 阅读全文
摘要:
趁着京东商城做活动,买了几本一直想看的书,其中包括《复制互联网-2011年全球最值得模仿的100个网站》,虽然网易科技有“每日一站”专栏,但我还是想买本书收藏一下。 本书主要从“web 2.0网站”,“搜索引擎”,“电子商务”,“移动互联网”,“多媒体服务”,“网络营销”,“网络工具及其他”等七个领域进行分类介绍,本文是我阅读该书的一点总结。 web 2.0网站 该类目下主要介绍一些... 阅读全文
摘要:
step1 安装xampp(包含apache、mysql、php、perl等组件,并提供统一的管理) step2 打开xampp control panel,启动apache服务(如果不能成功启动,查看http:80端口以及https:443端口是否被占用,如果被占用则关闭对应的服务)。 step3 ... 阅读全文