进程和线程

算是对原文的总结加上两个实际的例子,最好能看一看英文原文,人家说得更详细。

进程(process)

一个进程就是程序的一个实例。程序运行时需要计算机硬件资源的支持,操作系统的任务就是分配进程需要的资源。
每个进程都需要的计算机资源包括内存,寄存器,程序计数器,栈,堆。
和线程不同,每个进程的堆都是互相独立的。这也保证了某个进程出错不会影响到其他进程。

线程(thread)

线程就是对进程获得的(操作系统分配的)资源的再分配,这种分配由程序完成(随着一个进程中线程数的增加,进程占用的资源也会更多以满足新线程需要占用的资源,这是一种动态的过程)。在进程内部,每个线程有自己独有的栈,但是进程内部的堆是由线程共享的,这样做的好处是方便了线程间的通信,但是会引起线程安全问题。

并发(concurrent)和并行(parallel)

程序运行过程中需要用到很多资源,包括CPU,但是CPU对自己要处理部分的处理速度远远快于其他资源对它们要处理部分的处理速度,所以在大部分的时间,CPU会处于闲置状态,为了提高CPU的利用率,可以让CPU轮流处理不同的线程,因为CPU处理每个线程所花的时间都极短,所以看起来好像那些线程是同时被处理的。这叫并发。
并行是指CPU有多个核心,可以真正地同时处理多个线程。

EXCEL和记事本(notepad)

我们可以看一看excel和记事本分别是如何处理打开多个文件这种情况的,然后分析一下它们使用的技术。
我们打开“新建记事本1.txt”和“新建记事本2.txt”,“新建 Microsoft Excel 工作表1.xlsx”和“新建 Microsoft Excel 工作表2.xlsx”。然后打开任务管理器可以看到:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
可以看到,excel只有一个进程,两个文件分别对应一个线程,记事本有两个进程,每个进程中只有一个线程。

excel这种打开新文件时不创建新进程而是创建新线程的好处就在于线程之间的堆是共享的,线程间的通信很方便。比如“新建 Microsoft Excel 工作表1.xlsx”的A1单元格的值是1,我们在“新建 Microsoft Excel 工作表2.xlsx”的A1单元格里面写入公式“=’[新建 Microsoft Excel 工作表1.xlsx]Sheet1’!$A$1”,就可以获取“新建 Microsoft Excel 工作表1.xlsx”的A1单元格的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章