基础知识-关键字

(23年7月31号)

资料参考

2021年计算机组成原理考研复习指导 | 王道考研
2021年 操作系统考研复习指导 | 王道考研
重学计算机笔记系列 | 闪客sun | cnblogs
从根儿上理解MySQL的索引 | BILIBILI | 蝉沐风的码场
Linux系统启动管理
全网最硬核解读计算机启动原理 | cnblogs | 闪客sun
/etc/inittab文件说明 | csdn | 人而已
/etc/inittab文件详解
Linux之init.d、rc.d文件夹说明
Linux 中 rc.local、init.d、rc.x、init 这几个文件(夹)各有什么作用?启动执行的脚本应该均放在 rc.local 中吗? | 知乎zhihu | echo1937
systemd详解
systemd | man | freedesktop
Systemd简要介绍 | Solinx | 码农Linx
POSIX标准 | BILIBLI | 生菜八分
POSIX API | cnblogs | alexliu2360
posix是什么都不知道,还好意思说你懂Linux?| lxlinux | 良许
计算机网络期末复习提纲(全知识点总结)| CSDN | mcyuuji

计算机组成原理

可以在计算机中直接执行的语言和用助记符编写的语言是(机器语言)和(汇编语言)。机器语言是唯一可以直接执行的语言,汇编语言用助记符编写。而正则语言是编译原理中符合正则文法的与语言。

边翻译边执行的是(解释)程序,把汇编语言源程序转变为机器语言程序的过程是(汇编)。由高级语言转化为汇编语言的过程成为(编译)。

到目前为止,计算机中所有的信息仍以二进制方式表示的理由是(由物理器件的性能决定)。与逻辑电路中的高、低电平对应。

硬件

主存储器

基本组成是

地址寄存器→存储体←→数据寄存器
    ↑       ↑       ↑
    |       |       |
    ————时序控制逻辑———

地址寄存器(MAR)存放(访存地址)。用于寻址,位数对应着存储单元的个数。
存储体存放(二进制信息)
数据寄存器暂时存储从(存储体)中(要读或写的信息)
时序控制逻辑操作(所需的各种时序信号)

运算器

用于进行算术运算和逻辑运算。
算术运算,加减乘除;逻辑运算,与、或、非、异或、比较、移位等运算

作用 符号
等于 ==
不等于 !=
小于 <
大于 >
小于等于 <=
大于等于 >=
&&
||
!
异或 ^
  • &&:同为真时为真
  • ||:同为假时为假
  • ^:相同为假

控制器

控制器→(程序计数器)PC→(地址寄存器)MAR——————————————————————→地址
↑ | ↑
| | 标志寄存器(PSW)←算术逻辑单元(ALU)←通用寄存器(GPRs)
| |                     ↑  |              ↑
| |—————————————————————|——|——————————————|——————————————→ (控制主存储器)
|                          ↓              |
(指令寄存器)IR      (数据寄存器)MDR—————————

PC存放执行指令
IR存放当前指令,呢哦人能够来自MDR。指令的操作码OP(IR)送至CU,分析指令并微操作命令序列;地址码Ad(IR)送往MAR,用以操作数。


软件

计算机工作过程

  • 程序和数据装入主存储器
  • 将源程序转换成可执行文件
  • 从可执行文件的首地址开始逐条执行指令

以C语言为例子

hello.c→(预处理)→hello.i→(编译器)→hello.s→(汇编器)→hello.o→(连接器)→hello
                                                      printf.o__↑

指令执行过程

  • 取指令:PC→MAR→M→MDR→IR
  • 分析指令:OP(IR)→CU
  • 执行指令:Ad(IR)→MAR→M→MDR→ACC

多级层次结构

M4(高级语言机器) 用编译程序翻译成汇编语言程序
M3(汇编语言机器) 用汇编程序翻译成机器语言程序
M2(操作系统机器) 用机器语言解释操作系统
-----------------  软/硬件交界面
M1(机器语言机器) 用微程序解释机器指令
M0(微指令系统) 由硬件直接执行微指令

应用程序-高级语言-汇编语言-操作系统-指令集架构层-微代码层-硬件逻辑层

存储程序

存储程序是指将指令以代码的形式事先输入计算机主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。
计算机按此原理有5大功能:数据传送、数据存储、数据处理、操作控制、操作判断。

运算速度

  • 吞吐量:系统在单位时间内处理请求的数量
  • 响应时间:从用户提交请求到系统首次产生响应并获取其所需要的结果所用的时间
  • 时钟周期:节拍脉冲或T周期,CPU中最小的时间单位
  • 主频:机器内部的主时钟的频率,时钟周期的倒数
  • CPI:执行一条指令所需的时钟周期数
  • 执行时间:运行一个程序所花费的时间
  • MIPS:每秒执行多少百万条指令
  • FLOPS:每秒执行多少次浮点运算,分为MFLOPS、GFLOPS等

数据

数制与编码

  • 二进制:2^i,i为位数。2=0000 0010,4=0000 0100,8=0000 1000。以此类推
  • 八进制:二进制中的3位数编为一组。1111000010.01101 = 001 111 000 010 . 011 010 = 1 7 0 2 . 3 2 =(1702.32)八进制
  • 十六进制:二进制中的4位数编为一组。1111000010.01101 = 0011 1100 0010 . 0110 1000 = 3 C(12) 2 . 6 8 =(3C2.68)十六进制
  • 十进制:(11011.1)二进制=1x2^4 + 1x2^3 + 0x2^2 + 1x2^1 + 1x2^0 + 1x2^-1 =27.5
    123.6875=123进行2的因式分解得出(1111011)二进制 + 0.6875进行乘2取整,乘积到1.0即为结束 = (1111011.1011)二进制

真值和机器数

真值:"+""-"符号,真值是机器数所代表的实际值
机器数:"0"代表"正 +","1"代表"负 -",如0,101=0101=+5

