线程与进程的简单解释

进程(process)和线程(thread)是操作系统的基本概念,但是因为前端工作中基本不会碰到,渐渐地也就遗忘了。
最近,因为一些事情又牵扯到它们了,网上也查阅了一些资料文章,所以写一篇博客总结记录一下。

CPU

计算机的核心是CPU,它承担了所有的计算任务,输入算式,输出结果。

在这里为了便于下面理解,我们把它当成以前的电话局CPU核心理解成电话局里的每一部电话机,用来让你跟其他人打电话沟通。

线程

线程是操作系统能够进行运算调度的最小单位。上面说了,CPU是负责所有的计算任务的,所以这里,我们可以把线程当成“跟某个人打电话”这个任务。

进程

进程是操作系统中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。

听起来很抽象对不对?回到上面的电话局打电话,早期电话还是稀罕物,打个电话都要跑老远到电话局的,不像现在家家一部电话、人人一部手机。阿强不可能只是为了跟阿珍说一句“早上好”就跑到电话局打电话对不对?一般都是把要跟哪些人打电话说什么都事先写好,到了电话局拨号、通话、结束、再拨号、再通话。。。如此重复。

打电话的这个人就是进。因为电话局的电话只能分配给人,无法分配给打电话这个任务,所以进程是系统资源分配和调度的基本单位。

线程、进程关系

结合上面的类比,我们可以轻松理解线程与进程关系。

线程是属于进程的,线程运行在进程空间内(只有人可以携带打电话任务),同一进程所产生的线程共享同一内存空间(一个人的所有打电话任务只能使用一部电话机),当进程退出时该进程所产生的线程都会被强制退出并清除(人离开电话局后,打电话任务也就不存在了)。

线程可与属于同一进程的其它线程共享进程所拥有的全部资源(一个人的所有打电话任务只能使用一部电话机),但是其本身基本上不拥有系统资源(打电话任务自身无法申请电话机),只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

互斥锁(Mutual exclusion,缩写 Mutex)

当你在通话时,你需要占用一条电话线路(系统资源),你通话结束后就需要释放这条线路用于别人打电话。为了防止你正在通话过程中被人拔电话线,就需要让系统知道你这次通话开始或结束了。如何让系统知道你正在占用线路呢?就是拨号和挂断,拨号代表你开始占用线路,挂断代表你结束线路占用。

这里的拨号和挂断的行为就是互斥锁。上锁(拨号)代表进程(打电话的人)对某块内存区域(电话线路)的占用,其他进程(其他打电话的人)就无法操作这块内存区域,解锁(挂断)之后其它进程才可以使用这块内存。互斥锁是防止多个线程同时读写同一块内存区域。