文章目录
- 一. 进程
- 什么是程序?什么是进程?
- 程序的并发性和并行性
- 进程诞生的原因
- PCB
- 二. 线程
- 什么是线程?
- 为什么引入线程?
- 三. 进程与线程的区别与联系
一. 进程
什么是程序?什么是进程?
程序:程序是一系列有序指令的集合,用于告诉计算机要执行何种操作及操作的先后顺序。这些指令包括进行各种计算、数据处理、输入输出等操作,用来完成特定的任务或解决特定的问题。
进程:进程从不同的角度可以有不同的定义。(1) 进程可以认为是程序的一次执行(2) 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配的基本单位。
程序 VS 进程:
- 进程是一个正在执行的程序,它有一定的生命周期,包括进程的创建、调度、销毁,具有动态性。
- 程序相当于一个可执行程序,是一组有序指令的集合,它存放在某种介质上,一个没有执行的程序本质上并不具有活动性,是静态的。
程序的并发性和并行性
程序的并行性是指两个或多个程序在同一时刻处于运行状态。如:在一条同向多车道的公路上,同一时刻可以有多辆车经过同一个地点。
程序的并发性是指两个或多个程序在同一时间间隔内发生。如:在一条单车道的公路上,若有多辆车想经过一个地点,只能按照一定的顺序依次通过。
进程诞生的原因
早期的操作系统都属于单核CPU,这意味着计算机在同一时刻只能同时运行一个程序,且只有一个程序运行结束后后面的程序才能依次执行。
为了解决多个程序需要并发执行的问题,操作系统引入了进程的概念,在操作系统中每个正在运行的程序都被抽象成“进程”的概念,每个创建的进程都有一个对应 进程控制块(PCB process control block),PCB中含有一些特定的属性,当一个进程在运行过程中出现了优先级更高的进程,则当前程序所有运行的状态都通过PCB进行保存,等到进程下次执行就会恢复原先在状态,以此实现对多个进程的调度。
由于操作系统对进程调度的速度很快,多个进程在一段小的时间间隔内被调度了非常多次,因此在宏观上属于“并行执行”;而在微观的角度上,单核CPU的计算机在一个时刻只能运行一个进程 ,多个进程是依次进行执行的,因此在微观上属于“并发执行”。
PCB
前面说到了每个进程都有一个PCB,用于描述一个进程,因此PCB本质上就代表了一个进程,它相当于C语言中的结构体或Java中的类,PCB中主要的属性如下:
- pid:进程的身份标识,每个进程在同一时刻都有一个唯一pid;一个应用程序的执行可能包含多个进程,即有多个pid。
- 一组内存指针:描述了一个进程所分配的内存空间在哪些位置,每一块内存空间具体的作用:如存储程序执行的二进制指令和执行指令所需的数据、程序执行产生的临时数据等。
- 文件描述符表:描述了一个进程所持有的硬盘资源,由于数据在硬盘上以文件的形式来表示和操作,因此文件描述符表描述了进程关联了哪些文件,能够操作你想想文件。
- 进程状态:描述了一个进程当前的状态,如运行状态、就绪状态、阻塞等待状态等。
- 进程优先级:决定了进程执行的先后顺序。
- 上下文:保存进程当前运行的状态,以便后续的恢复和执行。
- 记账信息:记录了当前进程执行的时间、占用的CUP情况,作为操作系统调度的依据,避免因为一个进程优先级过低而出现线程“饿死”的情况。
二. 线程
什么是线程?
线程是一个比进程更小的基本单位,一个进程可以有多个线程,而一个线程只能存在于一个进程当中。线程是系统调度的基本单位,也称作“轻量级进程”。
为什么引入线程?
这里先说结论:
- 创建进程的系统开销比线程大。
- 销毁进程消耗的时间比线程多。
- 调度进程的时间开销比线程大。
进程相比于线程的劣势:
- 一个应用程序的执行可能需要创建多个进程,这多个进程间有时需要进行数据的交换和进程的切换以共同完成某个功能,由于每个进程都拥有各自的PCB,即拥有各自独立的内存空间、硬件资源、文件描述符表等,因此如果频繁地对进程调度会产生大量的时间开销。
- 如果在一段时间内,系统上有较多的应用程序需要同时运行,操作系统就需要在剩余资源中寻找合适大小的位置并分配;进程结束时再分别进行回收,因此效率较低。
引入线程的优势:
- 一个进程创建时可以预先申请一块较大且合适的资源,进程创建时至少拥有一个线程,当需要完成某个功能时,可以在进程中分配已有资源,直接创建新的线程,其中每个线程拥有各自PCB,包括状态、优先级、上下文等。当系统进行调度时,不需要切换进程,只需在当前进程保存线程的部分信息,因此大大提高了系统调度的效率。
- 线程间共用进程的内存空间和硬件资源等,创建线程时不需要重新申请,因此创建/销毁的效率更高。
三. 进程与线程的区别与联系
概念上:进程是系统资源分配的基本单位,线程是系统调度的基本单位。
包含关系:一个进程可以包含多个线程,而一个线程只能从属于一个进程。
拥有资源:每个进程拥有独立的内存空间和其他资源,而多个线程共享进程内的资源。
独立性:每个进程拥有独立的资源,因此多个进程间的信息不能被直接访问,进程间的运行一般不会相互影响;线程共享进程的资源,多个线程可能因为资源的争抢产生死锁等问题。
上下文切换:进程间拥有独立的资源,因为进程间切换需要保存和加载上下文信息,因此系统开销较大;线程共享进程的内存和资源,因此线程间切换开销较小。
以上就是本篇文章的全部内容了,如果这篇文章对你有些许帮助,你的点赞、收藏和评论就是对我最大的支持。
另外,文章可能存在许多不足之处,也希望你可以给我一点小小的建议,我会努力检查并改进。