原码:X=+101011 , [X]原=00101011= 00 101011 ; X=-101011 , [X]原=10101011= 10 101011
反码:X=-101011 , [X]原=10101011= 1 0 101011 , [X]反=11010100=1 1 010100
补码:X=-101011 , [X]反=11010100=1 1 010100 , [X]补=11010101=1 1 010101(反码的基础上按照正常的加法运算加1)
移码:X=-101011 , [X]补=1 1 010101 ,[X]移=0 1 010101(将补码的符号位取反)

  • 源码是计算机唯一认识的语言结构;
  • 反码在源码的基础上符号位不动,其他取反;
  • 补码=反码+1(符号位参与运算)。补码是为了进行做加减运算,因为计算机只有加法计算器,所以a-b的处理方式为a+(-b)
  • 移码在补码的基础上,符号位取反。移码只能用于表示整数

校验码

  • 基本原理:增加冗余码
  • 码距:合法编码之间不同二进制位数的最小值;
    1100和1101之间的码距为1,因为只有1位改动;1001和0010之间码距为3,因为有3位改动,1、3、4位改动。
    所有码距的算法就是对比二进制数字,然后看几个位置不同,不同的数量为码距。

码距与检错、纠错能力:

码距 d>=e+1:检查e个错误
码距 d>=2t+1:纠正t个错误
码距 d>=e+t+1:同时检查e个错误,并纠正t个错误。(e>=t)

校验方式

奇偶:在原编码上加一个校验位,校验整个校验码中1的个数是否为奇数或偶数
海明:按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,产生多位检测信息,并得出出错位置
循环冗余(CRC):在K位信息码后再拼接R位的校验码,利用模2除法检验编码正确性

例子
  1. 二进制1001101和1010111的奇校验码和偶校验码
    设最高位为校验位
    (原)1001101 (奇)11001101 (偶)01001101
    (原)1010111 (奇)01010111 (偶)11010111

  2. 在n=4、k=3时,求1010的海明码
    设n为有效信息的位数,k为校验位的位数,则应满足
    n+k<=2^k -1(若要检测两位错,则需再增加1位校验位,即k+1位);n+k=7<=2^3 -1成立。
    设信息位为D4D3D2D1(1010),校验位为P3P2P1,海明码为H7H6H5H43H2H1

Pi在2^i-1的位置上,其余各位为信息位
则H4=P3;H2=P2;H1=P1,则海明码的分布为:
H7 H6 H5 H4 H3 H2 H1
D4 D3 D2 P3 D1 P2 P1
1 0 1 ? 0 ? ?

D1在H3上,P2P1校验;
D2在H5上,P3P1校验;
D3在H6上,P3P2校验;
D4在H7上,P3P2P1校验;

= P1(H1) + P2(H2) + P3(H4)
3 1 2
5 1 4
6 2 4
7 1 2 4

所有位求异或
P1 = D1⊕D2⊕D4 = 0⊕1⊕1 = 0
P2 = D1⊕D3⊕D4 = 0⊕0⊕1 = 1
P3 = D2⊕D3⊕D4 = 1⊕0⊕1 = 0

所以1010对应的海明码为1010010(101 0 0 10)

S1=P1⊕D1⊕D2⊕D4
S2=P2⊕D1⊕D3⊕D4
S3=P3⊕D2⊕D3⊕D4

S3S2S1的值为 000 时,则说明无错;或者说明出错。并且这个数为错误位的位数。


内存和存储

主存速度缓慢的原因:主存增速与CPU不同步,执行指令期间多次访问主存

主存容量不足的原因:

  • 存在制约主存容量的技术因素:如由CPU、主板等相关技术指标规定了主存容量
  • 应用对主存容量需求不断扩大:window98 -- 8M,windows 8 -- 1G

※存储体系结构化层次: CPU -- Cache1 -- Cache2(解决速度) -- 主存 -- 辅存(解决容量)

存储体系结构化层次理论基础:

  • 时间局部性:程序体现为循环结构
  • 空间局部性:程序体现为顺序结构

半导体随机存储器:

  • SRAM存储器:存取速度快,但集成度低,功耗大,做缓存
  • DRAM存储器:存取速度慢,但集成度高,功耗低,做主存

DRAM刷新方式:集中刷新、分散刷新、异步刷新

主存容量的扩展:

  • 位扩展:将芯片的地址、片选和读写控制端相应并联,数据端分别引出
  • 字扩展:将芯片的地址、数据、读写控制线相应并联,片选位译码给出
  • 字位扩展:同时进行字扩展和位扩展

位扩展法:8K * 8位 --> 8K * 32位
字扩展法:8K * 8位 --> 32K * 8位
字位同时扩展法:8K * 8位 --> 32K * 32位

片选:

  • 线选法:用除片内寻址外的高位地址线直接分别接至存储芯片的片选端
  • 译码片选法:用除片内寻址外的高位地址线通过译码器产生片选信号

提速方案:

  • 双端口RAM:有两个独立的端口,允许两个独立的控制器同时异步地访问存槠单元
  • 多模块存储器:
    • 单体多字:一次并行读出多个字,地址必须顺序排列并处于同一单元
    • 多体并行:
      • 高位交叉:高位地址为信号,低位地址为体内地址
      • 低位交叉:低位地址为信号,高位地址为体内地址

Cache

引入目的:解决主存与CPU在速度上的矛盾

cache的工作过程:

  • 数据:cpu与cache交换字,cache与内存交换块
  • 读:命中,不命中
  • 写:写穿策略,写回策略

写策略

  • 写穿策略(write through):同时写缓存和内存,好像穿过缓存一样。若不命中,先写到主存中,并选择性地同时分配到缓存中(写分配/非写分配)
  • 写回策略(write back):写到缓存后不管了,只有当缓存的内容替换回主存时再管,需有脏位。好像隔段时间后再写回到主存中一样

