进程与线程
简介
1、进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,简而言之就是程序的一次执行过程,也可以直接理解为电脑上的软件的运行情况,通过电脑的任务管理器可以直接查看到相应的进程,及如下图所示。
对进程的理解主要可以从定义、组成、组织方式、特征和通信方式四个方面入手,其具体分析情况如下所示。
操作系统中进程的五种基本状态及其转换过程如下所示。
新进程的创建需要先在内存中为新进程创建一个task_struct结构,再将父task_struct内容复制至新创建的task_struct结构中,进而为新进程分配新的内核堆栈、PID,并将新task_struct的node添加至链表之中,综上所示,创建新进程相当于“复制”原进程。而在操作系统中一般调用fork()函数实现进程创建,而fork均由do_fork实现,其简化流程如下。
例题(C语言):通过fork()创建两个子进程并实现输出,其中,父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。
2、线程
线程(Thread)是程序执行流的最小执行单位,是操作系统能够进行运算调度的最小单位,负责当前进程中程序的执行。一个进程至少有一个线程,而一个进程则可以存在多个线程,且多个线程之间可共享数据。
线程状态图如下所示。
线程的生命状态与周期的示意图如下所示。
优点
1、进程
- 进程具备顺序程序的封闭性和可再现性。
- 多道程序设计出现后实现了并发执行和资源共享。
- 在多道程序设计中,可通过增加CPU简单地实现扩充性能。
- 在多道程序设计中,可以尽量减少线程加锁或解锁的影响,从而提高性能。
- 在多道程序设计中,每个进程具备相互独立性,紫金城崩溃并不影响主程序的稳定性。
- 在多道程序设计中,每个子进程均存在2GB地址空间及相关资源,总体能到达的上限大。
2、线程
- 程序逻辑与控制方式简单。
- 线程方式消耗的总资源比进程方式少。
- 线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。
- 同一进程下的线程间共享数据空间,从而便捷了线程间的通信机制。
- 使多CPU系统更加有效。线程数少于COU数是不同线程可在不同CPU上运行。
缺点
1、进程
- 多进程调度开销过大。
- 进程间内存无法共享,且通讯复杂。
- 逻辑控制复杂,需要同主程序进行交互。
- 数据传输序跨越进程边界,仅适合少量数据传送或密集运算。
- 操作系统调度切换多个线程要比切换调度进程在速度上快的多。
2、线程
- 线程之间的同步和加锁控制比较麻烦。
- 一个线程的崩溃可能影响到整个程序的稳定性。
- 每个线程与主程序共用地址空间,受限于2GB地址空间。
- 调度时, 要保存线程状态,频繁调度, 需要占用大量的机时。
- 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。
关系
- CPU分配给线程,即真正在处理器运行的是线程。
- 资源分配给进程,同一个进程的所有线程共享该进程所有资源。
- 线程在执行过程中需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。
- 一个进程中可以存在多个线程,且至少有一个线程;而一个线程最多只能在一个进程的地址空间内活动。
注:进程是最基本的资源拥有单位和调度单位。
区别
- 根本区别:进程是操作系统资源分配的基本单位,而线程则是处理器任务调度和执行的基本单位。
- 内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
- 影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
- 包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;而线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
- 执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
- 资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会造成较大的开销;而线程则可以看做轻量级进程(Heavy—Weight Process),同一类线程共享代码和数据空间,每个线程均拥有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。