一、进程与线程
1、进程
1.1、定义
操作系统中最核心的概念就是进程,进程是对正在运行中的程序的一个抽象,是系统进行资源分配和调度的基本单位。进程是一种抽象的概念,一般由程序、数据集合和进程控制块三部分组成,如下:
- 程序用于描述进程要完成的功能,是控制进程执行的指令集
- 数据集合是程序在执行时所需要的数据和工作区
- 程序控制块,包含进程的描述信息和控制信息,是进程存在的唯一标志
1.2、进程间通信方式
据进程通信时信息量大小的不同,可以将进程通信划分为两大类型,如下:
- 低级通信: 控制信息的通信(主要用于进程之间的同步,互斥等控制信息的传递)
- 高级通信: 大批数据信息的通信(主要用于进程间数据块数据的交换和共享,常见的高级通信有管道,消息队列,共享内存等)
进程间的通信方式,有下面几种:
- 管道通信:管道通常指无名管道,是一种半双工的通信方式,数据只能单向流动。当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开
- 消息队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列,存放在内核中并由消息队列标识符(即队列ID)标识
- 共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问
- 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问
2、线程
2.1、定义
线程(thread)是操作系统能够进行运算调度的最小单位,其是进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,这些线程共享同一块内存,线程之间可以共享对象、资源,如果有冲突或需要协同,还可以随时沟通以解决冲突或保持同步。
2.2、线程间通信方式
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制,下面是常用的线程通信机制,如下:
- 锁机制:通过锁实现线程同步
- 信号量机制:线程的信号和进程的信号量类似,使用线程的信号量可以高效地完成基于线程的资源计数
2.3、线程同步
实现线程同步的方式有很多种,最常见的就是使用锁机制实现线程同步,线程同步的最终目标是实现对共享资源的安全访问。
3、进程与线程的区别
进程是资源分配的最小单位,线程是CPU调度的最小单位,进程与线程的区别,如下:
进程 | 线程 | |
---|---|---|
概念 | 进程是对正在运行中的程序的一个抽象,是系统进行资源分配和调度的基本单位 | 线程(thread)是操作系统能够进行运算调度的最小单位,其是进程中的一个执行任务(控制单元),负责当前进程中程序的执行 |
内存分配 | 系统在运行的时候会为每个进程分配不同的内存空间 | 系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享进程资源 |
切换开销 | 每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销 | 线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小 |
包含关系 | 一个进程可以包含多个线程 | 轻量级进程 |