对于并行处理的一点思考

2016-4-13 sunsmile 专业

最近一段时间,需要对一直进行维护的服务器后端模块从现有的单机较低并行程度改进升级,首先是提高单机并行化程度,其次从单机工作模式升级为多机分布式工作模式。

说到并行化,经常会想到相近的一个名词就是,并发 ;
并发是指在同一时间间隔内,同时运行多个任务;
并行是指在同一时刻内,同时运行多个任务;
在单核单处理上面执行这些指令时,可以首先将不相关的指令在短时间内依次执行,然后处理后续的指令;也就是时分复用处理器,同一时刻只有一条指令在执行,这叫并发,其实并发从硬件来说仍然是串行的,只是给人们(或者说使用者)的感觉是同时在执行,或者可以理解为伪并行;
在多核或者多处理的情况下,可以将不相关的指令同时放在不同的核上面或者不同的处理器上面执行,这时才是真正的并行;

对于并行化改进,需要对模块进行深入分析,寻找并行化的设计空间;对于单机并行化,可以从两个方面着手,首先是对业务进行深入分析,分析业务处理的并行化空间,一般情况下,业务处理方面的并行化改进空间都是存在的,并且对于处理效率有较大的提升;其次是对算法结构的深入分析,在算法级别进行并行化改造。

并行化的实现有多线程方式和多进程方式,多线程并行化和多线程并行化两种方式各有优缺点,并且适用的场景也是各有不同,对于传统的WEB服务器接收客户端请求这个任务来说,多线程更为合适,因为客户端请求是独立的,当然这并不是绝对的;并行化的实现可以是多线程、多进程或者二者结合的方式。

对于父子进程,它们之间会共享状态信息,但不会共享用户空间;也就是父进程创建了子进程之后,子进程的所有状态信息都是从父进程复制过来的,而用户空间是两个独立的空间;也正是由于进程之间没有共享的内容,所以进程之间如果需要通信,必须通过现实的IPC机制(包括共享内存方式、信号量方式以及套接字方式);

对于线程,并没有明确的父子关系, 不会因为一个线程A创建了线程B,则A是B的父线程,线程之间的关系是对等的,虽然一个线程可以创建另一个线程,但每个线程都可以自动退出或者杀死其他线程;相对于进程,线程之间的关系相对来说更加紧密,线程之间会共享虚拟地址空间,每个线程仅保存独立的运行堆栈、运行状态等信息;

从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。

并行化层次通常从高到低包含作业级、任务级、子程序级、语句级、指令级;级别越高,并行化的粒度越粗;
指令级的并行化通常是在硬件处理器设计时需要支持的,其余层级则是能够通过软件设计实现;

分布式其实是多机并行化的一种实现方式,可以是多个服务器的任务相互协同处理同一个数据集,也可以是多个服务器的任务同时处理多个数据集。

发表评论:

Powered by emlog 京ICP备15044591号-1