映射方式

  • 直接映射:主存数据块只能装入Cache中的唯一位置
    • cache行号 = 内存块号 % cache行数
  • 全相联映射:可以把主存数据块装入Cache中的任何位置
    • cache行号 = random(内存块号)
  • 组相联映射:将Cache分为若干组,一个数据块可以装入一组内的任何一个位置
    • 两者结合。8行1路组相联就是全相联,8行8路组相联就是直接相联

映射机制

  • 相联存储器:地址本身包含着位置啊可比较的信息啊等内容信息,可根据区分地址内容进行寻址
  • 主存地址 = 块地址 + 块内偏移地址 = (Tag + Index) + 块内偏移地址
  • cache结构
    • 好多行,每行与主存块大小相等
    • 每行 = tag + data + valid + dirty

替换算法

  • 先进先出法-FIFO:选择最早调入的行进行替换
  • 最不经常使用法-LFU:将一段时间内被访问次数最少的存储行换出
  • 近期最少使用法-LRU:选择近期内长久未访问过的存储行作为替换的行
  • 随机替换法:随机地确定替换的Cache块

虚拟存储器

解决问题:主存容量不足。希望向程序员提供更大(比主存大)的编程空间
分类:

  • 基本分页:内存分为固定的块,按物理结构划分,会有内部碎片
  • 基本分段:内存块的大小不固定,按逻辑结构划分,会有外部碎片
  • 段页式:基本分段和基本分页的结合,会有内部碎片

组成部分:

  • 页表机制:通过查表获取相关信息
  • 中断机构:要访问页不在内存时产生缺页中断
  • 地址变换机构;把逻辑地址变换成物理地址
  • 内存和外存:需要一定容量的内存和外存的支持

页式实现方式:MMU(Memory Management Unit) + 页表 + TLB(Transaction Lookaside Buffer:地址转换后备缓冲器)

页式转换过程:虚拟地址 = 虚拟页号 + 页内偏移 ==> 物理页号 + 页内偏移


I/O系统(输入/输入系统)

组成:外设、接口、总线、管理软件

基本功能:

  • 完成计算机内外的信息传递
  • 保证CPU正确选择输出设备
  • 利用缓冲等,实现主机与外设的速度匹配

特点:异步性、实时性、设备无关性

输入过程:CPU把地址值放入总线 --> CPU等候设备数据有效 --> CPU从总线读入数据存入寄存器
输出过程:CPU把地址值放入总线 --> CPU把数据值放入总线 --> 设备等数据有效取走数据

IO系统性能:存储IO、通信IO

  • 连接特性:哪些设备可以和IO相连
  • IO系统容量:IO系统可以容纳的设备数
  • 响应时间:从用户输入命令到得到结果所花的时间(s)
  • 吞吐率:单位时间完成的IO操作次数(用IOP表示)

I/O方式(输入输出方式)

无条件IO方式:执行IO指令时,CPU默认外设已经准备就绪,外设很难满足这一点

程序控制IO方式:执行IO指令时,先获取设备状态(设备状态寄存器),决定下一步操作(程序决定)

  • 数据要经过CPU,CPU还要浪费大量时间查询设备状态

中断IO方式:外设主动通知CPU接收或输出数据,有实时性

DMA方式:由硬件执行IO,外设准备好后通知DMA,DMA接管总线,完成数据交换

  • 既有中断的优点,又降低了服务的开销

通道和IO处理机方式:外设种类很多速度差别很大,将外设管理工作从CPU总分离出来

  • 通道本身就是个简单的CPU,执行IO指令的处理机
  • IO处理机是通道的进一步发展,更像一个CPU了

程序中断方式

概念:CPU由内部外部事件引起CPU中断正在运行的程序,具有随机性(符合输入输出系统特性)
作用:

  • 实现CPU与I/O设备的并行工作
  • 处理硬件故障和软件错误
  • 实现人机交互,用户干预机器需要用到中断系统
  • 实现多道程序、分时操作,多道程序的切换需借助于中断系统
  • 实时处理需要借助中断系统来实现快速响应
  • 实现应用程序和操作系统(管态程序的切换),称为“软中断”
  • 多处理器系统中各处理器之间的信息交流和任务切换

程序中断方式示意图如下:

                          工作      完成             工作     完成
                  ————————————————————    ————————————————————      ——————————
       外部设备    ↑                中|    ↑  中             中|   ↑  中
                  |                断| ————— 断             断| —————断
    ↗  中断服务程序 |                请| ↑    |返             请| ↑   |返
CPU               |                求↓ |    ↓回             求↓ |   ↓回
    ↘  现行程序    ——————————————————————    ————————————————————   ————
                  启动               响应                     响应

类型:

  • 内部中断(软件、异常)
  • 外部中断(可屏蔽中断INTR、不可屏蔽中断NMI)

基本功能:
中断信号的保持与清除:通过寄存器存起来,处理完清零
中断优先级:硬件响应优先序、软件服务优先序(中断服务程序开头,设置自己的中断屏蔽位)
中断源识别:系统分配给每个中断源的代号(中断号),中断号获取可以用硬件或软件方式

中断处理:

  • 响应:每执行完一条指令,就会判断是否有中断请求
  • 处理:保存断点(返回地址)、执行中断程序、返回断点

中断控制:

  • 中断触发方式:指外设以什么逻辑信号去申请中断(边沿触发、电平触发)
  • 中断排队方式:按优先级、循环轮流排队
  • 中断嵌套:中断正在执行的中断程序,不可屏蔽中断不能嵌套
  • 中断屏蔽:处理器内部有个触发器,“1”时才会响应外部中断

可嵌套的中断的处理流程:

————————————	  ↓	—————————————————
↑		关中断		↖
|		  ↓		|
|	       保存断点		|硬件完成
|		  ↓		|
|	    中断服务程序寻址	↙
|		  ↓
|	    保存现场和屏蔽字	↖
中		  ↓		|
断		开中断		|
处		  ↓		|
理	    执行中断服务程序	|
过		  ↓		|
程		关中断		|中断程序完成
|		  ↓		|
|	    恢复现场和屏蔽字	|
|		  ↓		|
|		开中断		|
|		  ↓		|
↓	       中断返回		↙
——————————————		————————————————

