利用MultiThread
还要注意数据结构处理得如何
还要注意数据结构处理得如何
解决方案 »
- 新手求助!工具栏中的按钮是怎么响应的?
- 在一个类中定义的函数调用了另一个类中定义的静态变量,出现链接错误
- 安装了VC++6.0,为什么没有xp效果?
- URLDownloadToFile下载问题
- 如何在directshow 的运行视频窗口上进行GDI+画图,比如响应鼠标点击移动划线。
- 高分,小问题!!!!
- 关于OLE DB实现分布式事务的问题。
- 键盘钩子能否记录用户输入的汉字?
- 怎样在对话框上动态生成超级连接
- 关于程序员的疑问!
- 如何实现在图片上蒙上一层颜色?就像MS Media Player的按钮一样
- 在win200server下deletefile删除文件可以,但在98下使用deletefile 提示拒绝删除,
另外请大家讨论一下数据库的问题,毕竟很多资料要保存在那上面
只对多CPU服务器有效:)
对于每个用户的请求分配到不同的线程上处理。
对于多路CPU的服务器,性能提高很大!
然后继续投递一个新的wsarecv
另外有一个县城专门负责发送数据,考虑到数据同步的问题,打算采用这种方式
socket受到数据放入数组一,同时设置一个信号灯,当发送县城得到该信号灯后锁定该数组(防治有新的数据打乱),拷贝,并清空该数组,解锁,发送拷贝不知道大家对这个模型有何看法,请指教
就是线程池的方法,不过只能在Win NT 系列上运行。要开发这样的服务器,当然要采用线程池的方式,如果不采用完成端口的方式可以用1个或多个线程监听,然后将连接的客户socket放进一个列表里面,然后 用 n 个工作线程来处理这个列表里面的socket,具体实现的时候一定要注意线程同步与数据访问
的并发控制。
目前,可以确定的是准备采用完成端口的方式来进行处理
影响Server性能. 其中一个设计是关于在server中使用线程的(见下原文),
可能或许对你有所帮助.
另外, 除了考虑在server中使用多线程外,作者在其他9个方面的讨论也是
设计一个高性能server时应该引起重视的.-----------------------------------------------
Tuning the number of threads active in a server is critical. If the threads are I/O-bound, they'll spend much of their time
blocking, waiting for I/O to complete — and a blocked thread is
a thread that's not doing useful work. Adding additional threads
can increase throughput, but adding too many threads will decrease
server performance, because context swapping will become a
significant overhead. The rate of context switches should be kept
low for three reasons: context switches are pure overhead and
contribute nothing useful to the application's work; context
switches use up valuable cycles; and worst of all, context switches
leave the processor's caches full of stale data, which is expensive
to replace.Much depends upon your threading architecture. One thread per client is almost never appropriate, as it does not scale well to large numbers of clients. Context switching becomes intolerable and Windows NT runs out of resources. A thread pool model, where a pool of worker threads consumes a queue of requests, works better. In the future, you will no longer need to write your own thread pool, because Windows 2000 provides suitable APIs, such as QueueUserWorkItem.
每建立一个连接就加入到链表里
每断开一个连接就从链表里删除
要开发高性能的服务器应用
完成端口是不二的选择~~~~
偶正在用完成端口做一个WEBSERVER
3。开 n 个工作线程,进行对客户的处理
3, 将accept的客户套接字和完成端口联系起来
4。工作线程处理客户的请求基本模式就是这样Apache Web Server 在NT下面就是这样的模式,你可以参考一下
它在 Win 9X 下面就是采用的我在上面说的那种模式,具体你可以看
它的源程序
一个线程或者多个线程 Accept用一个或多个线程接收客户发来的数据,然后将接收到的数据放入一个
任务队列(这个任务队列就是专门进行存放待处理数据的队列,每一项任务包括一个完整的数据包和客户的socket端口)用一个或者多个线程从任务队列取任务(数据和客户的socket 端口),然后
对数据进行处理,处理完以后就根据客户的端口发送回给客户。
其实我觉得这种模式和完成端口的模式有点类似,不过我没有试验过,不知道
这样的性能怎么样,但是这种方法肯定可行。
当然采用完成端口了,开cpu*2各工作线程在完成端口上等着
当接收到数据,加锁,将此数据拷贝到vector<char*>的一个全局变量中,解锁,然后继续投提一个wsarecv()请求,同时让event有信号
另有一个工作线程等待event有信号,加锁,将此数据拷贝到局部的vector<char*>变量中,解锁,对此数据进行处理,然后发送,让event无信号基本上就是这样了,最后请大家确认一下,有何不足,
比如 CDataBuffer
这样的你的任务(数据)队列即为 queue<CDataBuffer> 这样比较好
另外对于数据访问的并发访问的时候,你最好也写一个类来实现,因为你这个
属于生产者/消费者问题,这个类比如为CWriteReaderSyncObj等你这些类都构造好了,你的整个程序实现起来就
比较清晰一些,也更加利于维护。写这样的系统一定要注意整个程序的架构!
Apache是在一个结构里面的
当然了,那样方便就那样用,是不是
在单机上耗时较长,所以专门做一个计算服务器,不过用的不是socket,
是我自己写的一个通信库,模拟socket的方式,主要用在局域网上面,不过以前倒是经常用socket,