当前位置: 技术问答>linux和unix
服务器并发时,代码是否也复制?
来源: 互联网 发布时间:2016-12-07
本文导语: 比如用TCP连接的服务器和客户端,一个服务器可以同时和 多个客户端进行通信,请问:此时的服务器端代码是否要复制 多份分别与客户端通信? 比如: sks=socket(AF_INET,SOCK_STREAM,0); bind(sks,(struct sockaddr*)&adds,sizeof(struc...
比如用TCP连接的服务器和客户端,一个服务器可以同时和
多个客户端进行通信,请问:此时的服务器端代码是否要复制
多份分别与客户端通信?
比如:
sks=socket(AF_INET,SOCK_STREAM,0);
bind(sks,(struct sockaddr*)&adds,sizeof(struct sockaddr));
listen(sks,BACKLOG);
while(1)
{
connsks=accept(sks,(struct sockaddr*)&addc,&addclen)
if (fork()==0)
{
char bufsend[100],bufrecv[100];
int lenrecv;
通信
}
...
}
因为服务器与每个客户端通信时,服务器代码中都要有分别不同的套接字等变量与客户端
通信,请问服务器并发时,服务器端的代码是怎么做的?
多个客户端进行通信,请问:此时的服务器端代码是否要复制
多份分别与客户端通信?
比如:
sks=socket(AF_INET,SOCK_STREAM,0);
bind(sks,(struct sockaddr*)&adds,sizeof(struct sockaddr));
listen(sks,BACKLOG);
while(1)
{
connsks=accept(sks,(struct sockaddr*)&addc,&addclen)
if (fork()==0)
{
char bufsend[100],bufrecv[100];
int lenrecv;
通信
}
...
}
因为服务器与每个客户端通信时,服务器代码中都要有分别不同的套接字等变量与客户端
通信,请问服务器并发时,服务器端的代码是怎么做的?
|
如果业务量不大,一个服务进程也可以满足要求,就是串行处理呗
如果业务量大,那就需要使用多进程/多线程
如果业务量大,那就需要使用多进程/多线程
|
lz贴的代码就是多进程的例子
每收到客户端的一个连接请求,fork()一个子进程,专职处理这个请求
每收到客户端的一个连接请求,fork()一个子进程,专职处理这个请求
|
fork 这个每来一个就新建一个进层。应该是会复制多分的,linux采用的是写时复制,也就是说内存真正被修改了才复制的。代码段估计不用改吧。char bufsend[100],bufrecv[100]; 这种应该是会放到栈上,没有进程都有自己独立的吧。
你这个代码应该可以运行,数据是独立的每个连接一份,没有问题。
不过好像说每个连接新建一个进程不是好的做法,创建一个进程开销还是比较大的。你就使用一个进程,在一个进程里面循环处理,效率应该也比他高
你这个代码应该可以运行,数据是独立的每个连接一份,没有问题。
不过好像说每个连接新建一个进程不是好的做法,创建一个进程开销还是比较大的。你就使用一个进程,在一个进程里面循环处理,效率应该也比他高
|
差不多这样,我也不清除细节。 不过理解成代码也是独立也没有问题。 属于不同的进程,确实看上去每个进程都是独立的,用的时候也不会影响别的进程。只是内部实现是这样,你没有改过的地方,暂时还是共享的。
|
我的理解认为justkk说的是对的,你的代码已经是多进程的。
就像shell命令的实现一样,每收到一个shell命令就fork一个子进程去处理,处理完后,该进程就结束,这样挺好的,容易理解,也不容易出错。