讨论:高性能的服务器程序设计方案
这两天看了一些资料.说windows上用iocp处理大量连接时是最高效的.
我还没有用过iocp,就我现在了解的有这几个要注意的地方:
1.在io线程内不能有阻塞的操作,要尽可能地立即返回.
2.io线程数最好是等于cpu的个数.
3.具体的逻辑处理最好另开线程或线程池来处理.
就我的理解,如果是这样的话,就肯定需要一个数据队列.io线程收到数据就放到数据队列中,然后立即返回.逻辑处理的线程就从这个数据队列取出数据来处理.
不知道我上面说的是不是对的?或者说这样处理是不是最高效的?
还有,像这种多个线程操作同一个队列的情况一般是要加锁的.加锁就免不了性能下降了.
我现在想到一个不加锁的方法,请各位帮我看看可行不:
内存:分配一块全局的内存,分成一小块一小块,假设分成10块,每块500字节:[0,1,2,3,4,5,6,7,8,9]
线程:1个io线程(用iocp),N个数据处理线程.
io线程收到数据并拼包,放入到索引的内存块中,
然后把索引postthreadmessage给数据处理线程(轮流post给N个数据处理线程的每一个,保存每一个数据处理线程得到同样多的数据包),
同时索引号增1,
当索引值到达内存块数的一半时,比如这里是索引到达4时,给每一个数据处理线程post一个消息,数据处理线程收到这个消息后,会给io线程回传一个信号,比如setevent.
当io线程的索引用到内存块的末尾9时,就检查是否还有数据处理线程正在处理0-4索引的内存块(前面到4时post的那个消息就是起这个作用),如果没有数据处理线程占用,就把索引号重新从0开始.如果还有数据处理线程占用,就一直等待.同理在索引值是9的时候也要post一个消息然后在4的时候检查...
这样就想当于两个缓冲区切换.除了在切换的时候要等待一下,其余的时候都不用考虑.而且如果块数足够多,切换时一般是不需要等待延时的.
还有个疑问,就是io线程拼包所用的时间可不可以接受?会不会太费时?如果把拼包的工作交给其它线程做好像也不好,因为像http这类服务,要根据socket区分每一个用户.
欢迎大家讨论一下^..^