线程进程和协程是计算机领域非常重要的知识,也是面试中的常考点。
这个系列的文章,我将由浅入深,把这块的知识点逐一击破,同时,我会尽可能的通过代码,来对重要知识点进行模拟。
当然,由于笔者能力有限,也许会对一些概念的理解有失偏颇,欢迎讨论交流。
计算机组成原理
在进入线程进程和协程之前,我觉得有必要先对计算机基础知识做一个回顾,万丈高楼平地起。
冯诺依曼体系
冯诺依曼体系把计算机抽象成五大核心部件,也即是前面提到的存储器、运算器、控制器、输入设备、输出设备。此后,便奠定了现代计算机的基础,到今天虽然计算机经历了翻天覆地的变化,但本质上来讲,今天的计算机依然属于冯诺依曼计算机。
具体来讲:
- 存储器,负责数据的存储。有内存、磁盘、SSD,这三个设备,其中内存、磁盘、SSD三者速度、价格等特性各不相同,各司其职。
- 运算器,负责数据的运算。主要有CPU、显卡。其中CPU负责常规运算,显卡专注于3D、图形矩阵的运算。
- 控制器,负责计算机运行的总协调。主要是CPU,CPU除了负责常规运算以外,还负责计算机运行的总控制,让计算机各个部件可以协调、有序不紊的运行。
- 输入设备,负责接收数据的输入。主要是键盘、鼠标,分别接受字符输入和图形输入。
- 输出设备,负责计算机运算结果的输出。主要是显示器、音箱,显示器负责视频内容的输出,音箱负责声频内容的输出。
CPU
CPU主要由三个部分组成,控制器、运算器和高速缓存。
控制器负责协调和控制计算机各个部件有序不紊的运行。在控制器的内部,又有程序计数器、指令译码器、时序发生器等各司其职。
运算器主要负责数据的运算加工,ALU是运算器的核心部件,平时使用的加减乘除、与或非、移位等操作,都发生在运算器。
高速缓存是存在于CPU内部的高速存储器,在CPU工作的过程当中,CPU也需要空间来存储数据,如果每次存储都需要和内存打交道的话,将会极大的降低CPU的性能,所以在CPU内部,也会集成一些存储器,也称为寄存器,它的读写速度远大于内存。
存储器
在计算机的硬件设备中,内存、磁盘、SSD以及CPU内部的高速缓存等,从功能上来讲都属于存储器。
根据位价、速度的不同,可以把存储器划分为三个层次:高速缓存-主存-辅存。
高速缓存典型的特点就是位价高,并且速度快,它是为了适应CPU的运算速度而设计的存储器,拥有极高的读写速度,对应的位价也是最高的,因此容量一般较小,一般以MB为单位。
主存相比高速缓存,位价适中、速度适中,它的存在是为了解决CPU高速缓存容量不足的问题,有了主存,当CPU在运算过程中从高速缓存中找不到需要的数据时,也可以比较快速的从主存中找到,避免从磁盘中加载,这将会花费很长的CPU时间。
辅存指的就是机械硬盘、SSD等外围存储设备,辅存也叫做辅助存储,它是容量最大、读写速度最慢、位价最低的一种存储器,在使用计算机的过程中,可以把大量的暂时不会用到的数据存储在辅存上。
操作系统
操作系统的内容比较多,为了防止本文篇幅过长,我选一些重点的知识概念进行介绍。
用户态和内核态
用户态的程序工作在用户空间,用户空间指的是存放用户代码程序和数据的存储空间,它是一个虚拟空间。
处于用户态的程序有以下几个特点:
- 进程只能执行用户自己的代码
- CPU在特权级最低的用户代码中运行
- CPU只能访问有限的内存
- 程序不允许访问外围设备,如:磁盘、网卡等
与用户态对应是内核态,内核态的程序运行在内核空间,内核空间指的是存放内核代码程序和数据的存储空间,它也是一个虚拟空间。当用户状态的进程通过执行系统调用,就进入内核代码执行,这个时候进程就处于内核态。
处于内核态的程序有以下几个特点:
- CPU处于特权级最高的内核代码中执行
- CPU可以访问所有的内存和数据
- 程序允许访问外围设备
并发和并行
并发指的是两个或者以上的事件在同一时间间隔发生。
并行指的是两个或者以上的事件在同一时刻发生。
同步和异步,阻塞和非阻塞
阻塞、非阻塞强调的是程序在等待调用结果时的状态,而同步、异步描述的是这个程序是用哪种方式进行通信的。一个是状态、一个是通信机制。
阻塞对应的就是同步调用的时候对应的状态,当被调用方没有回应前,因为调用方会一直等待,这个时候,程序不能进行别的工作,所以被称为阻塞状态;而非阻塞则对应的是异步调用的时候对应的状态,当被调用方没有回应之前,调用方也没有白白浪费时间在等待上,而是转而去做别的事情,整个程序是没有停止运转的,这个状态我们就称为非阻塞状态。
CPU密集型和IO密集型
CPU密集型任务是指需要占用大量CPU时间的任务,在逻辑上,体现为需要进行复杂运算的程序。这种任务执行的时间取决于CPU的运行时间。
IO密集型体现为需要频繁读写磁盘、读写网络的程序,其完成的速度取决于IO设备的运转速度,当磁盘转速越快或者网卡带宽越大、网速越快,程序越快完成。