目录
进程
为什么会有进程?
早期操作系统只支持跑一个程序,但随着计算机发展,操作系统中CPU越来越强,内存越来越大,可以在内存里放入更多的可运行程序,但是如果直接用 “程序” 来表示操作系统中正在运行的进程有些不合适,因为有个能一个程序执行多份,多个程序实例该怎么表示,于是产生了进程的概念。
早期的操作系统会考虑多个程序的数据如何进行辨别?多个程序的一个程序暂停后,之后如何恢复到暂停前的状态?考虑到这些问题,进程应运而生。
进程和程序之间的关系
可能程序和进程之间会有些混淆,所以来研究一下二者的关系
- 进程是动态执行的一个过程,程序是一段静态的代码
- 程序是创建进程的基础,进程的功能都在程序中有具体描述
- 每次程序运行构成的是不同的进程
- 在调用上一个进程可包含多个程序(是指有的进程需要别的进程为它提供服务)
- 进程有核心态和用户态
什么是进程?
进程是资源分配的基本单位。
进程(Process)是计算机中的具有特定功能的程序关于某数据集合上的一次动态执行过程,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
进程独占内存空间,保存各自运行状态,相互间不干扰且可以互相切换。
下图比较直观, 4 个程序创建 4 个进程,4 个进程可以并发地执行。
若是想更直观的话,看下图一个个正在运行的程序可以把它看成是一个进程,进程就是一个程序在整个过程中的描述,它会消耗我们操作系统的一些资源比如说 内存、IO、CPU、网络。
进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。
所有与进程相关的资源,都被记录在PCB中。
进程包含什么?
- 程序的代码和其处理的数据
- 程序计数器中的值和下一条将运行的指令
- 一些寄存器的当前值,堆、栈
- 一些系统资源(像打开的文件)
所以如上面所说进程描述一个正在运行的程序的所有状态信息
进程的特点
- 并发性
- 动态性(动态的创建和销毁进程)
- 独立性(不同的进程之间工作互不影响)
- 制约性(进程间同步产生制约)
线程
为什么会有线程?
虽然进程的出现解决了并发问题,但随着发展,人们对实时性的要求越来越大,如果一个进程有很多个子任务要完成,他只能一个个的执行这些子任务,可能子任务之前不存在相互的依赖,那么其实他们是可以一起执行的,于是人们就发明了线程(维护进程开销较大),让一个线程去执行一个子任务使实时性提升,而不需要进程间的切换,不需要切换页目录使用新的地址空间,线程间的切换更快速。
什么是线程?
线程是CPU调度的基本单位。它被包含在进程之中,是进程中的实际运作单位。
一个进程中可以有多个线程,它们共享进程资源。
如:浏览器是个进程,浏览器进程里有很多线程,例如 HTTP 请求线程、渲染线程等等,线程的并发执行使用户在通过浏览器发起请求时,浏览器还可以响应用户的其它事件。
线程共享进程的内存资源,相互间切换更迅速,支持更细粒度的任务控制,让进程内的子任务可以并发执行。
线程的优缺点
线程的优点
- 进程中可以同时存在多个线程
- 各个线程之间可以并发执行
- 各个线程之间共享地址空间和一些资源
线程的缺点
- 一个线程崩溃,导致所在进程的所有线程崩溃(资源共享,如一个线程把进程中的 数据破坏了,其他线程也需要这个数据,其他线程也会出现崩溃现象,安全得不到保障)
线程包含什么?
进程和线程的区别
- 进程可以看做独立应用,线程不能
- 资源:进程是资源分配的基本单位,线程共享所属进程的资源。进程有独立的地址空间,互不影响,线程只是进程的不同执行路径,某个线程挂了其所在的进程也会挂掉(所以多进程程序会比多线程程序更加健壮)。线程没有独立的地址空间。
- 通信方面:线程间可以通过直接共享同一进程中的资源,而进程通信需要借助 进程间通信。
- 调度:进程切换比线程切换的开销要大。线程是CPU调度的基本单位,线程的切换不会引起进程切换,但某个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
- 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存、I/O 等,其开销远大于创建或撤销线程时的开销。同理,在进行进程切换时,涉及当前执行进程 CPU 环境还有各种各样状态的保存及新调度进程状态的设置,而线程切换时只需保存和设置少量寄存器内容,开销较小。
以上是对进程和线程区别的粗浅认识,转载请注明出处