一篇了解进程与线程

42 阅读4分钟

1.前言

在计算机中,CPU是最核心的一个硬件资源,相当于我们人类的大脑一样,用来处理所有复杂的计算任务。而在运行程序时,我们处理某些运行时的数据,需要临时保存,这时候就需要用到内存来存储这些。但是存在内存中的数据毕竟是临时的,这时候我们需要把一些关键性的数据存储到外存(磁盘)中,这样以后可以随时查看了,而这些计算任务的调度,资源的分配,是由操作系统来统领的,我们打开的每一个应用程序,都是以进程的形式,运行于操作系统之上。

2.提升程序的运行速度

从前言中我们了解到一个程序简单的调度过程,我们发现,影响一个程序的速度主要有这三大方面:

1. CPU(计算能力强不强)

2. 内存(足够大的内存能够存储临时计算数据)

3. IO (能快速把数据持久化到磁盘上)

但是这三者之间的处理速度上,却有着十分大的差异,总体来说 CPU > 内存 >> IO,我们可以看出,IO的处理速度是最慢的,这也是影响一段程序速度的最主要的一块,在无数代先辈的努力下,这三者都在不断的发展:

1. CPU增加了高速缓存,平衡了和内存之间的速度差异,从早期的单核升级到如今的多核,极大提升了CPU的计算能力

2. 内存容量不断扩大,能够让计算机运行更多的程序

3. 操作系统从进程中,又诞生了更轻量级的线程,(乃止后面的超线程)为了能够分时复用CPU,平衡了CPU与IO之间的速度差异,硬件上存储设备诞生了固态硬盘等,让IO的性能有了明显的提升。

在这里我们主要来介绍进程到线程这段的发展

3. 从进程到线程

由于早期的CPU是单核的,但是用户却也能运行多个程序,这是怎么实现的?原来是因为早期的操作系统以“多进程”的形式运行程序。操作系统让每个进程占用一段时间CPU的使用权,当这段时间消耗完后,操作系统会重新选择一个进程,让它获取CPU的执行权,而这个切换过程通常为毫秒级别,对于用户来说完全感知不到这个任务切换,从而实现了同时运行多个程序。进程占用CPU处理任务的这段时间,我们称之为时间片

但当某个进程在占用CPU时间片内,需要进行耗时很长的IO操作,为了提高CPU的利用率,这时候进程会让出CPU的时间片,让其他进程获取CPU时间片来执行任务,等自己完成IO操作,将数据读取到内存后,就可以重新获取CPU的时间片。

每个进程都有自己独立的内存空间,多个进程之间不共享彼此的数据,但是多个进程之间的任务切换存在比较大的开销,为了进一步的提高并发性能和CPU的利用率,进程内部诞生了线程,线程是进程内的一个执行单元,一个进程可以包含多个线程。相比于进程,线程之间的切换和通信成本更低。线程共享进程的内存空间和系统资源,这使得线程之间的数据交换更加容易。

线程是指“进程代码段”的一次顺序执行流程。线程是CPU调度的最小单位。一个进程可以有一个或多个线程,各个线程之间共享进程的内存空间、系统资源,进程仍然是操作系统资源分配的最小单位。

对于Java来说,Java代码都运行在JVM(Java虚拟机)之中,每当运行一个Java程序,就会启动一个JVM进程,在JVM内部,所有代码以线程来运行,在这个JVM进程中,起码会存在两个线程,一个是main线程,而另一个是GC垃圾回收线程。当程序运行完后,JVM进程也就结束了。

4. 进程与线程的区别

  • 一个进程由一个或多个线程组成
  • 线程是CPU调度的最小单位,进程是操作系统分配资源的最小单位。线程的划分尺度小于进程。
  • 创建和终止进程的开销通常较大,因为操作系统需要为进程分配独立的内存空间和系统资源。相比之下,创建和终止线程的开销较小,因为线程共享进程的资源。
  • 操作系统在进行任务调度时,会为每个进程分配时间片。而线程作为进程内的执行单元,由进程来进行调度。在多核处理器系统中,多线程技术可以实现真正的并行执行,进一步提高系统性能。