中断请求:中断源向CPU发出中断信号
中断判优:判断多个中断源的优先级
响应条件:

  • 有中断源提出中断请求
  • CPU允许中断及开中断
  • 一条指令执行完毕且没有更紧迫的任务

中断隐指令:完成关中断、保存断点、引出中断服务程序
中断向量:查询中断服务程序的入口地址
中断处理:执行中断服务程序最后恢复现场,中断返回

多重中断:

  • 概念:当CPU处理中断时,又有更高优先级的中断请求
  • 条件:
    • 在中断服务程序中提前设置开中断指令
    • 优先级别高的中断源有权中断优先级别低的中断源

中断屏蔽技术:在处理中断时,用中断屏蔽字屏蔽掉某些中断源

DMA方式

原理:数据传送不经过CPU,由DMA控制器实现内存和外设、外设和外设之间的直接快速传递
image

  • 主存地址计数器:存放要交换数据的主存地址
  • 传送长度计数器:用来记录传送数据的长度
  • 数据缓冲寄存器:用于暂存每次传送的数据
  • DMA请求触发器:I/O设备准备好数据后使DMA请求触发器置位
  • 控制/状态逻辑:由控制和时序电路及状态标志组成
  • 中断机构:数据块送完毕后触发中断机构,提出中断请求

传送方式:

  • 停止CPU访存:当需送数据时,停止CPU对主存的访问
  • 交替访存:将CPU周期分为DMA访存和CPU访存两个部分
  • 周期挪用:1/0设各需要访存时,挪用一个或几个存取周期

传送方程:

  • 预处理:完成寄存器初始值之类的准备工作
  • 数据传送:占用总线传输数据,数据传送完全由DMA控制
  • 后处理:CPU执行中断服务做结束DMA处理

操作系统

操作系统基本特征包括并发、共享、虚拟和异步。
并发和共享是操作系统两个最基本的特征,两者之间互为存在的条件:资源共享是以程序的并发为条件的,若系统不允许程序并发执行,则自然不存在资源共享问题;若系统不能对资源共享实施有效的管理,,则必将影响到程序的并发执行,甚至根本无法并发执行。

并发(Concurrence)

并发是指两个或多个事件在同一时间间隔内发生。操作系统的并发性是指计算机系统中同时存在多个运行的程序,因此它具有处理和调度多个程序同时执行的能力。在操作系统中,引入进程的目的是使程序能并发执行。

  • 并发:同一时间间隔
  • 并行:同一时刻

(一个核心,能处理无数的任务事件,但是需要完成两个或以上的任务就需要计划时间(排队),一段时间完成任务1,一段时间完成任务2,中间有一个提示能让你知道要执行哪个任务,叫'进程上下文'。这就叫'并发')
(多个核心,能处理无数的任务事件,但因为有很多的核心,所以1个任务可以分享到1个核心,而不需要排队,这就叫'并行')

共享(Sharing)

资源共享即共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。共享可分为以下两种资源共享方式。

互斥

在一段特定时间内只能由某一个用户程序使用。当这个资源正在被使用的时候,其他请求该资源的程序必须等待,在这个资源被使用完了以后才由操作系统按一定策略分配给另一用户使用;

同时

在同一段时间内可以被多个程序同时访问。这种同时访问是指宏观上的同时,微观上的还是交替进行的。

虚拟(Virtual)

虚拟技术可归纳为:时分复用(处理器的分时共享)和空分复用(存储器)

异步(Asynchronism)

多个程序并发运行环境中,每个程序何时开始执行、何时暂停、推进速度和完成时间等都是不确定的。

异步与同步是相对的

同步是顺序执行进程,执行完一个进程再执行下一个进程,需要进程之间等待、协调运行;
异步是进程之间彼此独立,在等待其他进程的运行时,本进程继续做自己的事,不需要等待其他进程完成后再工作。


进程控制

  • 进程:进程是进程实体的运行过程,是操作系统进行资源分配和调度的独立单位
  • (这里说的系统资源是处理机、存储器和其他设备服务于某个进程的“时间”)
  • 进程解剖:OS管理进程的数据结构P + 内存代码 + 内存数据 + 通用寄存器R + PSW

进程状态:

(新建)创建→(就绪) 调度→ (运行)退出→(终止)
              ↗   ←时间到    ↘
          事件发生          事件等待
              ↖             ↙
                  (阻塞)
  • 就绪态→运行态:处于就绪态的进程被调度后,获得处理机资源(分派处理机时间片),于是进程由就绪态转换为运行态。
  • 运行态→就绪态:处于运行态的进程在时间片用完后,不得不让出处理机,从而进程由运行态转换为就绪态。此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程度将正在执行的进程转换为就绪态,让更高优先级的进程执行。
  • 运行态→阻塞态:进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如I/O操作的完成)时,它就从运行态转换为阻塞态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式。
  • 阻塞态→就绪态:进程等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞态转换为就绪态。
  • 一个进程从运行态变成阻塞态是主动的行为,而从阻塞态变成就绪态是被动行为,需要其他相关进程的协助。

进程控制:

提交------→就绪队列------→指派-----→处理器------→完成
     |                              |
事件1 |---→事件1等待队列←---等待事件1←--|
     |                              |
事件2 |---→事件2等待队列←---等待事件2←--|
     |                              |
事件n |---→事件n等待队列←---等待事件n←--|

进程控制流程:

  • 进程创建:进程表增加一项,申请PCB并初始化,生成标识,建立映像,分配资源,移入就绪队列
  • 进程撤销:从队列中移除,归还响应资源
  • 进程阻塞:保存现场,修改PCB,移入等待队列
  • 进程唤醒:从等待队列移出,修改PCB,进入就绪队列
  • 进程挂起:修改进程状态并出入相关队列,收回内存等资源送至对换区
  • 进程激活:分配内存,修改状态并出入相关队列

