目录
二、冯诺依曼体系(Von Neumann Architecture)
4.3内存分配 —— 内存管理(Memory Manage)
4.5进程间通信(Inter Process Communication)
一、计算机发展史
计算的需求在人类的历史中是广泛存在的,发展大体经历了从一般计算工具到机械计算机到目前的电子计算机的发展历程。 人类对计算的需求,驱动我们不断的发明、改善计算机。目前这个时代是“电子计算机”的时代,发展的潮流是:更快速、更稳定、更微型。计算机的以后将如何发展,期待大家的努力。
二、冯诺依曼体系(Von Neumann Architecture)
现代的计算机, 大多遵守 冯诺依曼体系结构。
计算机最核心的部分:CPU、内存、硬盘、主板、散热器、电源、机箱、显卡
- CPU 中央处理器: 进行算术运算和逻辑判断.
- 存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
- 输入设备: 用户给计算机发号施令的设备.
- 输出设备: 计算机个用户汇报结果的设备.
针对存储空间
硬盘 > 内存 >> CPU
针对数据访问速度
CPU >> 内存 > 硬盘
认识计算机的祖师爷 -- 冯诺依曼
冯·诺依曼(John von Neumann,1903年12月28日-1957年2月8日), 美籍匈牙利数学家、计算机科学家、物理学家,是20世纪最重要的数学家之一。冯·诺依曼是布达佩斯大学数学博士,在现代计算机、博弈论、核武器和生化武器等领域内的科学全才之一,被后人称为“现代计算机之父”、“博弈论之父”.
三、CPU等相关介绍
3.1CPU介绍
8核16线程:表示CPU里有八个核心(8个干活的人),但是每个核心一个顶俩,八个人就可以同时干16个人的活------>8个物理核心,16个逻辑核心
3.2并行和并发
3.2.1并行
同一时刻有两个核心同时执行两个进程,此时这两个进程就是并行执行的。
3.2.2并发
存在一个核心,先执行进程1,执行一会后再去执行进程2,再执行一会后,再去执行进程3,只要切换的速度足够快看起来就像进程1、2、3“同时执行”
3.2.3并发和并行
通常情况是结合并发和并行一起执行,由操作系统自身进行控制(很多时候把并行+并发统称为并发)。(若并发程度很高,上万时就可以称为高并发)
3.3寄存器
寄存器:存储空间小,访问速度快,成本高,掉电后数据会丢失。寄存器的速度和内存速度的差距是极大的,3-4个数量级。
寄存器的用途:辅助CPU完成指令的执行。(一条指令不仅仅是指令本身,同时还有操作数,而操作数通常是在寄存器中保存的)
由于寄存器和内存之间的速度和空间上差异太大了,难以协调工作。CPU又引入了“缓存”来调和寄存器和内存之间的速度。
注意:Flash是闪存,类似于硬盘这样的存在。
3.4三级缓存
CPU上要进行一系列运算,在运算过程中,反复用到一组内存中的数据。这些数据要频繁使用需要频繁访问内存,同时这些数据又比较多,在寄存器中存不下,就可以放到缓存中。
- 一级缓存:空间比较小,速度更快
- 二级缓存:空间更大,速度更慢
- ...
四、操作系统(Operating System)
操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux(李娜克斯)系列、OSX系列、Android系列、iOS系列、鸿蒙等。
4.1操作系统的定位
操作系统由两个基本功能:
1) 防止硬件被时空的应用程序滥用;
2) 向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。
- 对上,给软件提供稳定的运行环境
- 对下,管理好各种硬件设备
硬件千差万别,如果每个写软件的人都需要考虑硬件的差别和兼容性,这个事情的门槛就非常高了。操作系统,就是要把硬件屏蔽起来,对软件提出一组API(系统调用),让软件来调用。
4.2进程/任务
每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
可执行程序只是占用了硬盘空间。而进程会消耗CPU资源、内存资源、硬盘、网路带宽。
当下载一个程序时是静态的,当安装时则是真正运行起来了,会消耗CPU资源、内存资源、硬盘、网络带宽。
4.2进程结构体的核心属性(PCB:进程控制块)
背景:进程多时需要进行进程管理
1.描述一个进程:使用结构体/类,把一个进程有哪些信息都表示出来
---->Linux中的PCB,在源码中是一个Task_struck结构体。
2.组织进程:使用一定的数据结构,把这些结构体/对象放到一起,随时方便进行遍历、查找、汇总数据。通常时使用双向链表的我数据结构进行组织的。
(1.)查看进程的列表,本质上就是在遍历这个链表
(2.)创建一个进程,就是创建了一个PCB结构体,并且插入到链表上
(3.)销毁一个进程,就是把这个PCB结构体从链表上删除并释放
计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。在 Java 语言中,我们可以通过类/对象来描述这一特征。
// 以下代码是 Java 代码的伪码形式,重在说明,无法直接运行
class PCB {
// 进程的唯一标识 —— pid;
// 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
// 分配给该资源使用的各个资源
// 进度调度信息(留待下面讲解)
}
这样,每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程。操作系统再通过这种数据结构,例如线性表、搜索树等将 PCB 对象组织起来,方便管理时进行增删查改的操作。
PCB中大概有哪些信息呢?
4.2.1Pid 进程的标识
每个进程都需要有一个唯一的身份标识。
4.2.2内存指针
表示该进程对应的内存资源(进程要跑起来就需要消耗一定的硬件资源,比如内存。记录进程运行的时候,使用了哪些内存上的资源)。内存资源中主要存储的是exe可执行文件中加载过来的指令和数据,还需要保存一些运行过程中的中间结果之类的数据。
4.2.3文件描述符表
进程每次打开一个文件,就会产生一个“文件描述符”(标识当前被打开的文件)。一个进程可能会打开很多文件,对应了一组文件描述符。把这些文件描述符放到一个顺序表这样的结构里,就构成了文件描述符表。
4.2.4辅助进程调度的属性
4.2.4.1进程状态
进程状态主要分为:
- 就绪态:该进程已经准备好,随时可以在CPU上执行
- 阻塞态:该进程暂时无法在CPU上执行
4.2.4.2进程的优先级
进程之间的调度不一定是“公平”的,有的要优先调度。这样就可以把系统资源调配给更重要的进程上。
4.2.4.3进程的上下文
上下文就是描述了当前进程执行到哪里这样的“存档记录”,进程在离开CPU的时候就要把当前运行的中间结果“存档”,等到下次进程回到CPU上,再恢复之前的“存档”,从上次的结果继续往后执行。(存档/读档)
4.2.4.4进程的记账信息
统计了每个进程在CPU上执行了多久,可以作为进程调度的参考依据。
4.3内存分配 —— 内存管理(Memory Manage)
4.3.1操作系统对内存资源的分配
操作系统对内存资源的分配,采用的是空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰。
操作系统往往使用双向链表组织PCB:
1.创建一个进程,就是创建了一个链表的节点
2.销毁一个进程,就是把链表的节点删除了
3.遍历进程列表,就是遍历链表
4.3.2虚拟地址空间
操作系统给进程分配的内存,是以“虚拟地址空间”的方式进行分配的。每个进程访问的内存地址都不是真实的物理内存的地址。使用指针尤其是解引用指针的时候,需要保证你当前这个指针指向的是有效的内存,否则解引用操作就可能引起未定义行为。若直接分配物理内存空间,一旦指针越界指向其他位置,很可能影响到别的进程的进行。后来操作系统引入了“虚拟地址空间”的概念。
虚拟地址空间并非是在物理内存上真实存在的地址,而知识在该进程内存在。不同的进程中,可以通过相同的虚拟地址,但是实际上对应到的是不同的物理地址。虚拟地址和物理地址,操作系统可以灵活的进行转换。但是对于应用程序来说,只能看到虚拟的地址而看不傲真实的地址。
万一代码发生Bug,发现页表上没有这个地址也就无法真正修改物理内存,也就不会对别的进程的内存数据造成干扰。 此时一个进程无法直接干预另一个进程的内存内容(进程的独立性+每个进程有自己独立的地址空间),大大提升了操作系统的稳定性。
在虚拟地址的加持下,进程就有了独立性,每个进程都有自己的虚拟空间。一个进程无法直接访问或者修改其他进程虚拟地址空间的内容,强化了系统的稳定性。通过虚拟地址空间,把进程隔离开了,但是有时候,还需要让进程之间产生配合/联系,此时就需要进程间通信。
4.5进程间通信(Inter Process Communication)
如上所述,进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备”隔离性
(Isolation)“。但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进行配合地达到应用的目的,如此,进程之间就需要有进行“信息交换“的需求。进程间通信的需求就应运而生。目前,主流操作系统提供的进程通信机制有如下:
1. 管道
2. 共享内存
3. 文件(公共区域硬盘)
4. 网络(Socket)(公共区域网卡)
5. 信号量
6. 信号
其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信。进程间通信就是在隔离性的前提下找一个公共的区域,让两个进程借助这个区域完成数据的交换。
4.6线程
由于进程是比较“重量级”速度慢,消耗资源比较多的。创建、销毁、调度一个进程成本都是很高的,同时资源分配往往是一个比较耗时的操作。而线程则是更加轻量的进程,约定:一个进程可以包含多个线程,此时多个线程每个线程都是一个独立的,可以调度执行的“执行流”,这些执行流之间本身就是并发的。
资源分配:比如系统要给进程分配一块内存,系统就需要遍历自己的空闲内存的表找到一个大小差不多的空间,进行分配。很多个进程都在向系统申请资源,系统进行资源分配的时候是按照串行的方式进行分配的。