浅谈进程和多线程

浅谈进程和线程

1.操作系统发展

说起进程,首先要讲一下操作系统

在计算机发明之前,人们处理大量的计算是通过人工处理的,耗费人力,成本很大而且错误较多。为了处理大量的数学计算问题,人们发明了计算机。最初的计算机只能接受一些特定的指令,用户输入一个指令,计算机就做出一个操作。当用户在思考或者输入时,计算机就在等待。显然这样效率低下,在很多时候,计算机都处在等待状态。

提高效率-批处理操作系统

那么能不能把一系列需要操作的指令写下来,形成一个清单,一次性交给计算机,计算机通过不断读取指令进行相应的操作?就这样,批处理操作系统诞生了。用户将多个需要执行的程序写在磁盘上,然后交由计算机去读取并逐个执行这些程序,并将输出结果写在另一个磁盘上。

虽然批处理操作系统的诞生提高了任务处理的便捷性,但是仍然存在一个很大的问题

假如有两个任务A和B,需要读取大量的数据输入(I/O操作),而其实CPU只能处在等待状态,等任务A读取完数据才能继续进行,这样就白白浪费了CPU资源。于是人们就想,能否在任务A读取数据的过程中,让任务B去执行,当任务A读取完数据之后,暂停任务B,让任务A继续执行?
这时候又出现了几个问题:内存中始终都只有一个程序在运行,而想要解决上述问题,必然要在内存中装入多个程序,如何处理呢?多个程序使用的数据如何辨别?当一个程序暂停后,随后怎么恢复到它之前执行的状态呢?

进程的发明:

程序的一次运行产生进程。

这时候,人们就发明了进程,用进程来对应一个程序,每个进程来对应一定的内存地址空间,并且只能使用它自己的内存空间,各个进程之间互不干扰。进程同时也保存了程序每个时刻的运行状态,为进程切换提供了可能。当进程暂停时,它会保存当前进程的状态(进程标识,进程使用的资源等),在下一次切换回来时根据之前保存的状态进行恢复,接着继续执行。

现代操作系统是单进程还是多进程? 多进程

2.并发的概念

能够让操作系统从宏观上看起来同一时间段执行多个任务。 换句话说,进程让操作体统的并发成为了可能

虽然并发从宏观上看有多个任务在执行,但在事实上,对于单核CPU来说,任意具体时刻都只有一个任务在占用CPU资源。

操作系统一般通过CPU时间片轮转实现并发

thread

思考1 : 现代操作系统进行之间是并行还是并发?

​ 并行: 进程同时进行,需要多个cpu支持。

思考2:进程解决了什么问题?

  • CPU利用率得到很大提高

3.为什么会出现线程

实时性要求:

出现了进程之后,操作系统的性能得到了大大的提升。虽然进程的出现解决了操作系统的并发问题,但是人们不满足,逐渐对实时性有了要求。因为一个进程在一个时间段内只能做一个事情,如果一个进程有多个子任务时,只能逐个执行这些子任务,很影响效率。

举例:

对于监控系统这个进程来说:不仅要与服务器端进行通信获取图像数据并将图像信息显示在画面上,还要处理与用户的交互操作。如果在一个时刻该系统正在与服务器通信获取图像数据,而用户在监控系统上点击了一个按钮,那么系统只能等获取完图像后才能与用户进行交互操作。如果获取图像需要10s,用户就得等待10s。显然这样的系统,无法满足人们的需求。

线程的发明:

那个能不能将这些子任务分开执行呢?即那个时刻系统正在与服务器通信获取图像数据,而用户在监控系统上点击了一个按钮,那么系统先暂停获取图像后,先与用户进行交互操作(用户操作一般执行时间很短),再继续获取图像。
为了处理这种情况,人们发明了线程,让一个线程执行一个子任务,这样一个进程就包含了多个线程,每个线程负责一个单独的子任务。在用户点击按钮的时候,可以暂停获取图像数据的线程,让出CPU资源,让UI线程获取CPU资源,响应用户的操作,响应完后再切换回来,获取图像数据的线程重新获取CPU资源。让用户感觉系统在同时做很多事,满足用户对实时性的要求。

换句话说:进程让操作系统的并发性成为了可能,而线程让进程的内部并发成为了可能。

案例 :

上课可以看做一个进程。

无子任务(无线程)【1】老师上课 --->老师想喝水---->学生必须等待--->老师回来继续上课。

有子任务 (有线程) 【2】 老师上课--->老师继续讲课---->老师还继续讲课

​ | |

​ ---> A同学接水

注意:一个进程包含多个线程,但是这些线程共享进程占用的内存地址空间和资源。进程是操作系统进行资源分配的基本单位(进程之间互不干扰),而线程是操作系统进行调度的基本单位(线程间互相切换)。

4.进程和线程区别

一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。

最大的区别是:是否单独占有内存地址空间
(共享,同步,可靠性,开销)

1.进程单独占有一定的内存地址空间,所以进程间存在内存隔离,数据是分开的,数据共享复杂但是同步简单,各个进程之间互不干扰;而线程共享所属进程占有的内存地址空间和资源,数据共享简单,但是同步复杂。
2.进程单独占有一定的内存地址空间,一个进程出现问题不会影响其他进程,不影响主程序的稳定性,可靠性高;一个线程崩溃可能影响整个程序的稳定性,可靠性较低。
3.进程单独占有一定的内存地址空间,进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及页调度,开销较大;线程只需要保存寄存器和栈信息,开销较小。

进程是操作系统进行资源分配的基本单位(进程之间互不干扰),而线程是操作系统进行调度的基本单位(线程间互相切换)。

5.多进程和多线程

有人提出为什么监控系统要用一个进程实现(多线程)而不是多进程实现呢?
答:多进程也可以实现,但是进程通信没有线程通信简单,想让里面的多线程共享资源(图像数据),所以整成了一个进程。

进程可靠性高但是开销大,线程开销小但是可靠性低。根据不同情况选择不同模型。在需要并发处理并且需要共享一些变量的情况下,选择多线程。其他情况下,进程健壮性更好。

猜你喜欢

转载自www.cnblogs.com/clown123456/p/11695045.html