一、进程、线程基础知识
这篇文章以通俗叙事方式系统讲解了操作系统中的进程与线程,覆盖概念、状态切换、调度机制与实现模型,适合作为入门到中级的知识框架。基础概念与直觉模型先通过类比建立进程、线程、调度、时间片等概念直觉。强调“进程是资源分配单位、线程是执行单位”的核心划分。解释两者在资源隔离与共享能力上的本质差异。进程与线程运行机制进程部分覆盖…
进程、线程基础知识 先来看看一则小故事 我们写好的一行行代码,为了让其工作起来,我们还得把它送进城(进程)里,那既然进了城里,那肯定不能胡作非为了。 城里人有城里人的规矩,城中有个专门管辖你们的城管(操作系统),人家让你休息就休息,让你工作就工作,毕竟摊位不多,每个人都要占这个摊位来工作,城里要工作的人多着去了。 所以城管为了公平起见,它使用一种策略(调度)方式,给每个人一个固定的工作时间(时间片),时间到了就会通知你去休息而换另外一个人上场工作。 另外,在休息时候你也不能偷懒,要记住工作到哪了,不然下次到你工作了,你忘记工作到哪了,那还怎么继续? 有的人,可能还进入了县城(线程)工作,这里相对轻松一些,在休息的时候,要记住的东西相对较少,而且还能共享城里的资源。 “哎哟,难道本文内容是进程和线程?” 可以,聪明的你猜出来了,也不枉费我瞎编乱造的故事了。 img 进程和线程对于写代码的我们,真的天天见、日日见了,但见的多不代表你就熟悉它们,比如简单问你一句,你知道它们的工作原理和区别吗? 不知道没关系,今天就要跟大家讨论操作系统的进程和线程。 img TIP 先强调一下,我们本篇讲的主要都是操作系统理论知识,偏大学计算机专业课上的那种,并不是讲解 Linux 或 Windows 操作系统的实现方式,所以大家要区别一下。 想让了解 Linux 或 Windows 操作系统的具体实现,得去看这些操作系统的实现原理或者源码书籍。进程 我们编写的代码只是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着 CPU 会执行程序中的每一条指令,那么这个运行中的程序,就被称为「进程」(Process)。 现在我们考虑有一个会读取硬盘文件数据的程序被执行了,那么当运行到读取文件的指令时,就会去从硬盘读取数据,但是硬盘的读写速度是非常慢的,那么在这个时候,如果 CPU 傻傻的等硬盘返回数据的话,那 CPU 的利用率是非常低的。 做个类比,你去煮开水时,你会傻傻的等水壶烧开吗?很明显,小孩也不会傻等。我们可以在水壶烧开之前去做其他事情。当水壶烧开了,我们自然就会听到“嘀嘀嘀”的声音,于是再把烧开的水倒入到水杯里就好了。 所以,当进程要从硬盘读取数据时,CPU 不需要阻塞等待数据的返回,而是去执行另外的进程。当硬盘数据返回时,CPU 会收到个中断,于是 CPU 再继续运行这个进程。 进程 1 与进程 2 切换 这种多个程序、交替执行的思想,就有 CPU 管理多个进程的初步想法。 对于一个支持多进程的系统,CPU 会从一个进程快速切换至另一个进程,其间每个进程各运行几十或几百个毫秒。 虽然单核的 CPU 在某一个瞬间,只能运行一个进程。但在 1 秒钟期间,它可能会运行多个进程,这样就产生并行的错觉,实际上这是并发。 并发和并行有什么区别? 一图胜千言。 并发与并行 进程与程序的关系的类比 到了晚饭时间,一对小情侣肚子都咕咕叫了,于是男生见机行事,就想给女生做晚饭,所以他就在网上找了辣子鸡的菜谱,接着买了一些鸡肉、辣椒、香料等材料,然后边看边学边做这道菜。 img 突然,女生说她想喝可乐,那么男生只好把做菜的事情暂停一下,并在手机菜谱标记做到哪一个步骤,把状态信息记录了下来。 然后男生听从女生的指令,跑去下楼买了一瓶冰可乐后,又回到厨房继续做菜。 这体现了,CPU 可以从一个进程(做菜)切换到另外一个进程(买可乐),在切换前必须要记录当前进程中运行的状态信息,以备下次切换回来的时候可以恢复执行。 所以,可以发现进程有着「运行 - 暂停 - 运行」的活动规律。进程的状态 在上面,我们知道了进程有着「运行 - 暂停 - 运行」的活动规律。一般说来,一个进程并不是自始至终连续不停地运行的,它与并发执行中的其他进程的执行是相互制约的。 它有时处于运行状态,有时又由于某种原因而暂停运行处于等待状态,当使它暂停的原因消失后,它又进入准备运行状态。 所以,在一个进程的活动期间至少具备三种基本状态,即运行状态、就绪状态、阻塞状态。 进程的三种基本状态 上图中各个状态的意义:运行状态(Running):该时刻进程占用 CPU;就绪状态(Ready):可运行,由于其他进程处于运行状态而暂时停止运行;阻塞状态(Blocked):该进程正在等待某一事件发生(如等待输入/输出操作的完成)而暂时停止运行,这时,即使给它CPU控制权,它也无法运行; 当然,进程还有另外两个基本状态:创建状态(new):进程正在被创建时的状态;结束状态(Exit):进程正在从系统中消失时的状态; 于是,一个完整的进程状态的变迁如下图: 进程五种状态的变迁 再来详细说明一下进程的状态变迁:NULL -> 创建状态:一个新进程被创建时的第一个状…
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行