20170906_线程和进程的区别

来源:互联网 发布:vava黑历史知乎 编辑:程序博客网 时间:2024/06/04 23:58

20170906_线程和进程的区别

本博客是从实际网络编程的角度来简述讲解线程和进程之间的区别的。

A、先简要概述一下:

1、进程的缺点:基于多进程的并发服务器模型,在针对每一个客户端连接请求的时候均会创建一个子进程为之提供数据IO的服务。但是,创建子进程本身的工作会给操作系统带来相当沉重的负担或者说开销,这个负担不仅体现在需要CPU 大量的计算过程中,还体现在需要大量的内存空间上。而且,每个进程都拥有各自独立的内存空间,这导致了进程之间的通信难度也大大增加,即需要特殊的IPC机制(inter process communication)进行支撑,比如“管道技术(pipe)”等。另外,在多进程并发服务器运行的时候,进程的上下文切换也占据了很大开销。

2、因此,为了在一定程度上克服进程的缺点,引入了线程的概念,它是将进程的各种劣势最大程度的降低(而不是直接消除),所以线程又被称为“轻量级进程”。

它具有的优点简述如下:

  • 线程的创建和上下文切换,比进程的创建和上下文切换 速度更快。
  • 线程间的通信或者说数据交换无需特殊技术。

B、再结合图解详述:

1、解释图1:进程间独立的内存

1)如下图所示,每个进程的内存空间都包含着三个主要部分:“保存全局变量和静态变量的全局静态存储区”、“保存由malloc 函数或者new 运算符动态创建的堆区域”,以及“保存局部变量的栈区域”。而且,每个进程都拥有着相互独立的这种内存结构。

2)但是,不管是进程还是线程,都是为了获得多条代码执行流。而为了得到这些代码执行流,我们使用了父进程fork 出子进程,而这些子进程的内存结构特点就是上面所说的完全分离的结构。

因此,可以知道使用进程的缺点如下:

a、第一点是:使用父进程fork 出子进程,这是包括内存结构在内的完整的拷贝过程,会给操作系统带来很大的代价,这个代价不仅体现在需要CPU 大量的计算过程中,还体现在需要大量的内存空间上,以及频繁发生的进程上下文切换的开销。

b、第二点就是:正是因为进程之间的这种完全分割的内存结构,导致进程之间的数据通信的难度大大增加,即需要特殊的IPC 机制(inter process communication)进行支撑,比如“管道技术(pipe)”等。



2、解释图2:线程的内存结构

1)于是,若是为了获得多条代码执行流,我们完全可以不按照进程那样完全分割开内存结构。

如下图2所示,我们由主进程或者说主线程创建(pthread_creat)的子线程,它们是存在于主进程内部的,共享主进程内部的“全局静态存储区”和“动态存储的堆区域”,但是,每个线程独立拥有各自的“存储局部变量的栈区域”。

对于这种内存结构而言,针对进程的缺点,线程它有以下优点:

a、第一点:线程的上下文切换不需要切换“全局静态存储区”和“堆区域”,因此速度上有很大提高。

b、第二点:由于线程共享了主进程的一些区域,因此线程之间可以很容易的依靠此区域进行数据通信,不需要很复杂的IPC机制。



3、解释图3:操作系统、进程和线程的关系

1)总结一下,就是说:

进程:在操作系统内构成单独的代码执行流,或者说是操作系统分配系统资源的基本单位。

线程:在主进程内构成单独的代码执行流,或者说是在主进程内被CPU调度的基本执行单位。

2)因此,操作系统(operate system)、进程(process)和线程(thread)之间的关系如下图3所示:








原创粉丝点击