文章目录
- 计算机算机组成
- 因特尔CPU型号
- 摩尔定律
- 衡量CPU的指标
- 指令(Instruction)
- 操作系统(Operating System)
- 虚拟地址空间(Virtual Address Space)
- 进程(Process/task)
- 进程管理(PCB - 进程控制块)
- 进程控制块(Process Control Blob)
- 进程间通信
本节介绍进程和计算机相关概念,为后面介绍多线程铺垫一下
计算机算机组成
- CPU(Central Processing Unit)中央处理单元,计算机最核心的部分,相当于计算机的大脑。
- 存储器
- 内存(主存):速度快快、空间小、成本更高、掉电后数据丢失。
- 外村:速度慢、空间大、成本低、掉点后数据丢失。
- 输入设备
- 键盘、鼠标、网卡等。
- 输出设备
- 显示器、音箱等。
可怕的是CPU虽然制造极其困难,但是它的价格却不高,几年前的CPU已经成为白菜价了,问什么会出现这种情况呢?
- CPU通过大规模量产,可以降低成本。
- CPU迭代速度非常快,并且每一代CPU相较于上一代的提升都很大,这就使得前代CPU的价格大幅度降低
因特尔CPU型号
英特尔CPU型号首先是分哪个系列的,然后一个产品线和代数
- 服务器 - 至强
- 家庭 - 酷睿
- I3 - 入门级
- i5 - 普通级
- i7 - 高端级
- i9 - 旗舰级
- 嵌入式、低耗设备 - 赛扬。我们这里所说的什么I3、I5、I7、I9,这个是针对酷睿。
由于CPU技术迭代快,所以CPU的代数是一个非常重要的指标,一般来说,13代i5的性能会大于12代i7。那么为什么会出现i3、i5、i7、i9呢?是由于CPU加工有一个良品率的问题。CPU的体积虽然小巧,但是其内部包含了非常精密的大规模集成电路,存在着大量的计算单元(ALU - Algorithm Logic Unit),每个计算单元体积都极小,这就给加工加工制造带来了非常大的难度。在制造时是使用激光刻蚀去构建集成电路的。所以制造出的CPU中的计算单元会有的无法完成计算任务,有的计算单元是不可用的。那么厂家使用一定的技术屏蔽不可用的计算单元,只保留功能完好的计算单元,所以计算单元的数量就对应了各个级别的CPU。
摩尔定律
摩尔定律是有因特尔联合创始人兼副总裁摩尔,在长期从事CPU制造后,总结出来的一个定律,内容大致是:芯片每隔18个月,集成程度提高一倍,计算效率提高一倍,成本下降一半。这个定律在CPU发展的50多年中一直被印证。
衡量CPU的指标
主频和核心数是衡量CPU性能的核心指标.
主频即CPU的时钟频率,计算机的操作在时钟信号的控制下分步执行,每个时钟信号周期完成一步操作,时钟频率的高低在很大程度上反映了CPU速度的快慢。
-
主频 - 3.20GHZ
- 指的是CPU每个时钟周期所指向的指令条数
- 可以简单的理解为CPU每秒钟可以执行32亿条指令
-
核心数
- 核心就是一个能完成完整计算功能的整体
- CPU最初都是单个核心的,只能执行单个程序,后来发展出现了多进程、多线程技术,厂家为了支持这样的技术,就研发处理多核心的CPU
- 多核CPU的到来,又一步极大地提高了CPU的性能
指令(Instruction)
指令时CPU上能够执行任务的最小单元。高级语言中一条语句可能就对应了CPU中的多条指令,比如高级语言中的加法操作,在CPU指令层面可能就要执行load(读取数据到寄存器),add(加法器完成加法操作),store(写回内存)。在CPU设计是就会支持一些指令,让CPU可以正常的工作,CPU的工作就是由一条条指令组成的。
操作系统(Operating System)
操作系统很多,比如我们最常用的Windows,Mac OS,服务器使用的Linux/Unix ,移动端的Android、Ios等,虽然这些操作系统来自于不同的厂商,功能也各有侧重,但是这些操作系统的核心机制是相通的。
操作系统本质上是用来管理计算机软硬件资源的软件,对下管理所有的硬件设备,对上给软件(应用层)提供一个稳定的运行环境,这一点是由进程的隔离性保证的(后面会介绍到),可以保证各个程序在运行时(进程)不会相互干扰。
操作系统分为内核态和用户态两种模式,一个程序在运行过程中,可能是在用户态工作,也可能是在内核态工作。首先介绍一下什么叫做内核。内核其实顾名思义,它就属于是一个操系统,最核心的功能模块。简单理解 操作系统 = 内核 + 配套的应用程序。一些核心的程序都是直接在内核中运行的,如一些驱动程序等。内核只有一份但是却要给很多的上层软件提供支持,一般内核都会给上层提供API供上层使用。
在Java中,一般不会直接使用系统API,由于不同操作系统提供的API是不相同的,Java对系统API进行了一层封装,保证跨平台特性,降低了学习和使用的成本。
虚拟地址空间(Virtual Address Space)
早期的操作系统它程序运行时,它分配的内存就直接从物理内存上进行分配。这样一旦某个程序越界访问/修改内存,就可能会导致其它程序异常崩溃
为了解决这个问题就引入了”虚拟内存空间“的概念,通过对物理内存的抽象,通过虚拟内存映射到物理内存,在访问到物理内存之前强行检查,防止出现未定义行为。保证了进程间的隔离性从而给进程提供一个稳定的运行环境。
假如你故意访问构造一个其他的一个地址,在应用程序这个层面看到的是异常,在系统内部,它是通过这个信号机制触发一个signal segment default(段错误)这样的一个信号。
进程(Process/task)
在Java语言生态下,并多进程编程使用的并不多,创建、销毁、调度进程是一个很大的开销。反而在C++中经常使用多进程编程,Java中经常使用多线程编程,要想清楚的了解线程,就要先对进程有一个大概的了解。
进程(Process),又叫做任务(task),进程本质上是一个正在运行的程序,exe文件只是一个可执行文件,是静态的,不是进程。进程运行时,CPU会分配给进程一定的系统资源(CPU资源,内存资源、硬盘资源…),每个进程要想执行就都需要消耗一定的系统资源,进程每个时刻消耗的资源都是动态变化的。 所以进程是操作系统资源分配的最小单位
进程管理(PCB - 进程控制块)
- 先描述:使用PCB结构表示出进程的各种属性
- 后组织:使用类似双向链表,把这些PCB给串起来
进程是系统分配资源的基本单位。进程的管理,想要对实体进行管理,首先在Linux操作系统中使用task_struct结构体描述和管理一个进程,task_struct又叫做PCB(Process Control Blob)进程控制块,这样我们就可以操作系统中的进程使用一定的数据结构来进行管理(增删改查)了。一个进程可能有一个PCB,也可能有多个,因为一个进程可能会有多个线程。
当我们创建一个进程,本质上就是创建出这样的一个结构体,再把它插到链表上面。销毁一个进程,那就是直接从这个列表上删掉一个节点。查看进程列表,其实就是在这个双向链表进行遍历。
进程控制块(Process Control Blob)
下面我们挑选一些PCB中比较重要的概念进行介绍。
-
pid 每个进程(进程中的所有线程共享同一个进程的pid)都有唯一的pid,是一个进程的唯一身份标识。
-
内存指针 描述了进程所持有的内存资源。进程在运行时操作系统会分配一块儿内存空间,而这 块内存空间就是有一组内存指针来维护的。使用内存指针区分这块内存空间具体在哪里,有哪些部分,每个部分有什么作用。比如,进程的内存空间需要有专门的区域存储要执行的指令,以及指令依赖的数据。并且还需要存储一些运行时产生的临时数据,这些都属于是我们不同的一个内存空间所负责的一个作用,所负责的一个功能。(CPU 大概的工作流程 取指 - 译码 - 执行 - 写回)。
-
文件描述符表 描述了进程持有的硬盘资源。在操作系统中,硬盘上面的存储空间以文件的这种抽象的形式来去进行表示的,所以这个时候我们代码里面操作的是文件,实际上在硬件上操作就是硬盘。一个进程也会涉及到一些硬盘操作,比如说从硬盘读数据,或者往硬盘上写数据(IO),那这是我们就需要按照文件的方式来组织。进程它关联了哪些文件,都能操作哪些文件。
上面的三个字段描述了进程的id和进程持有的资源,那么下面我们介绍几个用于进程调度的字段,也就是CPU资源的分配的情况。
- 并发:两个进程在一个CPU核心上"轮转调度","分时复用"执行
- 并行:两个进程分别在在两个CPU核心上同时执行
进程在调度之下,会“同时”执行,轮转执行,只是这个速度非常快,肉眼无法感知到,这个过程叫做并发,或者分时复用。平时开发中, 会通统一使用做并发,来代指并行和并发。进程就是为了实现并发编程的效果,提高效率。
管理进程调度的字段:
-
状态
简单介绍两个核心状态:- 就绪状态:正在CPU上执行或者随时准备到CPU上执行。
- 阻塞状态:由于某些条件不具备,暂时无法到CPU上执行。
-
优先级
CPU会根据重要程度来划分优先级,从而在进程调度时让优先级更高的进程获得更多的调度机会。比如,游戏和QQ的优先级不同,游戏程序的优先级肯定会大于QQ,QQ只需要在后台收消息,而游戏会实时影响你的体验。
- 上下文
什么是上下文?
上下文是保存在内存中的,在进程离开CPU之前,会把当前CPU中的各种寄存器,将寄存器中的数据打包,记录到内存中去,下次调度来到时,就可以把只写寄存器的值进行回复,还原场景,沿着上次执行的结果继续执行。类似于单机游戏存档和读档.
CPU某些寄存器属于没有特点含义,就只是用来保存计算的中间结果的,有些寄存器是有特点含义的,保存当前执行到那个指令(程序计数器),记录了下一条指令所在的位置,维护栈相关的寄存器,通过这一组寄存器,维护当前程序的调用栈(局部变量和方法参数),一般是一对寄存器,有了这个我们才知道下一步到哪儿执行
- 记账信息
- 记账信息中会对进程调度执行进行统计,从而为进程调度提供一个参考
- 如果某个进程长时间未被调度,那么下次调度它的概率就会增加
- 通过优先级机制对不同的进程分配了不同权重的资源
进程的状态、优先级、上下文、记账信息是用配合完成进程调度得,和进程持有的cpu资源密切相关。由于CPU核心数少,进程多,这是就需进程轮番在CPU上执行,只要轮转的速度够快,在用户眼中,看起来就像是在“同时“执行一样。
进程间通信
由于进程之间彼此独立,具有隔离性,虽然保证了进程的安全,进程之间不会相互影响,但是也出现了一个问题,就是进程之间如何通信。进程间通信的核心思想是借助共有空间,主要形式有以下两种。
- 文件(IO)
- 网络(socket)