进程切换与模式切换:

  • 流程: 俩进程上下文切换(保存被中断的上下文、进程调度、恢复待运行的上下文)
  • 模式切换:用户态到内核态这种。进程切换必须在内核态完成,所以必须经理模式切换

进程组织:

  • 进程控制块PCB:是OS用于记录进程状态和环境信息的数据结构
    • 标识信息:进程标识(进程标识号、进程组标识号)
    • 现场信息:用户可见寄存器内容、控制/状态寄存器内容、栈指针内容
    • 控制信息:进程调度信息、进程组成信息、队列指引元、通信相关、进程特权信息、处理器使用信息、资源清单信息

线程

  • “轻量级进程”,线程是进程中的一个实体,是被系统独立调度和分派的基本单位。
  • 引入目的:为了更好的使多道程序并发执行,以提高资源利用率和系统吞吐量,增加程序的并发
  • 特点:是程序执行的最小单元,基本不拥有任何系统资源
  • 实现方式:用户级线程、内核级线程
-------------------------------------------
|     -----------------------------       |
|     |(用户地址空间) (进程控制块)  |      |
|     -----------------------------       |
|              ↑          ↑               |
|                  共享                    |
|     -------------     --------------    |
|     | (线程控制块)|     | (线程控制块)|    |
|     |           |     |            |    |
|     |  (用户栈) |     |  (用户栈) |    |
|     |  (内核栈) |     |  (内核栈) |    |
--------------------------------------------
  • 多线程实现的混合策略:一个ULT绑定多个KLT

内存管理(存储管理)

引入目的:更好的支持多道程序并发执行,提升系統性能

程序执行过程:

  • 编译:有编译程序将用户源代码编译成若干目标模块
  • 链接:由连接程序将编译后形成的一组目标模块及所需的库函数链接在一起,形成一个完整的装入模块
    • 静态链接:在程序运行之前链接
    • 装入时动态链接:在装入内存时,采用边装入边链接的链接方式
    • 运行时动态链接:在程序执行中需要该目标模块时,才对它进行的链接
  • 装入:由装入程序将装入模块装入内存运行
    • 绝对装入:适合单道程序环境
    • 静态重定位:适合装入之后不在移动的情况,程序装入内存时转换(早期OS)
    • 动态重定位:适合装入时还会移动的情况,CPU执行时转换,效率考虑需要硬件帮助

地址转换:逻辑地址 --> 物理地址
地址空间:

  • 逻辑地址空间:一个源程序在编译或者链接装配后指令和数据所用的所有相对地址的空间
  • 物理地址空间:内存中物理单元的集合

逻辑地址:用户地址,从零开始编号

  • 一维逻辑地址:(地址)
  • 二维逻辑地址:(段号: 段内地址)

内存保护:

  • 上、下限寄存器:分别与上、下限寄存器比较
  • 基址、限长寄存器:与限长寄存器比较,与基址寄存器相加

连续分配

单一连续分配:分配到内存固定区域,只适合单任务系统,主存区划分为系统区和用户区,采用静态重定位进行地址转换
固定分区分配:分配到内存中不同的固定区域,分区可以相等也可以不等,有主存分配表,容易产生内零头
动态分区分配:

  • 基本概念:按照程序的需要进行动态的划分,按进程内存需求动态分配内存空间,容易产生外零头

动态分区分配算法:

  • 首次适应:按地址从小到大为序,分配第一个符合条件的分区
  • 最佳适应:按空间从小到大为序,分配第一个符合条件的分区
  • 最坏适应:按空间从大到小为序,分配第一个符合条件的分区
  • 邻近适应:与首次适应相似,从上次查完的结束位置开始查找

非连续分配(页式存储管理)

概念:

  • 主存分页架,程序分页。
  • 不同程序页可放在不同主存页架中,不需要连续
  • 页和页架关系由页表维护
  • 用位示图表示主存分配与去配,用进程页表维护进程逻辑完整性

地址:

  • 逻辑地址:页号 + 单元号
  • 物理地址:页架号 + 单元号

快表:

  • 利用Cache存放部分页表
  • 同Cache缓存内存数据一样,也是相联存储器技术,并且有淘汰策略

页面调度算法:

  • 基本分页:内存分为固定的块,按物理结构划分,会有内部碎片
  • 基本分段:内存块的大小不固定,按逻辑结构划分,会有外部碎片
  • 段页式:基本分段和基本分页的结合,会有内部碎片

页式虚拟存储:

  • 页表:标识位 + 主存块号 + 辅存地址

实现:

  • 查页表,若页在内存,则生成绝对地址
  • 若不在内存,发起缺页中断
  • OS响应缺页中断,若内存有空闲页架,则从辅存中调入页。更新页表快表
  • 若无空闲页架,先淘汰页,再调入

虚拟内存与虚拟存储的方式一样

内存管理单元MMU(Memory Management Unit)

作用:管理虚拟存储器的硬件控制线路,把虚拟地址映射为物理地址,并提供内存保护,必要时淘汰页面
实现:用一种数据结构 反置页表IPT

        逻辑地址                                物理地址
    -----------------                        -----------
    |进程表示|页号|位移|                        |页架号|位移|
    -----------------                        -----------
         |     |   |                             ↑    ↑
    -----------┙   └-----------------------------------
    |                   进程号 页号 标志位 链指针    |
    ↓                  -----------------------   |
 哈希函数--→哈希表-----→|                       |→索引
                       -----------------------
                              反置页表

文件管理

文件的组织:

  • 逻辑结构:流式(无结构)文件,将数据按顺序组织成记录并累积保存
  • 物理结构:记录式(有结构)文件
    • 顺序文件:块块之间相连,批处理文件和系统文件一般都这么存。---> 数组
    • 连接文件:有连接字指向下一个块地址。---> 链表
    • 直接文件:又叫散列文件。对内容进行散列存储到相应物理位置。 ---> 散列表
    • 索引文件:为文件建立一个索引表,可多级。 ---> 增加了散列表的链表

