进程和线程的对比和区别

一、什么是进程,什么是线程?

1.1 进程

  • 进程中包括有多个线程,进程与进程之间是相对比较独立的。
  • 进程中有一个逻辑内存,每个进程都会有分配到一个独立的内存空间,还分配了一个文件/网络句柄,
  • 句柄类似一个标识符,所有的进程所或多或少都有一定的句柄数的引用,句柄实际上是一个指针,指向一块包含具体信息数据的内存,所以句柄是当你要访问该进程时取得的,使用完必须释放。(打个比方,我要使用redis需要打开6379端口,这个时候需要访问句柄,获取到内存地址去访问获取对应的资源来执行该进程)
  • 一个进程可以拥有多个句柄数目,但是只有一个进程ID
  • 进程不同时刻所引用的句柄数目是不一定的

    进程结构

1.2 线程

  • 线程中有一个栈内存(很多人把它称为堆栈),主要用来存储局部变量资源或者内存地址
  • 还有一个PC块,主要是存储下一条执行指令的地址,PC是指向一块共同的内存(进程里面的被系统分配到的逻辑内存)。
  • TCS :ThreadLocalStorage 主要存储线程自己定义的变量,不想和其他线程进行共享,理解为线程的私有变量。
  • 线程共享进程的资源主要有:进程代码块、进程的全局和静态变量、进程打开的文件描述符、信号的处理器、进程当前的目录、进程ID、进程组ID

二、进程和线程的区别

  • 进程是程序资源分配的最小单位,线程是程序执行的最小单位。
  • 进程有自己的内存地址空间,线程包含在进程的地址空间中。
  • 相对于进程与进程之间线程之间通信方式比较方便,线程能共享进程分配到的逻辑内存的资源。也就是说,同一进程下的线程共享全局变量、静态变量等数据,具体共享的内容1.2中介绍线程已经说明。
  • 进程的分配开销比线程大,但是进程的健壮性比线程高,因为进程间不会互相影响,线程一个挂掉了可能会造成进程崩溃。
  • 也可以这么说,线程是程序执行的单位,进程只是存放线程的容器,容器会提供线程执行的资源。

三、进程和进程之间的通信方式

因为进程与进程之间是相互独立的,所以关于进程之间的通信数据共享复杂,需要用IPC;数据是分开的,同步简单,但是占用内存多,切换复杂,CPU利用率低。

IPC的方式通常有:管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等

3.1 管道

管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。

3.1.1 管道的特点

  • 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
  • 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
  • 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中

3.1.2 原型结构

当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。如下图:要关闭管道只需将这两个文件描述符关闭即可。

管道原型

3.13 示例

单个进程中的管道几乎没有任何用处。所以,通常调用 pipe 的进程接着调用 fork,这样就创建了父进程与子进程之间的 IPC 通道。如下图所示:

示例

若要数据流从父进程流向子进程,则关闭父进程的读端(fd[0])与子进程的写端(fd[1]);反之,则可以使数据流从子进程流向父进程。

3.2 有名管道FIFO

FIFO,也称为命名管道,它是一种文件类型。

3.2.1 特点

  • 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
  • FIFO可以在无关的进程之间交换数据,与无名管道不同。
  • FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中

3.2.2 介绍

FIFO的通信方式类似于在进程中使用文件来传输数据,只不过FIFO类型文件同时具有管道的特性。在数据读出时,FIFO管道中同时清除数据,并且“先进先出”。

3.3 消息队列

消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。用户进程可以向消息队列添加消息,也可以向消息队列读取消息。

3.3.1 特点

  • 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级
  • 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除,所以另一个进程读写的时候要判断前进程是否已经读完数据。
  • 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的指定类型读取

3.4 信号量

信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

3.4.1 特点

  • 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存
  • 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作
  • 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数
  • 支持信号量组。

3.5 共享内存

共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。

3.5.1 特点

  • 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
  • 因为多个进程可以同时操作,所以需要进行同步。
  • 信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

3.6 五种通信方式的对比

1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。

四、线程与线程之间的通信(多线程)

4.1 同步

4.2 wait和notify/notifyAll机制

4.3 while轮询的方式

4.4 管道通信

4.5 Semaphore 信号量

作者:浅蓝色的麻吉
链接:https://www.jianshu.com/p/00bd894ff86c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/sandea/p/11777416.html

