携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 05 天,点击查看活动详情 >>
这一小节,咱主要讲解进程和线程的相关知识。
本节的目标主要有两个:
- 第一,了解进程、线程的相关些概念
- 第二,了解计算机资源分配和调度的一些相关知识
进程
其实,进程和线程,是我们特别容易混淆的两个概念。他俩也是咱 Java 研发技术面试时必问的一个问题,比如进程和线程有什么区别?它们之间有哪些联系?等等。
首先,我们先来看看进程,它比较简单,它是指一个正在运行的程序的实例。
咱们可以把系统的资源管理器打开(windows 系统),调整到任务管理器的模式,就可以看到详细信息里面的每一个 exe 的程序,其实就是一个进程。包括你打开了一个 Word 或者 PPT,或者你登录的微信或者 QQ,它都是一个进程。
线程
进程我们了解了,那线程又是啥呢?我们来探讨下线程的由来,主要出于以下几个原因:
第一,由于运行的进程越来越多,导致进程在创建、撤销、切换时需要较大的性能开销,急需一种更轻量级的进程技术来优化、减少性能开销;
比如,我们打开一个 Word 文档,可以编辑、保存等等,但如果它突然就崩溃了,那就需要把它整个关闭,然后再重新打开它。这样的一个过程,实际上会导致特别大的耗时,再如果你的电脑性能不是很强的话,打开一个 Word 可能都要半分钟的时间。
所以呢,就特别需要一种更牛的进程技术,来减小这个过程所带来的性能开销,比如 SMP。
第二,SMP(Symmetrical Multi-Processing)的对称多处理技术,就是我们所知的线程、多线程概念;
第三,在计算机中把进程作为资源管理分配的最小的单位,每个进程都有一个完整虚拟地址空间。
比如,当你打开微信时,计算机就会为微信程序分配一个独立的内存空间。线程它隶属于某一个进程,与进程内的其他线程一起共享这片地址空间,且可以利用进程所拥有的资源,无需再调用新的资源,所以对它的调度所付出的性能开销,明显更少。
由于一个进程,它可以包含多个线程,当某一个线程出现问题导致崩溃的时候,并不会对同一个进程有特别大的影响。由于把任务分得比较细,每一个任务进行调度、切换等等的时候,开销相对就比较少了。
了解了基本概念,我们来看一个简单的例子。
我们在电脑上登录了 QQ 之后,就相当于启动了一个进程,咱在使用 QQ 的过程中,会去聊天打字、截图、传输文件等等,还有在你和朋友聊天时,QQ 它界面的信息是一直在刷新的,看看有没有新的消息过来。
那咱如果用进程和线程来解释的话,也很简单,QQ 就相当于是一个进程,而你完成的每个任务,比如聊天、打字、传输文件等等,都会有单独的线程去操作和完成的。
你看,在使用 QQ 的过程中,我们不管是传输文件,还是发语音,还是打开某个对话框,这些行为都会对应开启一个线程。也就是说,在 QQ 执行的过程中,背后是有多个任务的,也就是有多个线程在背后来进行支撑,来完成 QQ 程序这个进程的运行。
也就是多个任务好像在同时进行,不会因为在传文件就不能发语音了,是吧?如果不这样的话,就会有超大的问题。
你想想,如果说我们在玩 QQ 的时候,但计算机整个 CPU 在执行这个程序时,只进行处理聊天,其他任务不动,比如不去刷新页面,那就尴尬了,不刷新的话页面就会卡死,也就没办法接收新的消息了,那你还聊个啥?
由于咱有了多线程的技术,每一次这 CPU 都会采用多路复用的原则,结合我们前面讲解的并发技术,去执行任务。
比如,在聊天打字的过程当中,CPU 执行了一百毫秒,其中用了五十毫秒去传输文件,又用了五十毫秒刷新了页面,等等。
由于这个过程又非常的快,这些人物事交替着完成的。
所以在我们看来,这些动作都不会有相互的依赖,也不会有相互的阻碍,可以非常顺畅地进行。
通过多线程技术,我们就可以在宏观的层面上支持了“同时”、并发的任务执行。
小结
第一,很重要,进程是系统资源分配的最小单位,线程是 CPU 调度的最小单位;
当你开启了一个进程之后,系统会自动为进城分配它所需要的资源,也就是内存空间;比如刚讲到的,如果你想聊天,想发语音,想发送文件等,是以线程为单位的,CPU 可以对它进行调度。
第二,一个进程管理多个线程,多个线程共享此进程的内存空间。