目录结构:

  • 单级:全部文件都放在一个目录下
  • 两级:在目录下分出用户目录
  • 多级:将两级结构加以推广,采用树形结构
  • 无环图:在树形结构上加入一些有向边,便于共享

文件共享:

  • 基于索引结点(硬链接):共享文件指向同一个索引节点,例子为 ln /usr/bin/gcc /opt/test/gcc-hard
  • 基于符号链(软链接):保存共享文件的路径名,例子为 ln -s /usr/bin/gcc /opt/test/gcc-soft

文件的存取:顺序、直接、索引
文件的控制:逻辑控制、物理控制
文件的使用:打开、关闭、读、写、控制

文件的存储:

  • 块:存储介质上连续存储的区域,是主存与辅存信息交换的单位
  • 顺序存取设备:光盘、磁带
  • 直接存取设备:磁盘

索引分配(非常重要)

从根儿上理解MySQL的索引 | BILIBILI | 蝉沐风的码场

每个文件的所有的盘块号都集中放在一起构成索引表。

每个文件都有索引块,这是一个磁盘块地址的数组。

索引块的第i个条目指向文件的第i个块。目录条目包括索引块的地址。

要读第i块,通过索引块的第i个条目的指针来查找和读入所需的块。

每个文件都有其索引块,这是一个磁盘块地址的数组。索引块的第i个条目指向文件的第i个块。目录条目包括索引块的地址。要读第i块,通过索引块的第i个条目的指针来找和读入所需的块。

创建文件时,索引块的所有指计都设为空。首次写入第i块时,先从空困空间中取得一个块,再将其地址写到索引块的第i个条目。索引分配支持直接访问,且没有外部碎片问题。

其缺点是由于索引块的分配,增加了系统存储空间的开销。索引块的大小是一个重要的问题,每个文件必须有一个索引块,因此索引块应尽可能小,但索引块太小就无法支持大文件。

可以采用以下机制来处理这个问题:

  • 链接方案:一个索引块通常为一个磁盘块,因此它本身能直接读写。为了处理大文件,可以将多个索引块链接起来。
  • 多层索引:多层索引使第一层索引块指向第二层的索引块,第二层索引块再指向文件块。这种方法根据最大文件大小的要求,可以继续到第三层或第四层。例如,4096B的块,能在索引块中存入1024个4B的指针。两层索引允许18576个数据块,即允许最大文件为4GB。
  • 混合索引:将多种索引分配方式相结合的分配方式。例如,系统既采用直接地址,又采用单级索引分配方式或两级索引分配方式。

混合索引分配的实现

混合索引分配己在UNIX系统中采用。在UNIX system V 的索引结点中,共设置了13个地址项,即iaddr(0)~ iaddr(12)。在BSD UNIX的索引结点中,共设置了13个地址项,它们都把所有的地址项分成两类,即直接地址和间接地址。

(1)直接地址
为了提高对文件的检索速度,在索引结点中可设置10个直接地址项,即用iaddr(0)~iaddr(9)来存放直接地址。换言之,这里每项中所存放的是该文件数据所在盘块的盘块号。假如每个盘块的大小为4KB,当文件不大于40KB时,便可直接从索引结点中读出该文件的个部盘块号。

(2)一次间接地址
对于大、中型文件,只采用直接地址并不现实。可再利用索引结点中的地址项iaddr(10)来提供一次间接地址。这种方式的实质就是一级索引分配方式。图中的一次间址块也就是索引块,系统将分配给文件的多个盘块号记入其中。在一次间址块中可存放1024个盘块号,因而允许文件长达4MB。

(3)多次间接地址
当文件长度大于4MB+40KB(一次间接地址与10个直接地址项)时,系统还须采用二次间接地址分配方式。这时,用地址项iaddr(11)提供二次间接地址。该方式的实质是两级索引分配方式。系统此时在二次间接地址块中记入所有一次间接地址块的盘号。在采用二次间接地址方式时,文件的最大长度可达4GB。同理,地址项iaddr(12)作为三次间接地址,其允许的文件最大长度可达4TB。
image


I/O管理(输入/输出管理)

控制方式

演进过程:轮询 --> 中断 --> DMA --> IO通道
经典布局:南北桥
image

实现

软件实现层次:硬件 --> 中断处理程序 --> 设备驱动程序 --> 独立于设备的IO软件 --> 用户空间的IO软件

  • 用户层I/O软件:实现与用户交互的接口
  • 设备独立性软件:实现用户程序与设备驱动器的统一接口、设备命令、设备保护以及设备分配与释放
  • 设备驱动程序:与硬件直接相关,负责具体实现系统对设备发出的操作指令
  • 中断处理程序:用于处理中断相关事项
  • 硬件设备:包括一个机械部件(设备本身)和一个电子部件(控制器)

IO缓冲:

  • 解决问题:

    • 设备与CPU速度不匹配
    • 逻辑记录大小和物理记录大小不一致
    • 减少IO操作对CPU的中断次数
  • 实现:缓冲区

    • 内存中开辟一个专门临时存放IO数据的区域
  • 分类:单缓冲、双缓冲、多缓冲


启动管理和服务管理

Linux启动过程

Linux系统启动管理
全网最硬核解读计算机启动原理 | cnblogs | 闪客sun

  1. 开机 BIOS 自检,加载硬盘。
  2. 读取 MBR,MBR 引导。
  3. grub 引导菜单(Boot Loader)。
  4. 加载内核 kernel。
  5. 启动 init 进程,依据 inittab 文件设定运行级别。
  6. init 进程,执行 rc.sysinit 文件。
  7. 启动内核模块,执行不同级别的脚本程序。
  8. 执行/etc/rc.d/rc.local。
  9. 启动 tty,进入系统登陆界面。

※RHEL 5为SysVinit,RHEL 6为Upstart,RHEL 7为Systemd

/etc/inittab(inittab文件)

/etc/inittab文件说明 | csdn | 人而已
/etc/inittab文件详解