时间: 2024-11-09 10:05:44

进程和线程的对比和区别的相关文章

进程、线程和协程区别

进程.线程和协程区别 1. 进程 进程是系统资源分配的最小单位, 系统由一个个进程(程序)组成一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stack region). 文本区域存储处理器执行的代码 数据区域存储变量和进程执行期间使用的动态分配的内存: 堆栈区域存储着活动过程调用的指令和本地变量. 因此进程的创建和销毁都是相对于系统资源,所以是一种比较昂贵的操作. 进程有三个状态: 等待态:等待某个事件的完成: 就绪态:等待系统分配处理器以便运行:

进程和线程的概念,区别(理论知识)

进程和线程的概念,区别: 什么是线程????首先,计算机所有指令的执行都是CPU运算,CPU有规则,线程是操作系统能调度的最小单位线程可以简单理解为一堆指令做每一件事背后都是CPU在运算,例如画图.qq这些应用软件寄生在操作系统上画图和qq是独立的软件,各自分一块独立的内存空间硬盘--内存--CPU 慢--快为了安全,画图软件的内存不能访问qq的内存但是,qq或画图有一个整体的东西暴露给操作系统,这个整体的东西就是进程,里面包含对各种资源的调用例如内存的管理,网卡的调用等,对各种资源管理的集合称

程序、进程、线程的联系与区别

程序:一组指令的有效集合 进程:程序的执行就是进程.也可以把进程看成一个独立的程序,在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代码只属于自己.进程是资源分配的基本单位,也是调度运行的基本单位. 线程:线程被人们认为是轻量级的进程,它是进程中单独运行的一路程序.换句话说,就是一个进程可以包含多个线程,并且至少有一个主线程,同时同一进程的线程共享该进程的代码和数据.于此同时,每一个线程又都有自己的堆栈,这些堆栈对于线程来说是私有的.线程是处理机调度的基本单位. 那为什么要引入线程呢

程序、任务、进程和线程的联系与区别

概念: 程序(program)只是一组指令的有序集合. 任务(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动.一个任务既可以是一个进程,也可以是一个线程.简而言之,它指的是一系列共同达到某一目的的操作.例如,读取数据并将数据放入内存中.这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现. 进程(process)常常被定义为程序的执行.可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间.一个进程所拥有的数据和变量只属于它自己. 进

进程和线程的关系和区别

进程和线程的关系:(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程.(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源.(3)处理机分给线程,即真正在处理机上运行的是线程.(4)线程在执行过程中,需要协作同步.不同进程的线程间要利用消息通信的办法实现同步.线程是指进程内的一个执行单元,也是进程内的可调度实体.线程与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可

进程和线程的定义、区别与联系

一.进程 进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令.数据和堆栈等组成的,是一个能独立运行的活动实体. 注意,进程一般有三个状态:就绪状态.执行状态和等待状态[或称阻塞状态]:进程只能由父进程建立,系统中所有的进程形成一种进程树的层次体系:挂起命令可由进程自己和其他进程发出,但是解除挂起命令只能由其他进程发出. 进程控制块(PCB):PCB不但可以记录进程的属性信息,以便操作系统对进程进行控制和管理,而且PCB标志着进程的存在,操作系统根据系统中是否有该进程的进程控制

全面理解进程和线程的概念、区别和联系

进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂. 进程与线程的一个简单解释 在这个简单易懂的类比下,了解一下进程和线程的宏观概念: 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位.每一个进程都有一个自己的地址空间,即进程空间或(虚空间).进程空间的大小 只与处理机的位数有关,一个 16 位长处理机的进程空间大小为 216

进程与线程的联系与区别

进程:进程是系统进行资源分配和调度的一个独立单位. 线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 进程与进程区别: (1)一个程序至少有一个进程:一个进程至少有一个线程; (2)进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源,每个线程拥有自己独立的寄存器和栈. (3)一个进程死掉,不影响其他进程的执行:一个线程死掉那么它所属的进程就死掉了. (4)进程是资源调度的基本单位:线程是处理器调度的基本单位. (5)虽然两者都可并发执行,但线程

CPU进程与线程的关系和区别

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 进程和线程的关系: (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程. (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源. (3)处理机分给线程,即真正在处理机上运行的是线程. (4)线程在执行过程中,需要协作同步.不同进程的线程间要利用消息通信的办法实现同步.