大部分教程知识点记录于慕课网的视频教程。
计算机组成原理基本知识:
一:CUP
-
Core
:核心,既CPU的内核,cpu中间的核心芯片,单晶硅制成。cpu可分为单核和多核cpu。 每一个核都是独立的运算单元,可以完成独立的计算,接收指令,处理数据等。 - 单核cup: cpu只有一个用来处理数据的核心。
- 多核cpu:cpu中有多个进行处理数据的核心。另外,
cpu核数和性能的关系是呈 线性增长的
。 -
赫兹(HZ)
:代表cpu的频率。cpu是以高低电平的转换来工作的,听过一个频率的概念,来表示cpu的性能。例如 2GHZ表示,每秒进行高低电平切换20亿次。 - 目标:要学会充分理解和利用cpu的多核性能,需要懂得怎样去使用,什么样的场景下去使用,怎么样去利用cpu性能。
- (1)CPU的功能
- 控制程序的顺序运行,
程序实际上就是串行的一系列有序的指令。
- 产生完成每一条指令所需的控制指令。(译码器)
- 对各种操作加以时间上的控制。(时序发生器)
- 对数据进行逻辑运算和逻辑加工。(运算器)
(1)cpu内核的主要组成
控制器:协调和控制计算机运行。
-
程序计数器
:主要用来存储下一套指令的运算地址。cpu运行时,就是不断在程序计数器中取出指令,并执行。 - 时序发生器:主要负责发出信号的脉冲,产生频率稳定的电信号,每个步骤都有时间的限制,时间的限制就是通过电信号的频率来进行控制的。
- 指令译码器:负责把指令转换为相关的电信号的译码器件。
- 其他各种寄存器:暂时的存储一些数据。
(2)运算器:数据的运算加工。
- 数据缓冲器:包括数据输入缓冲,输出缓冲,负责数据的暂时缓冲。
- 通用寄存器:
- ALU:负责计算的元器件。
- 状态字寄存器等:负责进行计算状态的保存。
(2)高速缓存:
- 处于存储器的部分,后面介绍。
二:存储器
(1)存储器的存次结构
- 1.缓存: 上面提到的高速缓存等,速度最快,价格高。
- 2.主存:主要存储, 内存条,即时存储,断电数据丢失。速度始终,价格适中。
- 3.辅存:磁盘,SSD等。断点依然可以保存数据。速度低,价格低。
出现层次性结构的原因:
局部性原理。 是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。就是2-8定律,20的存储区域,将会占用CPU访问的80%的时间。- 层次结构实现原理:在cpu与志村之间增加一层速度快(容量小的)
Cache(缓存),解决主存速度不足的问题
。
操作系统基本知识
一和二是 B站上的网课学习内容笔记。可以直接跳到三。
一: 相关基本概念
- job(作业):是指,计算机用户在一次上机过程中眼球计算机系统为其所做工作的合集;作业中每项相对独立的工作称为:作业步
- Thread(线程):程序的一次相对独立的运行过程(动态过程),是系统调度的最小单位。
- 进程:是系统资源分配的最小单位,也就是说,进程是系统中拥有资源的最小实体。一个进程可以包括多个线程,线程被调度,使用进程的资源。
- Virtual Memory(虚拟存储):是进程的逻辑地址空间把实际的内存空间进行虚拟扩大。 也就是把部分外存空间,(运用某种手段或算法)虚拟为内存使用,让用户感觉 内存空间变大了
- File(文件):命名了的字节流(对一团字节流进行命名,就可以说这团字节流是你的一个文件)
二:相关系统
- 单道批处理系统:外存上是一批作业在排队(批),内存上只有一个作业执行(单道)
- Monitor早期的在内存中的操作系统,来实现将一个作业从 外存调度到内存进行执行(通过算法,决定将那个作业调用到内存)。
- 过渡(单到多道):浪费资源,当执行io等操作时,cpu只能等待io结束,才能接着执行,利用率低下。
- 多道批处理:
- 系统允许多个任务进入内存(1.就涉及到内存划分,多个任务如何进入到内存),在内存还是要排队(等cpu资源)
- 总结: 外存中作业配对等待进入内存,多个任务进入内存,还要排队等待 cpu执行它。
(1)多道程序中遇到的问题:
- 同步(协调)也叫进程同步:例如:计算进程a,打印进程b,打印进程b需要等计算进程a计算出来结果,通知b后,才能打印。
- 互斥:比如打印机,只允许一个进程使用完了,才能另一个使用
- 不确定性:不受环境配置影响,执行结果是确定的,不能是可变的。
- 死锁:竞争资源,卡死。
(2)操作系统分层结构风格
- 就像是计算机网络上面的 OSI7层结构。
每一层向上层提供服务,又隐藏自己,就好像直接是 网络层到网络层传输,忽视下层
。 操作系统,我们在操作系统的平台上开发,也是使用操作系统的提供接口,但不在乎这些接口,只管自己这层对软件的开发,下层是透明的。 - Liunx:是一个分块的操作系统。(因为有众多人分块的实现各个部分功能)
模式
:简单地说,就是程序运行过程中使用的,由硬件体系结构提供的CPU特权模式。-
用户态,内核态:
用户使用 用户模式(核外子系统),调用核心子系统,但是 核心子系统,不会去调用你写的程序。
进程
- 进程的构成:程序+数据+PCB(进程控制块,系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。使并发执行的每一个程序(含数据)都能独立的运行)
- 目的:使程序可以并发的执行。但是会出现资源竞争等问题,需要合理解决。
- 进程状态之间的转换:
- 交换技术:(在linux磁盘分区时,有这样的分区)
- 程序的挂起状态: 我猜测虚拟机的挂起就是这样的状态。 挂起就是运用到 交换技术,将程序和数据从内存转移到外存中去。
三: 操作系统的基本功能:
(1)操作统一管理计算机不同的资源:
- 根据上节的计算机组成内容,可以抽象出很多不同的资源。
- 1.处理器资源
- 2.IO设备资源
- 3.存储器资源
- 4.文件资源
-
管理方式:
驱动,比方说使用网卡等,都需要安装驱动,是一种贴近硬件的一种程序,是集成在操作系统内部的,内核态中的。
(2)实现对操作系统资源的抽象
- 1.有了操作系统,用户在编程的时候就不需要面向硬件接口进行编程(面向硬件编程是相关驱动的工作),
开发人员编写程序,一般都是在操作系统之上进行编程的,使用的计算机资源,都是经过操作系统抽象出来的。
- 举例子:
IO设备管理软件,虚拟设备
。开发者再使用IO设备的时候,写的其实是虚拟的设备,实际的设备是由驱动去完成的,接口是由驱动或者是操作系统提供给我们的。文件管理软件(也称为文件系统)
:读或者写一个文件的时候,我们不需要知道文件的具体位置,操作系统会提供给我们一个接口,和一个文件的句柄
(可以称之为虚拟的文件)。在程序里只需要对这个虚拟的文件进行读或者写,在硬件的层面,就会自懂的帮我们完成硬件的保存和读取。从程序开发者的角度。这些硬件资源都被操作系统所抽象出来了
,实现了对计算机资源的抽象,我们实际上操作的都是对计算机资源的一个抽象,并不是实际的操作底层的硬件。
(3)操作系统提供了用户与计算机之间的接口
操作系统提供了 系统调用,命令行,图形窗口三种形式的接口调用。
-
系统调动
: 是比较专业的接口,需要有一定的开发基础。比如平时的创建进程(pthread),打开文件,网络发送(socket),都是系统调用。使用操作系统给开发人员提供的接口。
四: 操作系统的用户态与内核态
由来:
(1)内核态: 专门用来运行内核态相关的程序
- 内核空间:存放的是内核代码和数据
- 进程执行操作系统内核的代码
- cpu可以访问内存所有数据,包括外围设备
支撑功能
资源管理能功能
(2)用户态:用来运行用户自己编写的一些程序。
- 用户空间: 存放的是用户程序的代码和数据
- 进程在执行用户自己的代码(非系统调用之类的函数)
- CPU只可以访问有限的内存,不允许访问外设。
用户态切换到内核态的三种方法
:系统调用,异常中断,外围设备的中断。- 外围设备的中断:一般是指磁盘,网卡,键盘等。**举例说明:**例如cpu需要读取磁盘上的数据, cpu和磁盘的速度差别很大,发出读写信号后,cpu是不可能去等磁盘读取数据完成的,这是就会出现一个叫做
DMA的设备
,出现在两者之间。cpu在发送了读取信号后就去干别的事情了,等到dma设备读取完成后,发送中断信号,这是CPU才会从用户态切换到内核态来处理DMA的数据。
四: 并行与并发
-
并发:是指具有同时处理多个任务的能力。
(同一时间间隔发生) -
并行:是指真正可以在同一时间,处理多个任务的能力。
(同一时间发生) - 并发系统:
既有并行,也有并发,一般通常叫做并发系统。
操作系统中的并行与并发
- 单核cpu:中只能够并发的执行,也就是同一时间只能执行一个任务,串行执行。
- 多核CPU:例如四核cpu。拥有四个核心。可以真正的同时执行四个程序。
四核之间任务并行执行,每个核里又是很多任务并发执行!
- 分时系统: 给任务分配时间片,一段时间内轮流执行。
五:同步,异步
- 一个函数,调用另一个函数,可能要等另一个函数准备好数据。调用方一直等待对方准备数据,就是同步。
- 异步, 被调用函数,直接返回,告诉调用函数,你先去忙其他的事吧,等我准备好再通知你,然后继续准备数据。准被完成后,在告诉调用函数去读取数据。调用函数不需要等待。
同步和异步,强调的是消息通信机制!
- 阻塞和非阻塞:强调的是程序在等待调用结果时的状态。(例如I/O模型中的阻塞和非阻塞)
六:操作系统进程
-
目的
:多道程序环境下,使程序能够并发执行。隔离资源,运行环境,提升资源利用率。 进程是系统进行资源分配和调度的基本单位。
- 组成:程序段,相关数据段和PCB三部分构成进程实体(又称进程映像)。
进程的状态转换
,请参考上面二的介绍。PCB(进程控制数据块)
:属于操作系统内核的一种数据结构,用来描述和控制进程运行的通用数据结构。包括:进程标识符(用户程序起的进程名字),内部标识符(进程号),处理机状态,进程调度信息,进程控制信息等
- 进程用户空间也保存着一些信息:
进程调度算法
非抢占式调度, 当前进程主动方放弃CPU
-
抢占式调度: 当前进程被动放弃CPU,允许终端当前执行的进程(进程拥有优先级)
就绪队列: - 先来先服务算法:谁先来先服务谁,知道运行好了,自动退出再换下一个。
- 短作业优先算法:预估进程剩余所需运行时间,时间短的优先调度,要求就绪队列规模较小。时间估算也不一定准
- 最高响应比算法:
等等还有很多,比如有时间片轮转,优先级调度算法。
用户级线程:
- 切换成本低,与内核线程之间是多对一的。由用户自行调度,内核无法干涉。
- 内核线程阻塞,所有线程无法运行
组合方式线程
:管理工作既发生在内核态也发生在用户态。多对多
,不会因为内核线程的阻塞,导致所有用户态线程不能执行。
常见的编程语言的线程模型
- C/C++语言:使用原生的操作系统线程
- java和上面的一样,用户态,内核态1对1.
- javascript:主要运行在浏览器的,单线程语言。 可以通过async等关键字实现用户态的线程,一对多
- go语言: 典型的组合方式,
线程调度模型:G-P-M
。G代表协程,用户级线程,M内核级线程,P就是G和M之间的调度对象,用来调节G 和 M之间的关系。 - python: 组合方式的实现方式
补充探究的内容:用户态线程,内核态线程
- 可以对这些问题进行考究:下面是里面的图片
- 后面关于书中介绍的线程的创建等,就不去截图了。
(后来的一些理解)
进程与线程的上下文切换
-
什么是上下文
:cpu切换执行任务时,需要得到的信息。 就两个人聊天,突然加进来另外一个人,他中途到来,不知道我们上文说了什么,所以也听不懂我们后面要说啥。
寄存器级别上下文:
- 保存在CPU核心里面的
用户程序级别上下文
- 主要保存在主存中,和当前运行的进程,用户级的数据,包括程序的逻辑等。
系统级别的上下文
协程
协程就是用户级的线程。
- 平时所说的16核32线程,指的是内核线程。