Linux内核启动完成后,内核通过启动第一个用户进程(init进程)来启动其他用户的进程或服务,因此init是Linux系统中所有进程的父进程。
init进程将解析inittab文件,运行操作系统的配置脚本,对Linux系统进行初始化。
image

#结构如下
identifier:run_level:action:process
  • id:它是每个登记项的标识符,用于唯一标识每个登记项,不能重复
  • runlevels:系统的运行级别,表示process的action要在哪个级别下运行,该段中可以定义多个运行级别,各级别之间直接写不用分隔符;如果为空,表示在所有的运行级别运行。
  • action:表示对应登记项的process在一定条件下所要执行的动作。
  • process:表示启动哪个程序或脚本或执行哪个命令等
si::sysinit:/etc/rc.d/rc.sysinit
  • id 是 si 只是用来标识
  • runlevels 为空则代表的是 所有的运行级别
  • sysinit 是指在系统启动时执行后面的process(也就是/etc/rc.d/rc.sysinit)
  • /etc/rc.d/rc.sysinit 这是一个系统初始化脚本。

action动作表:

动作 作用
respawn init应该监视这个进程,即使它结束也应该被重新启动
wait init应该运行这个进程一次,并等待其结束后再进行下一步操作
once init只运行一次该进程
boot 系统地运行该进程
bootwait 在系统启动时运行,init等待进程完成
ctrlaltdel 当Ctrl+Alt+Del三个键同时按下时运行,把SIGINT信号发送给init
sysinit 在运行boot或bootwait进程之前运行
powerfail 当init收到SIGWR信号时运行
powerokwait 当收到SIGWD信号且/etc/文中 的电源状态包含OK时运行
powerwait 当收到SIGPWD信号,并且init等待进程结束时运行。

在旧式的System V initialization中,/etc/inittab可是个相当重要的文件。init进程启动后第一时间找inittab负责初始化系 统,设置系统runlevel及进入各runlevel对应要执行的命令。
假设当前inittab中设置的默认runlevle是5,则init会运行/etc/init.d/rc5命令,该命令会依据系统服务的依赖关系遍历执行/etc/rc5.d中的脚本/程序。
进入/etc/rc5.d目录可以发现里面的文件都是到/etc/init.d/下对应的脚本/程序的软链接。以S开头的为启动的意思,以K开头的为停止。并且S/K后面的两位数数字代表了服务的启动顺序(由服务依赖关系决定)。

运行级别

  1. 停机(千万别把initdefault设置为0,否则系统永远无法启动)
  2. 单用户模式
  3. 多用户,没有 NFS
  4. 完全多用户模式(标准的运行级)
  5. 系统保留的
  6. X11 (x window)
  7. 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )

init.d和service

Linux之init.d、rc.d文件夹说明
Linux 中 rc.local、init.d、rc.x、init 这几个文件(夹)各有什么作用?启动执行的脚本应该均放在 rc.local 中吗? | 知乎zhihu | echo1937

/etc/init.d包含System V init工具(SysVinit)使用的脚本。这是Linux的传统服务管理软件包,包含init程序(内核完成初始化时运行的第一个进程)以及一些基础设施,用于启动和停止服务并对其进行配置。特别是,/etc/init.d中的文件是响应start,stop,restart和(如果支持)reload命令来管理特定服务的shell脚本。这些脚本可以通过其他触发器(通常是/etc/rcX.d/中的符号链接)直接或(最常见)调用。

/etc/init包含Upstart使用的配置文件。 Upstart是由Ubuntu倡导的年轻服务管理软件包。 /etc/init中的文件是指示Upstart如何及何时向start,stop,reload配置或查询服务的status的配置文件。

/etc/rc.d文件夹说明:

  • /etc/rc.d, 里面存放了rc.local,rc.sysinit,init.d,rcX.d (X包括0-6对应相对runlevel)
  • /etc/rc.d/init.d,存放了各种系统服务的启动关闭的管理脚本,/etc/init.d是他的一个目录链接。
  • /etc/rc.d/rcX.d,里面存放了一些脚本,脚本名字以K开头的,表示STOP动作,名字以S开头,表示Start动作,名称中的数字表示执行次序,数字越小表示越先执行。
  • /etc/rcX.d是他的目录链接,但事实上rcX.d下文件本身就是指向/etc/rc.d/init.d下脚本的链接文件。
  • /etc/rc.d/rc.local,有一个链接文件,路径在/etc/rc.local,系统根据runlevel启动完rcX.d中的脚本之后,会调用rc.local脚本,如果你有一个脚本命令不论在3和5都想开机启动,那么就添加与此,免去rc3.d和rc5.d分别增加启动脚本工作量。

redhat的启动方式和执行次序是:

  1. 加载内核
  2. 执行init程序
  3. /etc/rc.d/rc.sysinit # 由init执行的第一个脚本
  4. /etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
  5. /etc/rc.d/rc.local
  6. /sbin/mingetty # 等待用户登录

第3步rc.sysinit文件主要完成的工作有:

  1. 调入keymap以及系统字体
  2. 启动swapping
  3. 设置主机名
  4. 设置NIS域名
  5. 检查(fsck)并mount文件系统
  6. 打开quota
  7. 装载声卡模块
  8. 设置系统时钟等等。

第4步/etc/rc.d/rc $RUNLEVEL则根据其参数指定的运行模式来执行相应目录下的脚本。

  • 凡是以Kxx开头的,代表kill,即杀死进程,都以stop为参数来调用;凡是以Sxx开头的,代表开始进程,都以start为参数来调用。调用的顺序按xx从小到大来执行。
  • 例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用/etc/rc.d/rc3.d/下的脚本,值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,该脚本是在系统初始化级别脚本运行之后再执行的,因此可以安全地在里面添加你想在系统启动之后执行的脚本。
  • 常见的情况是你可以再里面添加nfs挂载/mount脚本。此外,你也可以在里面添加一些调试用的脚本命令。所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。

