进程与线程的区别、关系
- 定义
- 关系
- 比较
- 对于系统调度来说:
- 从拥有资源来说:
- 并发性
- 上下文:
- 系统开销
- 使用多线程的主要目的:
定义
进程:进程是程序执行的实例,包括程序计数器和寄存器和变量的当前值
进程依赖于程序存在
线程:每个进程都拥有自己的数据段、代码段和堆栈的,这就造成了进程在创建、切换、撤销操作时,需要较大的系统开销。为了减小系统开销,从进程中演化出了线程
关系
1、线程存在于进程中,共享进程的资源、
2、线程是进程的一部分,一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程
比较
传统意义上的进程被称为重量级进程HWP,heavyweight process,从现代角度看,就是只拥有一个线程的进程。
线程习惯上被叫为轻量级进程或者迷你进程 LWP,lightweight process
对于系统调度来说:
也是本质区别
进程是系统中程序执行和资源分配的基本单位。
线程时CPU调度和分派的基本单位。
从拥有资源来说:
进程是拥有系统资源的一个独立单位,它可以拥有自己的资源。
线程一般不用有资源,除了不可少的程序计数器,但他可以去访问其所属进程的资源,如进程代码段、数据段以及系统资源。
并发性
提到并发性,不得不讲一下并行与并发的区别:
我们知道一个CPU内核只能在一个瞬间处理一个任务。
但在我们日常使用电脑时,会觉得哪怕单核的计算机也能同时做很多事情啊。那唯一的CPU是如何保证两个进程同时进行的呢?
就要提出时间片轮转的概念了,这个可能学习单片机的同学在操作系统中会听到过时间片的概念。
2 并行与并发
上面的例子提到了并发与并行,这里更精准地阐述一下。
一个基本的事实前提:一个CPU在一个瞬间只能处理一个任务。但为什么在我们人类视角,哪怕是单核心计算机也能同时做很多事情,比如同时听音乐和浏览网页,作为整个系统唯一可以完成计算任务的 CPU 是如何保证两个进程“同时进行”的呢?时间片轮转调度!
在操作系统中,每个进程会被操作系统分配一个时间片,即每次被 CPU 选中来执行当前进程所用的时间。时间一到,无论进程是否运行结束,操作系统都会强制将 CPU 这个资源转到另一个进程去执行。
CPU一会处理一个进程一会处理另外一个进程,可能大家觉得不对,但是cpu的执行速度已经快到让人么你感觉不到这种切换的顿挫感,就好像两个进程真的在并行运行哦
不仅进程间可以并发执行,在一个进程中的多个线程之间也可以并发执行。
上下文:
所谓的进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它 需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行
系统开销
系统开销通常体现在进程、线程创建 、调度、消亡过程中。
同一个进程中的多个进程可以共享同一地址空间,因此它们之间的同步和通信的实现也变得容易。
进程切换时,涉及到当前进程CPU环境的保存以及心被调度的运行进程的CPU环境的设置;
而线程切换只需要保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作,从而能更有效地使用系统资源和提高系统的吞吐量。
使用多线程的主要目的:
1.多任务程序的设计
一个程序可能要处理不同的应用,要处理多种任务,如果开发不同的进程来处理,系统开销很大,是数据共享,程序结构都不方便,这时候可以使用多线程编程方法。
2.并发程序设计
3. 网络程序设计
4. 数据共享
5. 多CPU系统中实现真正的并行。