目录
🎈冯诺依曼体系
❗外存和内存的概念
❗CPU中央处理器—人类当今科技领域巅峰之作之一
🚩如何衡量cpu
🚩指令(Instruction)
🎈操作系统(Operating System)
🎈什么是进程/任务(Process/Task)
❗进程控制块抽象(PCB Process Control Block)
🎈虚拟地址空间
🎈线程
❗为啥要有线程
🎈线程和进程的区别
🎈冯诺依曼体系
说到计算机,我们要认识一个计算机的祖师爷,那就是冯诺依曼。
著名的冯诺依曼体系(Von Neumann Architecture)构成了计算机工作的原理。
- CPU 中央处理器: 进行算术运算和逻辑判断.
- 存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
- 输入设备: 用户给计算机发号施令的设备.
- 输出设备: 计算机个用户汇报结果的设备.
关于冯诺依曼,要强调的几点:这里的 存储器指的是内存,不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备),外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
一句话, 输入输出设备都只能直接和内存打交道(cpu不能直接访问到外设)cpu速度>存储器速度> 外设速度(为什么有内存的原因)
- CPU的运算速度是非常快的,要远大于外设,那么我们进行输入之后,CPU很快就将问题给解决了,然后传递给输出设备,这个时候又有数据从输入设备进行输出,CPU解决之后,上一次的数据输出设备还没有输出完毕。所以就需要一个速度不是特别快,也不是特别慢的中间物质来进行一个存储。就跟木桶原理很相似
- 这个桶能装多少水,取决于最低的那个木板,因为外设的速度将问题输入之后,由存储器来获取内存,然后CPU从存储器中获取要处理的数据,处理完成之后,将数据返回给存储器,再由外设接收,这样,无论什么时候,CPU只从存储器中获取数据,这样就能大大的提高计算机的效率。
我们可以理解为:内存的引入就是为了解决CPU和外设速度不匹配的问题。
针对存储空间硬盘 > 内存 >> CPU针对数据访问速度CPU >> 内存 > 硬盘
❗外存和内存的概念
其实我们之前所说的内存其实是外存,只是外存和内存被人统一说成内存了,除了特殊情况下,被说成外存。
外存其实就是冯诺依曼体系结构中的 输入和输出设备。而内存则是存储器。
- 与cpu的关系不同: 在电脑中,CPU负责运算和处理,内存负责数据交换。两者属于协作关系,内存相当于是CPU的数据存取通道。而外存要与CPU或I/O设备进行数据传输,必须通过内存进行。
- 易失性不同:内存,是具有易失性的。这意味着当系统断电时,数据就会丢失。外部存储是非易失性的,因此即使没有电源,它也能保存数据(磁盘中的所有东西不会因为我关机了就会消失,而是永久存在,除非你删了);
- 访问权限不同,CPU只能直接访问内存,外存的东西要先到内存CPU才能处理(这就是符合冯诺依曼体系结构,内存解决了cpu和外设速度不匹配的问题)
❗CPU中央处理器—人类当今科技领域巅峰之作之一
🚩如何衡量cpu
衡量cpu有很多指标。最最关注的指标有俩个:主频和核心数
就拿我的电脑的中央处理器做比例吧
🚩指令(Instruction)
我们上面谈到了cpu的俩个重要指标,主频,2.5GHZ主频,就相当于cpu能在1s内可以执行25亿指令。
cpu上能够执行的任务的最小单位
一个cpu设计的时候,就会提供一些可以进行的操作(执行哪些指令)比如:加法指令,读取内存指令。写入内存指令,条件判断/跳转指令,函数调用指令,堆栈操作指令.......
这些最小单元,都是由二进制的方式来表示的机器语言。(不同的cpu支持的指令/机器语言是不相同的)
其实cpu就是一个憨憨吧,你给他发布一个任务,就需要你把任务分成非常非常细致的每个部分,才能让他执行。就比如我让张老师给我做西红柿炒鸡蛋,放进计算机中编程思维就是,cpu,你要准备菜西红柿和鸡蛋,然后你要去洗菜,然后洗锅,然后你插电,放油.....等等一步一步的操作进行。
🎈操作系统(Operating System)
本质上就是用来搞管理的软件
- 操作系统帮助用户,管理好下面的软硬件资源(手段) (对下)
- 为用户程序(应用程序)提供一个良好(稳定,高效,安全)的执行环境(目的) (对上)
🎈什么是进程/任务(Process/Task)
一个跑起来的程序就是进程
程序:是应用程序,没有点开运行的就是程序
进程:一个跑起来的程序就是进程
一个电脑一开机就有百八十个进程正在运行,有的是系统自己创建的,有的是自己手动的,每个进程要想执行都需要消耗一定的资源(进程是资源分配的基本单位),就比如疫情封城,小区发菜,以政府为单位发菜,然后发给小区,然后发给家庭。都是资源分配。
那我们有没有想过一个问题,进程是如何管理的呢?
管理有俩个角度:
- 描述 使用类/结构体,把被管理的一个对象,各个属性都表示除了
- 组织 使用数据结构,把这些表示出来的对象,串起来(为了后续的增删查改)
系统中专门有一个结构体(操作系统内核是c/c++)描述进程的属性。
这个结构体统称为 PCB(进程控制块)
❗进程控制块抽象(PCB Process Control Block)
- 人是通过属性认识的,当属性足够多,这一对属性的集合就是目标对象
- 描述进程——多个属性合起来
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
// 以下代码是 Java 代码的伪码形式,重在说明,无法直接运行
class PCB {
// 进程的唯一标识 —— pid;
// 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
// 分配给该资源使用的各个资源
// 进度调度信息(留待下面讲解)
}
- 每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程。进程里面有很多属性,一个进程可以有一个PCB或者多个PCB。
- 操作系统再通过这种数据结构,例如线性表、搜索树等将 PCB 对象组织起来,方便管理时进行增删查改的操作。
- 创建进程,就是再创建PCB,并且将PCB插入到链表中,销毁进程,就是将PCB从链表中删除并释放,展示进程列表,就相当于遍历链表的每个节点。
想要进一步了解进程的明确特征,就要讨论一下PCB里面的属性。
pcb是一个庞大的结构体,包含了很多的属性,
- 1.pid(进程标识符)
进程身份标识 每个进程都会有一个pid,同一时刻,不同进程的pid是不同的。
- 2.内存指针:(进程持有的内存资源)
- 3.文件描述符表(进程持有的硬盘资源)
- 1.进程的状态
就绪状态:随叫随到,呼之即来,挥之汲去。
就绪状态分俩种情况:第一种情况是进程正在cpu上执行,第二种情况是进程没在cpu上执行,但是时刻准备着去cpu上执行。
阻塞状态: 某个进程,某种执行条件不具备(例如进程等待用户输入),就导致这个进程暂时无法参与cpu的调度执行。(比如命令行让你输入密码,你一直不输入,那么就说明处于 阻塞状态)
- 2.进程的优先级
操作系统在调度多个进程的时候并非一视同仁的,有些进程会给更高的优先级,优先调度。电脑同时运行dota2(优先级更高)和qq(更低),后收到信息。
- 3.进程的上下文
进程从cpu离开之前,需要保存现场,把当前cpu中各种寄存器的状态,都记录到内存中。等到下次进程回到cpu上执行的时候,此时就可以把保存的这些寄存器的值,恢复回去,进程就会沿着上次执行的位置,继续往后执行。(我们手机上的计算器,我们将计算器进程从后台清除后,我们下次再打开计算器的时候,我们发现还是会保留原来的值,这就是上下文的运用)——存档,读档。
- 4.进程的记账信息
通过优先级机制,对不同的进程分配了不同权重的资源,有可能会出现极端的情况,所有资源都给某个进程,其他进程一点都没捞着。记账信息会记录当前进程持有的cpu情况(再cpu执行了多久)就可以作为操作系统调度进程的参考依据
比如我们有三个好朋友,但是一个星期,一周四天都和朋友A玩,俩天都和朋友B玩,1天就呆在家里,那么朋友C怎么办,这样长期下去C对我的热情就会降低,就会和他自己的好朋友玩耍,所以我们要适当的安排点时间给朋友C。
🎈虚拟地址空间
比如说进程A和进程B分别分配了固定的内存大小,但是B进程越界访问了A进行的内存,把A内存写坏了(写成错误的值了),A进程就可能崩溃了。
🎈线程
所以衍生的 线程的特点:
- 1.每个进程都可以独立的去cpu上调度执行
- 2.同一个进程的多个线程之间,共用同一份内存空间和文件资源。(创建线程的时候,不需要重新申请资源了,直接复用之前已经分配好的进程资源,省去了资源分配的开销,于是创建的效率更高了)
因为量多,所以一个生产线是不够的,我们的方案一就是再建个院子,然后再院子里创建一个生产线,但是把,再建个院子成本比较高,物流线也是需要成本的。
所以我们就可以再同一个院子里再建立一个生产线,这俩个生产线是独立的,各自都能进行生产, 这俩个生产线公用的是一个院子,共用的是一组工人,共用的是一套物流体系,此时我们就可以提高生产力。所以引申到进程中,当我们刚创建一个线程的时候,相当于是和进程一起创建的,还是需要有一定的开销去申请资源的(这个帐是记在进程头上的)后面再创建进程,开销就省下了,因为每个线程是独立的,但是共用同一份资源。
❗为啥要有线程
- 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU 资源.
- 有些任务场景需要 "等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程.
🎈线程和进程的区别
- 进程包含一个线程,也可以包含多个线程。
- 进程和线程,都是用来实现并发编程场景的,但是线程比进程更轻量,更高效。
- 同一个进程的线程之间,共用同一份的资源(内存+硬盘),省去了申请资源的开销
- 进程和进程之间,是具有独立性,一个进程挂了,不会影响别人。
- 线程和线程之间(前提是同一个进程内),是可能会相互影响的。(线程安全问题+线程出现异常)
- 进程是资源分配的基本单位,线程是调度执行的基本单位。
今天发烧了。也得完成任务。