service是一个运行System V init的脚本命令,System V init 是/etc/init.d 目录下的参数。分析service可知是去/etc/init.d目录下执行相关程序,服务配置文件的存放目录就是/etc/init.d。

命令查询Linux备忘录(系统服务/service)

systemd和systemctl

systemd详解
systemd | man | freedesktop
Systemd简要介绍 | Solinx | 码农Linx

initd有以下缺点:

  1. 启动时间长。init 进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  2. 启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

systemd 就是为了克服这些缺点而诞生的。它包括 System and Service Manager,为系统的启动和管理提供一套完整的解决方案。Systemd 是Linux 系统中最新的初始化系统(init),它主要的设计目的是克服 System V init 固有的缺点,提高系统的启动速度。
systemd是一个Linux系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序。功能包括:

  • 支持并行化任务;
  • 同时采用socket式与D-Bus总线式激活服务;
  • 按需启动守护进程(daemon);
  • 利用Linux的cgroups监视进程;
  • 支持快照和系统恢复;
  • 维护挂载点和自动挂载点;
  • 各服务间基于依赖关系进行精密控制。

systemd 支持 SysV 和 LSB 初始脚本,可以替代 sysvinit。除此之外,功能还包括日志进程、控制基础系统配置,维护登陆用户列表以及系统账户、运行时目录和设置,可以运行容器和虚拟机,可以简单的管理网络配置、网络时间同步、日志转发和名称解析等。

命令查询Linux备忘录(系统服务/systemctl)

Unit

基本概念:
系统初始化时需要启动各类系统、用户服务,Systemd将所管理的系统资源统一称为Unit,目前Systemd有12中Unit

Service Unit:系统服务
Target Unit:由多个Unit所构成
Device Unit:硬件设备
Mount Unit:文件系统挂载点
Automount Unit:自动挂载点
Path Unit:路径与文件
Scope Unit:非Systemd启动的进程
Slice Unit:进程组
Snapchat Unit:Systemd快照
Socket Unit:进程通信Socket
Swap Unit:Swap文件
Timer Unit:定时器

Unit的配置文件:
  每个Unit都有一个配置文件,用于配置Systemd如何启动Unit,默认从/etc/systemd/system/目录读取配置文件,目前存放的只是符号链接,指向/usr/lib/systemd/system/存放配置文件的目录;使用systemctl enable xxx@xxx.service建立两个目录的符号链接,如配置了开机启动,enable会激活开机启动;
配置文件名的后缀为Unit的种类,省略后缀默认后缀名为.service;

1、配置文件格式
配置文件为文本文件,直接用编辑器打开编辑,一个简单的配置文件如下:分为三个区块组成:Unit、Service、Install,区块的内容为等号连接的键值对,可通过:systemctl cat xxx.service查看配置文件的内容;

[Unit]
Description=描述
[Service]
Type=forking
ExecStart=/usr/bin/sshd
[Install]
WantedBy=multi-user.target

2、配置文件区块
Unit区块:定义Unit元数据,配置与其他Unit的关系,主要字段有:

Description:描述
Documentation:文档链接
Requires:Unit依赖的其他 Unit,如没有运行,当前Unit会启动失败
Wants:Unit配合的其他Unit,如果它们没运行,当前Unit不会启动失败
BindsTo:与Requires类似,它指定的Unit如退出,会导致当前Unit停止运行
Before:如该字段指定的Unit也要启动,那必须在当前Unit之后启动
After:如该字段指定的Unit也要启动,那么必须在当前Unit之前启动
Conflicts:指定Unit不能与当前Unit同时运行
Condition...:Unit运行必须满足的条件,否则不会运行
Assert...:Unit 运行必须满足的条件,否则会报启动失败

Install区块:用于定义如何启动,以及是否开机启动;

WantedBy:值为一个或多个Target,当前Unit激活时(enable)符号链接会放入/etc/systemd/system/目录下面以Target名+.wants后缀构成的子目录中
RequiredBy:值是一个或多个 Target,当前Unit激活时,符号链接会放入/etc/systemd/system/目录下面以 Target 名 + .required后缀构成的子目录中
Alias:Unit可用于启动的别名
Also:Unit激活(enable)时,会被同时激活的其他Unit

Service区块用与Service的配置,Service类型的Unit专属区块,主要字段如下:

Type:定义启动时的进程行为,它有以下几种值:
Type=simple:默认值,执行ExecStart指定的命令,启动主进程
Type=forking:以fork方式从父进程创建子进程,创建后父进程立即退出
Type=oneshot:一次性进程,Systemd会等当前服务退出,再继续往下执行
Type=dbus:当前服务通过D-Bus启动
Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
Type=idle:若有其他任务执行完毕,当前服务才会运行
ExecStart:启动当前服务的命令;
ExecStartPre:启动当前服务之前执行的命令
ExecStartPost:启动当前服务之后执行的命令
ExecReload:重启当前服务时执行的命令
ExecStop:停止当前服务时执行的命令
ExecStopPost:停止当其服务之后执行的命令
RestartSec:自动重启当前服务间隔的秒数
Restart:定义何时Systemd会自动重启当前服务,可能值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定义Systemd停止当前服务之前等待的秒数
Environment:指定环境变量

Target(触发器)

Target由多个Unit所组成,启动某个Target就启动了多个Unit,在系统初始化时只需启动某个Target即可;

systemctl list-unit-files --type=target  查看当前所有
systemctl list-dependencies multi-user.target 查看Target包含的所有Unit
systemctl get-default  查看启动时默认Target

日志

Systemd 统一管理所有Unit日志,只用journalctl一个命令,查看所有日志(内核日志和应用日志),日志的配置文件是/etc/systemd/journald.conf。


POSIX

POSIX标准 | BILIBLI | 生菜八分
POSIX API | cnblogs | alexliu2360
posix是什么都不知道,还好意思说你懂Linux?| lxlinux | 良许


posted @ 2023-06-29 18:08  Mugetsukun  阅读(184)  评论(0编辑  收藏  举报