【linux操作系统】进程和线程

(一)进程

   1.1 进程的概念

        是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

   1.2 进程的优势

       (1)每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;

  (2)通过增加CPU,就可以容易扩充性能;

  (3)可以尽量减少线程加锁/解锁的影响,极大提高性能;

  (4)每个子进程都有自己的地址空间和相关资源,总体能够达到的性能上限非常大;

   1.3 进程的劣势

       (1)逻辑控制复杂,需要和主程序交互;

  (2)需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算 多进程调度开销比较大。

(二)线程

  1.1线程的概念

       是程序执行流的最小单元。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

  1.2 线程的优势

     (1)无需跨进程边界;

  (2)程序逻辑和控制方式简单;

  (3)所有线程可以直接共享内存和变量等;

  (4)线程方式消耗的总资源比进程方式少。

  1.3 线程的劣势

     (1)每个线程与主程序共用地址空间,受限于2GB地址空间;

  (2)线程之间的同步和加锁控制比较麻烦;

  (3)一个线程的崩溃可能影响到整个程序的稳定性;

  (4)到达一定的线程数程度后,即使再增加CPU也无法提高性能;

  (5)线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。

(三)区别和联系

      (1) 资源分配&处理器调度:进程是资源分配的基本单位,线程是处理器调度的基本单位。

      (2) 地址空间:进程拥有独立的地址空间;线程没有独立的地址空间,同一进程内多个线程共享其资源;

      (3) 执行:每个线程都有一个程序运行的入口、顺序执行序列和程序的出口,但线程不能单独执行,必须组成进程,一个进程至少有一个主线程。简而言之,一个程序至少有一个进程,一个进程至少有一个线程。

    (4)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。

    (5)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。

   (6)处理机分给线程,即真正在处理机上运行的是线程。

   (7)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

     (8) 一个进程可以有多个线程,但至少有一个线程;而一个线程只能在一个进程的地址空间内活动。

     (9)资源分配给进程,同一个进程的所有线程共享该进程所有资源。

     (10)CPU分配给线程,即真正在处理器运行的是线程。

(四)比较和适用环境

                【linux操作系统】进程和线程_第1张图片

从上图中便可以反映进程与线程的使用环境:

    (1)需要频繁创建销毁的优先用线程

           这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的

    (2)需要进行大量计算的优先使用线程【cpu切换频繁】

            所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。这种原则最常见的是图像处理、算法处理。

   (3)强相关的处理用线程,弱相关的处理用进程

           什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。

          一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。

   (4)可能要扩展到多机分布的用进程,多核分布的用线程

   (5)都满足需求的情况下,用你最熟悉、最拿手的方式

参考文章:

https://blog.csdn.net/qq_25408423/article/details/81979072

 https://blog.csdn.net/u010183728/article/details/82428472

你可能感兴趣的:(linux)