【计算机系统】进程和线程(process and thread)

进程和线程

这里提到,「在操作系统中执行的程序,都以进程的方式运行在更低的权限中」。事实上,操作系统是以进程为单位去分配空间和执行的。但是,进程和程序有什么不同呢?我们说

程序是一组指令的集合,它静态存储于诸如磁盘之类的存储器里;

当一个程序被操作系统执行时,它就会被载入内存空间,并在逻辑上产生一个独立的实例,这就是进程。

这就好像是说,程序是一道菜谱,其中的指令,就是指挥你开火加盐的步骤;进程则是烹饪的过程,操作系统按照指令一丝不苟地烹饪,得到的结果就是我们的菜肴。

随着 CPU 频率增长逐渐停滞,CPU 开始向多核的方向发展。为了让多个 CPU 核心同时为我们工作,并行地执行任务,就需要涉及线程的概念。线程的英文是 Thread,有时也称为轻量级进程 (Lightweight Process),它是操作系统进行任务调度的最小单元。线程存活于进程之中;同一个进程中的线程,共享一个虚拟内存空间,以及其中的资源;线程之间各自持有自己的线程 ID、当前指令的指针(PC)、寄存器集合以及栈。

通常来说,使用多线程(一个core假装自己是多个core)会带来一下一些优势:

将等待 I/O 操作的时间,调度到其他线程执行,提高 CPU 利用率;

将计算密集型的操作留给工作线程,预留线程保持与用户的交互;

在多 CPU/多核计算机下,有效吃干计算能力;

相比多进程的程序,更有效地进行数据共享(在同一个进程空间)。

操作系统内核(kernel)

    关于操作系统和操作系统内核这两个概念,很多人尝试去区分与解释,但是发现很难得解释的完全(包括我自己,这里只是把我自己的理解整理出来,有什么不对的地方,希望大家批评指正,共同进步)。

    查看了一些网上和CS系列书籍中的关于操作系统内核的概念解释,总结之后,我的理解是:

        (1)操作系统包括操作系统内核(这是必然的),也就是说内核程序是操作系统所包含的一组计算机程序中的一个子集,所以内核程序也是一组计算机程序,而这些内核程序是操作系统中最常使用基本模块,直接与硬件打交道,主要由用于管理存储器、文件、外设和系统资源的那些部分组成。

        (2)内核程序一直占据内存中的一段内存,这样处理器可以随时调用这些内核程序;

        (3)而操作系统除了内核程序外,还有包括其他一些基本组件,如文本编辑器、编译器、用来与用户进行交互的程序等

    对于第(2)点,可以引入《深入理解计算机系统》这本书中关于“虚拟存储器”(P12)解释的一幅图来说明,如下:


上图中,关于进程的虚拟地址空间的说明中,最上面的子区域“内核虚拟存储器”就是用来存储内核程序和数据的,这个地址空间是一个固定的结构,所以对于每一个应用程序(进程)来说,都具有同样结构的虚拟地址空间,这就可以保证每个进程都能调用操作系统内核程序来完成自己的功能。

    下面再用一幅图说明操作系统内核是操作系统的一组子程


上图中,操作系统的内核包围硬件,同时,其外层是系统调用接口,这就是操作系统中除内核以外的其他组件。

    下面整理两个网友关于操作系统与操作系统内核的解释,个人觉得解释的还是比较好的:

        (1)内核,是操作系统的基础模块,用于管理系统资源。例如提供对软件层面的抽象(例如对进程、文件系统、同步、内存、网络协议等对象的操作和权限控制),和对硬件访问的抽象(例如磁盘,显示,网络接口卡(NIC));操作系统,在内核的基础上有延伸,包括了提供基础服务的系统组件。

        (2)内核,就是计算机学科意义上的操作系统,直接与硬件交互,提供CPU时间片管理、中断、内存管理、IO管理等等;一般意义上的操作系统包含的东西要更多一些,至少要有用户交互的基本程序,比如一个命令行界面和基本的指令(文件遍历、进程管理等等),或者图形界面的桌面和文件浏览器。





Standard C library handling of write(). The library provides a portion of the system-call interface for many versions of Unix and Linux.

你可能感兴趣的:(【计算机系统】进程和线程(process and thread))