当前位置: 技术问答>linux和unix
unix下socket的client/server体系设计方案比较
来源: 互联网 发布时间:2015-11-20
本文导语: 由于刚从windows下转到UNIX下作开发,有些问题还希望各位能够指点一二,谢谢! server端监听socket端口,接收到client连接后,是启动一个子进程还是线程来处理?两种方案各有什么优势?顺便说一下,应用环境中client...
由于刚从windows下转到UNIX下作开发,有些问题还希望各位能够指点一二,谢谢!
server端监听socket端口,接收到client连接后,是启动一个子进程还是线程来处理?两种方案各有什么优势?顺便说一下,应用环境中client和server驻留在不同的物理节点上,是一个长连接,每隔一段时间就要进行数据交互。
server端监听socket端口,接收到client连接后,是启动一个子进程还是线程来处理?两种方案各有什么优势?顺便说一下,应用环境中client和server驻留在不同的物理节点上,是一个长连接,每隔一段时间就要进行数据交互。
|
就是说要select能够返回“描述符可写”时空闲buffer的最小值。
我也看了一下,linux不支持这个选项,设置时只是返回错误,errno为ENOPROTOOPT。只能get,且返回值固定为1。看内核源码。
我也看了一下,linux不支持这个选项,设置时只是返回错误,errno为ENOPROTOOPT。只能get,且返回值固定为1。看内核源码。
|
线程于进程的好处在于:
方便通信,线程共享了代码与数据空间,所以对共享空间提供了最原始的支持
可以用线程运行完销毁的方式而不需要回收线程资源,只要进程退出,所有线程就销毁了,不需要担心有僵尸进程的出现,也就是资源不能回收的问题。
对于并发比较高的服务器,并且每个处理时间又不是太长的情况下,可以采用线程池的方式
在同等情况下,线程所占资源略少于进程,因为线程在访问一共享变量时,在物理内存中仅有一份此变量所占空间,若是进程间需要改写同一全局变量时,此时就会产生“写时复制”,会产生两份空间(对一个变量的改写,会造成多占用大于等于4K的物理空间)
进程于线程的好处在于:
不需要担心太多因为访问共享资源而造成的各种同步与互斥问题,如果需要共享某部分内容,需要走专用的进程间通信手段,也就是说对于共享空间是可控制的,不会出现随机性
不用担心一不小心就造成函数重入的问题
在不同的进程中,可以使用不同的ELF文件作为执行体,当然,在线程中也可以再进行fork+execv来实现这种方案
无论是线程还是进程,其调度方式是一样的
长连接,用poll/select/epoll做多路复用的方式优缺点:
由于不会造成多线程与多进程,所以所有代码都在一个执行体内,都在同一调度单元中,节省了资源的开销,如内存的占用,进程切换的开销。
由于所有处理都在同一个调度单元内,也就是多个连接共用一个进程的时间片,如果系统中还有很多其它优先级较高进程或者实时进程,平均下来每个连接所占用的CPU时间就较少,且如果一个连接处于死循环中,若不加其它控制,其它连接就永远得不到响应,也就是说每个连接的响应实时性会受到其它连接的影响。
如果对于每个连接的处理方式不同,会造成代码的不好控制,因为会有太多的逻辑判断。
以上三种方式,各有优缺点,主要是楼主的需求,这三种方式并非是互斥的,可以交叉使用,灵活控制,从而最优化你的软件。当然,如果并发连接达到2000个以上,并发处理也达到几百上千个以上(且每个处理过程会执行很长),那么推荐你采用分布式处理,单个PC机是无法承受这种负荷的(若使用专用服务器,性能会好一些,这个相对限制会宽一些),至少会造成响应时间过长
方便通信,线程共享了代码与数据空间,所以对共享空间提供了最原始的支持
可以用线程运行完销毁的方式而不需要回收线程资源,只要进程退出,所有线程就销毁了,不需要担心有僵尸进程的出现,也就是资源不能回收的问题。
对于并发比较高的服务器,并且每个处理时间又不是太长的情况下,可以采用线程池的方式
在同等情况下,线程所占资源略少于进程,因为线程在访问一共享变量时,在物理内存中仅有一份此变量所占空间,若是进程间需要改写同一全局变量时,此时就会产生“写时复制”,会产生两份空间(对一个变量的改写,会造成多占用大于等于4K的物理空间)
进程于线程的好处在于:
不需要担心太多因为访问共享资源而造成的各种同步与互斥问题,如果需要共享某部分内容,需要走专用的进程间通信手段,也就是说对于共享空间是可控制的,不会出现随机性
不用担心一不小心就造成函数重入的问题
在不同的进程中,可以使用不同的ELF文件作为执行体,当然,在线程中也可以再进行fork+execv来实现这种方案
无论是线程还是进程,其调度方式是一样的
长连接,用poll/select/epoll做多路复用的方式优缺点:
由于不会造成多线程与多进程,所以所有代码都在一个执行体内,都在同一调度单元中,节省了资源的开销,如内存的占用,进程切换的开销。
由于所有处理都在同一个调度单元内,也就是多个连接共用一个进程的时间片,如果系统中还有很多其它优先级较高进程或者实时进程,平均下来每个连接所占用的CPU时间就较少,且如果一个连接处于死循环中,若不加其它控制,其它连接就永远得不到响应,也就是说每个连接的响应实时性会受到其它连接的影响。
如果对于每个连接的处理方式不同,会造成代码的不好控制,因为会有太多的逻辑判断。
以上三种方式,各有优缺点,主要是楼主的需求,这三种方式并非是互斥的,可以交叉使用,灵活控制,从而最优化你的软件。当然,如果并发连接达到2000个以上,并发处理也达到几百上千个以上(且每个处理过程会执行很长),那么推荐你采用分布式处理,单个PC机是无法承受这种负荷的(若使用专用服务器,性能会好一些,这个相对限制会宽一些),至少会造成响应时间过长
|
我去试试看,实在不行,就还是select来判断,虽然时效性可能不能完美达到:)
|
进程 好管理
线程 高并发时资源要求少
线程 高并发时资源要求少
|
如果client不是很多的话,完全可以做一个多进程并发服务器。用不着复杂的模型。
建议你使用HTTP协议或者,FTP协议。那样对断点续传也有很好的支持。
建议你使用HTTP协议或者,FTP协议。那样对断点续传也有很好的支持。
|
拿本看看,里面讲了好多server的程序模式。
|
你们就没有想过多线程的程序,如果一个线程down了,很可能整个进程就一起咯批了。
|
mark