当前位置: 技术问答>linux和unix
已经看过 UNP第一卷,花了一天时间看了看精华区,还是有一些问题想请教各位大侠
来源: 互联网 发布时间:2015-09-04
本文导语: 已经看过 UNP第一卷,花了一天时间看了看精华区,还是有一些问题想请教各位大侠: 问题的背景:现在我需要考虑开发一个面向数万人在线的服务器程序,希望在redhat 9.0上面用多线程socket编程完成.不是类似于web服务那样...
已经看过 UNP第一卷,花了一天时间看了看精华区,还是有一些问题想请教各位大侠:
问题的背景:现在我需要考虑开发一个面向数万人在线的服务器程序,希望在redhat 9.0上面用多线程socket编程完成.不是类似于web服务那样的以客户读操作为主的,而是一个类似于bbs系统社区系统这样的客户交互很多的系统.
现在想得到大家的建议和一些帮助:
1 由于不擅长处理UDP的可靠性, 我决定使用tcp作为客户端和服务器端通讯的通讯协议,但是通讯的内容模型并不是字节流,而是需要被划分成一个一个的数据包.这样我的第一个问题就是有没有比较通用的解决方案.让tcp传送的字节流能够被完整完全地划分成一个一个的数据报?
2 由于服务器面对运行性能有一定的要求,我决定在linux上使用C/C++编程,而不是java.但是我目前只有win32底下的C/C++编程经验,这样以来我的第二个头疼的问题就是我不知道去什么地方寻找linux底下好用的C/C++的库,特别是我需要的一些重要的数据结构对象,例如哈希表等等.我看过少量的一些库的介绍好像都没有提到这些数据结构对象的实现,而且我也无法判断那些库里面,这些对服务器程序性能来说非常重要的对象的实现质量.一旦使用哈希表里面可能有数万个成员,因此请推荐一到三个适合我的库.
3 这是一个非常细节的问题,关于哈希表和多线程.我没有经受过数据结构和算法方面的职业的训练,但是我知道哈希表的一般概念.我现在最困惑的一个问题就是多个线程对哈希表的操作.
毫无疑问,当多个线程之间最重要的共享资源就是一个巨大的哈希表的时候,多线程访问哈希表的互斥控制直接决定了服务器的性能.按照我现在的认识水平,某些操作无需互斥,多个线程可以各干个的(讨论的前提是哈希表在整个过程中不会因为初始化不够而被迫扩充),例如两个线程各自读写两个不同key值的成员,这两个线程的操作无需要互斥(究竟是不是这么回事,请各位大侠指正),有一些操作在我看来肯定是需要互斥保护的,例如两个线程分别都想向表中增加一个或者减少一个成员, 但是如果是一个线程需要对表的成员增加或者删除,另一个线程需要读写另外一个特定的无关的成员,这样的情况需要互斥保护吗? 我对这些问题都无法准确回答,因此请各位指点.
4 这么多的线程本身就是一个愚蠢的想法吗? 我现在有一个数千个线程在一个进程里面工作的java服务器,在redhat9.0的2.6内核底下表现还算马马虎虎.如果让数万个线程在同一个进程中分别为不同的客户端服务,这是不是一个很疯狂的想法呢?听说2.6的内核关于线程的调度不受线程数目的影响了,但我仅仅是听说而已,即使这个是真的,这么多的线程会不会让内核时间占用过多而导致性能反而下降? 反之如果不使用多线程,以我目前的水平,我还没有勇气面对一个因使用复杂的IO模型而更复杂的服务器程序:(
5 最后恳求大侠指点有没有和我要做的工作比较接近的源程序组合或者开源软件项目,或者推荐几本书,电子版的最好:)
这么长,鞠躬感谢每一个看完的大侠//bow
问题的背景:现在我需要考虑开发一个面向数万人在线的服务器程序,希望在redhat 9.0上面用多线程socket编程完成.不是类似于web服务那样的以客户读操作为主的,而是一个类似于bbs系统社区系统这样的客户交互很多的系统.
现在想得到大家的建议和一些帮助:
1 由于不擅长处理UDP的可靠性, 我决定使用tcp作为客户端和服务器端通讯的通讯协议,但是通讯的内容模型并不是字节流,而是需要被划分成一个一个的数据包.这样我的第一个问题就是有没有比较通用的解决方案.让tcp传送的字节流能够被完整完全地划分成一个一个的数据报?
2 由于服务器面对运行性能有一定的要求,我决定在linux上使用C/C++编程,而不是java.但是我目前只有win32底下的C/C++编程经验,这样以来我的第二个头疼的问题就是我不知道去什么地方寻找linux底下好用的C/C++的库,特别是我需要的一些重要的数据结构对象,例如哈希表等等.我看过少量的一些库的介绍好像都没有提到这些数据结构对象的实现,而且我也无法判断那些库里面,这些对服务器程序性能来说非常重要的对象的实现质量.一旦使用哈希表里面可能有数万个成员,因此请推荐一到三个适合我的库.
3 这是一个非常细节的问题,关于哈希表和多线程.我没有经受过数据结构和算法方面的职业的训练,但是我知道哈希表的一般概念.我现在最困惑的一个问题就是多个线程对哈希表的操作.
毫无疑问,当多个线程之间最重要的共享资源就是一个巨大的哈希表的时候,多线程访问哈希表的互斥控制直接决定了服务器的性能.按照我现在的认识水平,某些操作无需互斥,多个线程可以各干个的(讨论的前提是哈希表在整个过程中不会因为初始化不够而被迫扩充),例如两个线程各自读写两个不同key值的成员,这两个线程的操作无需要互斥(究竟是不是这么回事,请各位大侠指正),有一些操作在我看来肯定是需要互斥保护的,例如两个线程分别都想向表中增加一个或者减少一个成员, 但是如果是一个线程需要对表的成员增加或者删除,另一个线程需要读写另外一个特定的无关的成员,这样的情况需要互斥保护吗? 我对这些问题都无法准确回答,因此请各位指点.
4 这么多的线程本身就是一个愚蠢的想法吗? 我现在有一个数千个线程在一个进程里面工作的java服务器,在redhat9.0的2.6内核底下表现还算马马虎虎.如果让数万个线程在同一个进程中分别为不同的客户端服务,这是不是一个很疯狂的想法呢?听说2.6的内核关于线程的调度不受线程数目的影响了,但我仅仅是听说而已,即使这个是真的,这么多的线程会不会让内核时间占用过多而导致性能反而下降? 反之如果不使用多线程,以我目前的水平,我还没有勇气面对一个因使用复杂的IO模型而更复杂的服务器程序:(
5 最后恳求大侠指点有没有和我要做的工作比较接近的源程序组合或者开源软件项目,或者推荐几本书,电子版的最好:)
这么长,鞠躬感谢每一个看完的大侠//bow
|
楼主,是说有什么开源的平台可以使用吧,ACE很好,良好的通讯架构,国内用的人也很多了。
http://www.cs.wustl.edu/~schmidt/ACE.html
http://www.cs.wustl.edu/~schmidt/ACE.html
|
ACE,虽然可靠性尚待验证,但基本上没什么问题
|
这么长的问题可能很难有人有耐心看完,我试着回答一下你的问题巴,
1。tcp和udp的本质区别是面向连接和非面向连接。你问得字节流能够被完整完全地划分成一个一个的数据报,不知道你问题的初衷是什么?你可以在上层随意处理你的数据。
2。不知道去什么地方寻找linux底下好用的C/C++的库? 在man和info中找, 一般都有。
man -a hash
3. 多线程操作同一数据时肯定要互斥保护。你可以搞一个读锁一个写锁,类似于kernel里面的那种。
4。 这主要跟你机器性能有关系。
5。 不清楚你做的工作是什么?
1。tcp和udp的本质区别是面向连接和非面向连接。你问得字节流能够被完整完全地划分成一个一个的数据报,不知道你问题的初衷是什么?你可以在上层随意处理你的数据。
2。不知道去什么地方寻找linux底下好用的C/C++的库? 在man和info中找, 一般都有。
man -a hash
3. 多线程操作同一数据时肯定要互斥保护。你可以搞一个读锁一个写锁,类似于kernel里面的那种。
4。 这主要跟你机器性能有关系。
5。 不清楚你做的工作是什么?
|
1.tcp流本身是无边界的,但是你可以协定好每个包的大小来作为你自己的边界,你读的时候从tcp缓冲区中按协商好的大小读取出来构造你的包应该就可以了吧。
3.问题是你怎么知道什么时候哪条线程会读写哪个数据,而哪些线程又会增删哪个数据,肯定是任何操作都要上锁的,如果因此效率变的很低,那应该考虑这样设计(那么多个线程同时去操作同一个数据结构)是不是合理了。
3.问题是你怎么知道什么时候哪条线程会读写哪个数据,而哪些线程又会增删哪个数据,肯定是任何操作都要上锁的,如果因此效率变的很低,那应该考虑这样设计(那么多个线程同时去操作同一个数据结构)是不是合理了。
|
1. 常见的两种方法,一种是每个包固定大小,一种是加一个长度标记。
2. 实际上你把锁加在什么地方都可以,主要看你的数据结构是什么设计的。
2. 实际上你把锁加在什么地方都可以,主要看你的数据结构是什么设计的。
|
telnet bbs ?
|
晕倒,,几万个线程和几钱个线程,,,。
你的CPU全花在了线程切换上去了。。。
用thread pool.
你的CPU全花在了线程切换上去了。。。
用thread pool.
|
万人在线 ? 需要server集群