APP下载

C/S软件中并发处理的探讨与研究

2014-11-05王立静冯剑炳

电子技术与软件工程 2014年18期
关键词:进程服务器

王立静 冯剑炳

摘 要

大多数客户端软件都能够并发运行,那是由于底层的OS允许用户并发地运行及操作各个客户端软件,或者是由于多台PC上的用户在同一时间独自运行客户端软件。单独一个客户端软件就相当于普通的程序那样运行;它不明显地管理并发。并发提供了很多蕴藏在C/S交互背后的能力,但随之带来的问题却是使软件的设计和构建变得更加的困难。

【关键词】并发运行 服务器 切换 进程

1 服务器与网络中的并发

与并发的客户端软件截然不同的是,实现服务器中的并发需要浪费不少的时间。单个服务器必须并发地处理多个传入的请求(incoming request)。比如,有那么一个远程登录的服务器,这台服务器并不能并发运行,而是每次只能接受一台客户机的远程登录。那么当有一个客户机与其建立了远程关系后,服务器就只能忽略或者直接拒绝其他客户机的连接请求,直到第一个客户机用户的结束或释放会话。很明显,这样的设计限制了服务器使用,从而使多个远程用户不能在同一时间访问某台主机。

分布式计算机的基础就是并发处理,并发会以不同形式出现。并发的产生可以是在单个网络中的各个主机之间,许多成对的应用程序可以进行并发通信,共享它们之间的互连网络,但它们的应该进程看上去却像是独立地运行一样;也可以在特定的计算机系统中,比如一个用户正在游览网页,而另一个用户又进行着远程的操作,从用户表面看,就像所有的客户程序同时都在运行中;还可以在一组主机上的所有客户端之间进行并发执行。程序员并不用在客户软件的并发中特别浪费时间。因为操作系统允许多个用户在同一时间各自运行某个程序,程序间的并发是与生俱有的。所以说各个客户端程序的运行很像一个个普通的程序。

2 进程在并发处理中的作用

在并发处理的系统中,进程(process)这种抽象定义了计算机的基本任务或者说是基本单元。我们认为一个进程包括一段地址空间和至少一个执行的线程(thread)。线程最重要的信息是一个指令指针(instruction pointer),它指向该进程正在执行的地址。

与程序的静态版本不同的是,进程是指只包括一个计算的活动执行。当创建一个进程后,操作系统将程序的一个副本放到计算机中,然后启动一个线程执行这个程序。也就是说并发处理系统允许一个进程中的多个线程或者是多个进程一只的多个线程在“同一时间”执行同一段代码。当然,在单处理器的结构体系中一个CPU在任一时间点只能执行单一的线程。为了使用户看上去好像在同时执行多个程序计算,操作系统在所有正在进行操作的线程之间不断快速的切换CPU计算。这样从用户角度看,许多线程像是同时运行的,但其实CPU只能同时处理一个线程,CPU是一个线程执行了一段时间后,再到别一个线程上去执行一段时间,如此快速的反复着。而在多处理器系统中,所有的CPU是可以同时执行多个线程的。

3 进程分离的优势

虽然说一个进程是可以包含多个执行的线程的,但fork()却不可以复制这个进程的所有线程。在fork创建一个运行进程副本时,新进程仅含有执行fork()的那个线程。所以,除非程序员明确创建了多个线程,不然每一个进程都是单线程的。

fork是可以用来创建新进程的,它与原来的进程执行完全一样的代码,且代码中的变量值也一模一样。因为创建的副本与原进程代码一样,且又执行完全一样的计算,那是不是就是说这样的副本是没有意思和用处的呢?其实在实际的应用中,fork所创建的进程与原进程其实还是有一些小细节上的不同的。Fork是一个函数,它需要返回值。当函数调用返回进,给原进程的值和返回给新创建进程的值是不同的。新创建的进程时,fork函数的返回值是0;而在原进程中,fork函数返回值则是进程标识符(process identifier)进程或进各id,简写pid。并发程序利用fork的返回值来决定如何继续执行。最常见的是在代码中判断返回值是否是0的条件语句。例如:

#include

Int s;

main()

{intpid;

s=0;

pid=fork();

if (pid!=0)

{printf(“在原来的进程中”);}

else

{printf (“在新创建的进程中”);}

exit(0);

}

也就是说在原进程和新创建的进程里,fork函数所返回的值是不同的;并发程序则是利用这个值让新进程执行与原进程不一样的代码。

4 切换和协议软件的设计

操作系统所提供的并发处理机制使得程序的功能更强大,而且更加容易理解,但它们的确是有计算开销的。于是,操作系统采用了时间分片机制来保证所有线程的并发执行,在各个线程之间非常快速地切换一个或多个CPU,以至于用户在使用过程中像是在同时执行。当操作系统暂停一个线程的去切换到别的线程时,会发生切换(switch)。当然,在同一个进程中的多线程间切换的开销要比不同进程中线程间切换的开销少一些。但无论如何,线程间的切换都要用到CPU,而且在CPU正忙于切换时,任何线程都是不能保证其服务的。因此,为了减少不必要的开销,设计协议软件的时候应想方设法将切换的次数减到最小。特别是程序员需保证在服务器中引入并发处理所带来的好处比切换的开销要多。

5 结束语

并发使用户不必一个等着一个地接受服务。多用户的并发很容易发生,因为多个户可以在同一时间执行客户应用软件。然后服务器软件是必须通过编程来并发地处理请求的。并发程序可以利用fork函数的返回值使新创建的进程执行与原进程不同的程序。但并发并非不用付出代价。当操作系统人一个进程切换到另一个进程时,系统就会用到CPU。在服务器设计中要使用并发的程序员应该保证并发设计所带来的好处要超过由于其切换所引起的开销。

参考文献

[1]Douglas Schmidt 编著.并发和联网对象模式[M].北京:人民邮电出版社,2013(12).

[2]李彬编著.Linux QtGui并发详解[M].北京:航空航天出版社,2013(02).

[3]Martin Erlang编著.OTP并发编程实战[M].北京:人民邮电出版社,2012(07).

[4]Joseph Bowbeer编著.Java 并发编程实战[M].北京:机械工业出版社,2012(02).

作者单位

1.浙江农业商贸职业学院 浙江省绍兴市 312000

2.绍兴科技馆 浙江省绍兴市 312000

猜你喜欢

进程服务器
债券市场对外开放的进程与展望
通信控制服务器(CCS)维护终端的设计与实现
改革开放进程中的国际收支统计
中国服务器市场份额出炉
得形忘意的服务器标准
计算机网络安全服务器入侵与防御
服务器操作系统可信加固技术研究
关于Linux的视频服务器开发与实现分析
我国高等教育改革进程与反思
Linux僵死进程的产生与避免