zoukankan      html  css  js  c++  java
  • Linux下进程与线程的区别

    (多)进程

    进程是程序在计算机上的一次执行活动,即正在运行中的应用程序,通常称为进程。当你运行一个程序,你就启动了一个进程。每个进程都有自己独立的地址空间(内存空间),每当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在这个独立的内存空间中运行。
    进程一般由程序数据集合进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。
    进程具有的特征:
    动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
    并发性:任何进程都可以同其他进程一起并发执行;
    独立性:进程是系统进行资源分配和调度的一个独立单位;
    结构性:进程由程序、数据和进程控制块三部分组成。

    在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多进程,也称多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。

    多进程编程时,子进程除代码段与父进程共享外,其余部分完全是父进程的一个副本,子进程的所以资源都继承父进程,也就是说二者不共享地址空间。两个是单独的空间,继承以后就没有交集了,子进程单独运行(采用写时复制技术)。

    多进程优点:

    1. 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
    2. 通过增加CPU,就可以容易扩充性能;
    3. 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
    4. 每个子进程都有4GB地址空间和相关资源,总体能够达到的性能上限非常大。

    多进程缺点:

    1. 逻辑控制复杂,需要和主程序交互;
    2. 需要跨进程边界,如果有数据量传送,需要通过各种IPC处理。
    3. 密集运算多进程调度开销比较大;

    最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题

    (多)线程

    线程是进程的一条执行路径,线程在Unix系统下,通常被称为轻量级的进程。
    线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
    一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。

    多线程编程时,线程运行在进程当中,多线程共享进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但在同一进程的多个线程中,有各自的调用栈、寄存器环境(register context)、本地存储(thread-local storage)。并且在一个子线程出错或者退出时,一定不能调用return(exit),因为会导致进程结束,应调用pthread_exit()退出线程。

    多线程优点:

    1. 无需跨进程边界;
    2. 程序逻辑和控制方式简单;
    3. 所有线程可以直接共享内存和变量等;
    4. 线程方式消耗的总资源比进程方式好;

    多线程缺点:

    1. 每个线程与主程序共用地址空间,受限于4GB地址空间;
    2. 线程之间的同步和加锁控制比较麻烦;
    3. 一个线程的崩溃影响到整个程序的稳定性;
    4. 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如在Linux环境下,每个线程私有空间大约是2M,因此运行1500个左右的线程数就已经极限了(当然线程的私用空间大小可以改变);
    5. 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。

    用一张表格说明它们区别

    在这里插入图片描述

    参考:
    https://blog.csdn.net/luoweifu/article/details/46595285

    https://blog.csdn.net/ljlstart/article/details/51092846

    https://www.php.cn/faq/416853.html

  • 相关阅读:
    现代操作系统:原理与实现配套实验ChCorelab02
    损失函数:交叉熵
    什么是 AWS IoT Greengrass?
    softmax与sigmoid的关系&最大熵与极大似然估计的关系
    AWS IoT Greengrass:连接器入门
    损失函数:最小二乘法与极大似然估计法
    AWS IoT Greengrass:将密钥部署到核心
    奇异值分解(SVD)
    积性函数前缀和个人总结
    AWS IoT Greengrass:核心软件的 OTA 更新
  • 原文地址:https://www.cnblogs.com/Tavi/p/12514017.html
Copyright © 2011-2022 走看看