首页
社区
课程
招聘
[求助]socket编程问题!谢谢
发表于: 2013-10-8 09:23 8107

[求助]socket编程问题!谢谢

2013-10-8 09:23
8107
我现在编程用的是最基本的阻塞模型,服务端每个socket我用的是一个线程来处理的(因为对于每个客户端来说发出的请求是串行的,并不是同时多个,所以一个线程基本够用,对多客户端并发,正好用多线程来解决)。目前没发现啥问题。(或许将来会有问题,但目前不知道)

我看书上的非阻塞模型。貌似是在单线程的情况下使用的。(当然,有好多种做法)

就我所使用的阻塞模型多线程处理来比较,与非阻塞模型孰优孰劣?是怎么回事?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
《Windows网络与通信程序设计》,王艳平的。里面有详细的介绍
2013-10-8 09:34
0
雪    币: 60
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
除非用IOCP完成端口,线程上阻塞和非阻塞区别不大
2013-10-8 09:36
0
雪    币: 153
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
针对多客户端,个人建议用非阻塞,效率好些。
2013-10-8 10:18
0
雪    币: 9
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果你的每个线程的传输数据都是繁忙的饱和的那到没有什么,看业务
2013-10-8 10:52
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
线程的挂起,唤醒,我可以控制啊!
2013-10-8 10:56
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
为什么说,效率会好些呢?
2013-10-8 10:58
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
正在学,看到第4章,感觉好像教怎么写服务器程序的书
2013-10-8 11:03
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
windows 网络编程,使用IOCP。 完成端口来处理。 具体的代码可以参考 gh0st
2013-10-8 13:58
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我觉得上面回答都有点不对。
你要想想我们为什么要使用多线程。
1:我们cpu不只是一个,用多线程一般来说效率高。
2:单个线程已经不能满足需求或者导致效率不高(比喻阻塞)
3:方便业务的区分。
。。。。。。。。。。。
所以最好弄明白为什么要用多线程。才能比较出该用多线程和单线程。

阻塞和非阻塞区别无非是是否会阻塞当前所在的线程。
你用阻塞多线程或者单线程 或者 非阻塞单线程或者别的都是根据你需求来定。没有绝对优势和绝对弱势。

你觉得你开5个线程还是开一个线程读取读取 1kb的文件 哪个效率要高呢。
你觉得你开5个线程还是开一个线程读取1g的文件哪个效率要高呢。(cpu > 1)
2013-10-8 16:32
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
第一,我的服务端有很多文件可能要读写,并不是集中在一个文件上。
第二,我的服务端会变成一个处理任务的分发汇集中枢。
2013-10-8 16:42
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我现在编程用的是最基本的阻塞模型,服务端每个socket我用的是一个线程来处理的(因为对于每个客户端来说发出的请求是串行的,并不是同时多个,所以一个线程基本够用,对多客户端并发,正好用多线程来解决)。目前没发现啥问题。(或许将来会有问题,但目前不知道)

每个线程分配一个socket来处理在一般情况下是没啥问题的。特殊情况下有问题
1、客户端数量多了的话,线程数攀升,影响处理效率;
2、很多线程处于等待状态(比如调用阻塞的recv),浪费资源;
3、从高性能的角度来考虑的话,线程的创建销毁成本也是不容忽视的;

我看书上的非阻塞模型。貌似是在单线程的情况下使用的。(当然,有好多种做法)

非阻塞模型相对于上面提到的多线程阻塞模型,一个最大的改进就是能在一个线程内处理多个socket,书上用单线程来说明这个问题是合理的。但是这并不意味着一定要单线程,合理的多线程能提高非阻塞的效率。

就我所使用的阻塞模型多线程处理来比较,与非阻塞模型孰优孰劣?是怎么回事?

阻塞模型在多客户端的场景或商业应用下,基本不具备实用价值。非阻塞中select<async_select<event_select overlapped CompletionRoutine<IOCP
2013-10-9 09:05
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
那如果我做线程控制呢?IOCP貌似用一个链表把socket处理线程都管起来了(我看书上好像是这样)。我也可以自己做一个这样的功能。当然,它那个是依赖API的,性能会好不少。但我自己做的不依赖API。这有用吗?

//说实在的我真的不知道unix下这种是怎么解决的!?不过我目前做windows下的,天知道有没有移植的一天。但我目前还是用尽量少依赖API的做法。
2013-10-9 10:06
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
完成端口是内核对象,不是你用什么数据结构什么设计方式就能达到的。要追求高效率,必须使用操作系统的接口,linux也是一样。

windows上用完成端口,linux上用epoll。

或者用boost等第三方库的网络组件,对上层的接口统一,但是下层的实现和操作系统相关。
2013-10-9 11:44
0
游客
登录 | 注册 方可回帖
返回
//