天天看点

并发编程专题(一)计算机操作系统工作原理

1、计算机五大组成部分

控制器:是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。

运算器:运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理。

存储器:存储器的功能是存储程序、数据、各种信号、命令等信息,并在需要时提供这些信息。

输入:输入设备是计算机的重要组成部分,输入设备与输出设备合你为外部设备,简称外设,输入设备的作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机。常见的输入设备有键盘、鼠标器、光电输入机、磁带机、磁盘机、光盘机等。

输出:输出设备与输入设备同样是计算机的重要组成部分,它把计算机的中间结果或最后结果、机内的各种数据符号及文字或各种控制信号等信息输出出来。微机常用的输出设备有显示终端CRT、打印机、激光印字机、绘图仪及磁带、光盘机等。

最核心和就是cpu和内存,下面重点介绍cpu和内存的工作原理

2、cpu和内存

2.1、cpu和内存结构

并发编程专题(一)计算机操作系统工作原理

控制单元:是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令译码器ID(Instructionecoder)和 操作控制器OC(Operation Controller)等组成,对协调整个电脑有序工作极为重要。它根据用户预先编好的程序,依次从存储器中取出各条指令,放在指令寄存器IR中,通过指令译码(分析)确定应该进行什么操作,然后通过操作控制器OC,按确定的时序,向相应的部件发出微操作控制信号。操作控制器OC中主要包括:节拍脉冲发生器、控制矩阵、时钟脉冲发生器、复位电路和启停电路等控制逻辑。

运算单元:是运算器的核心。可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。相对控制单元而言,运算器接受控制单元的命令而进行动作,即运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的,所以它是执行部件。

存储单元:包括CPU片内缓存Cache和寄存器组,是CPU中暂时存放数据的地方,里面保存着那些等待处理的数据或已经处理过的数据,CPU访问寄存器所用的时间要比访问内存的时间短。寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。采用寄存器,可以减少 CPU 访问内存的次数,从而提高了CPU的工作速度。寄存器组可分为专用寄存器和通用寄存器。专用寄存器的作用是固定的,分别寄存相应的数据;而通用寄存器用途广泛并可由程序员规定其用途。

2.2、cpu缓存结构

现代cpu为了提高执行效率,减少cpu和内存的交互(交互会影响cpu效率),cpu一般会集成多级缓存架构,通常为三级缓存结构

  • L1 cache,分为数据缓存和指令缓存,逻辑核独占
  • L2 cache,物理核独占,逻辑核共享
  • L3 cache,所有物理核共享
并发编程专题(一)计算机操作系统工作原理

存储器存储空间大小:主内存>L3>L2>L1>寄存器

存储速度快慢排序:寄存器>L1>L2>L3>主内存

还有一点值得注意的是:缓存是由最小的存储区块-缓存行(cacheline)组成,缓存行大小通常为64byte。

缓存行是什么意思呢?

比如你的L1缓存大小是512kb,而cacheline = 64byte,那么就是L1里有512 * 1024/64个cacheline

2.3、cpu读取存储器数据过程

1、 CPU要取寄存器X的值,只需要一步:直接读取。

2、 CPU要取L1 cache的某个值,需要1-3步(或者更多):把cache行锁住,把某个数据拿来,解锁,如果没锁住就慢了。

3、 CPU要取L2 cache的某个值,先要到L1 cache里取,L1当中不存在,在L2里,L2开始加锁,加锁以后,把L2里的数据复制到L1,再执行读L1的过程,上面的3步,再解锁。

4、 CPU取L3 cache的也是一样,只不过先由L3复制到L2,从L2复制到L1,从L1到CPU。

5、 CPU取内存则最复杂:通知内存控制器占用总线带宽,通知内存加锁,发起内存读请求,等待回应,回应数据保存到L3(如果没有就到L2),再从L3/2到L1,再从L1到CPU,之后解除总线锁定。

2.4、cpu为何要有高速缓存(L1,2,3)

CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配。

带有高速缓存的CPU执行计算的流程

  1. 程序以及数据被加载到主内存
  2. 指令和数据被加载到CPU的高速缓存
  3. CPU执行指令,把结果写到高速缓存
  4. 高速缓存中的数据写回主内存

2.5、cpu运行安全等级

cpu的运行安全等级一般有ring0,1,2,3四级

Linux与Windows只用到了2个级别:ring0、ring3,操作系统内部内部程序指令通常运行在ring0级别,操作系统以外的第三方程序运行在ring3级别,第三方程序如果要调用操作系统内部函数功能,由于运行安全级别不够,必须切换CPU运行状态,从ring3切换到ring0, 然后执行系统函数。

说到这里相信大家都明白为什么JVM创建线程,线程阻塞唤醒是重型操作了,因为CPU要切换运行状态。大概梳理一下jvm创建线程cpu的工作过程

  1. cpu从ring3切换到ring0,创建线程
  2. 创建完毕,cpu从ring0切换回ring3
  3. 线程执行jvm程序
  4. 线程执行完毕,销毁切换回ring0

cpu大概说完了,接下来看内存部分

2.6、操作系统内存管理

操作系统有用户空间和内核空间两个概念。以32位操作系统4G大小的内存空间为例

并发编程专题(一)计算机操作系统工作原理

从 0x00000000 到 0xc0000000(PAGE_OFFSET) 的线性地址可由用户代码 和 内核代码进 行引用(即用户空间)。

从0xc0000000(PAGE_OFFSET)到0xFFFFFFFFF的线性地址只能由内核代码进行访问(即内核空间)。

内核代码及其数据结构都必须位于这1GB的地址空间中,但是对于此地址空间而言,更大的消费者是物理地址的虚拟映射。

这意味着在4GB的内存空间中,只有3GB用于用户应用程序。进程和线程只能运行在用户模式或内核模式下。用户线程运行在用户方下,而系统调用运行在内核方式下。

在这两种方式下所用的堆栈不一样,用户方式下用得是一般的堆栈(用户空间的堆栈),而内核方式下用的是固定大小的堆栈(内核空间的堆栈,一般为一个内存页的大小),即每个进程和线程都有两个堆栈,分别运行用户态和内核态。

2.7、内核线程模型

内核线程模型(KLT):系统内核管理线程(KLT),内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建、调度和管 理由内核完成,效率比ULT要慢,比进程操作快。

用户线程模型(ULT):用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/内核态切换,速度快。内核对ULT无感知,线程阻塞则进程(包括它的所有线程)阻塞。

jvm中采用的是内核线程模型

3、进程和线程

关于进程和线程的文章一大堆,这里简单介绍一下

什么是进程?现在操作系统在运行一个程序时,会为其创建一个进程,例如,启动一个java程序,操作系统就会创建一个java进程,进程是os操作系统分配资源的最小单位。

什么是线程?线程是os调度cpu的最小单元,也叫轻量级进程,在一个进程中可以创建多个线程,这些线程都拥有各自的计数器,堆栈和局部变量等属性,并且能够访问共享的内存变量,cpu在这些线程上高速切换,让使用者感觉这些线程在同时执行。

继续阅读