首页 » 操作系统学习笔记

操作系统学习笔记

操作系统实质上是一个很复杂的控制软件,可以管理应用,资源管理,管理外设等等

操作系统的架构的层次是在硬件之上,应用之下

OS Kernel:可并发(同时存在多个运行的应用)。可共享,可虚拟,可异步

微内核:尽可能将内核功能移植到用户空间,缺点就是性能低

外核和内核:一个负责硬件,一个负责软件

DISK(硬盘存储):存储OS

BIOS:基本I/O处理系统(加载外设以及加载软件来运行OS) (basic I/O system)

BootLoader:加载OS

POST(加电自检,查找显卡和执行BIOS)

系统调度:来源于“合法”的应用向系统发出服务请求的(同步或者异布)

异常:来源于“不良”的应用非法指令(或者应用意想不到的请求,应用无法获得资源需求)(同步)

中断:来源于外设对于硬件设备和网络中断(异步)

逻辑化地址空间,独立地址空间,可访问相同内存,更多内存空间(虚拟化)

物理地址空间:硬件支持的地址空间

逻辑地址空间:应用程序拥有的内存范围

操作系统为了运行多个程序,进行了内存地址的隔离(分配独立的虚拟内存地址),虚拟内存地址和物理内存地址是映射关系

应用逻辑地址映射到物理地址

CPU需要逻辑地址上的内存内容(ALU),内存管理单元(MMU)寻找逻辑地址和物理地址之间的映射,控制器将从总线发送物理地址的内存内容的请求

内存发送物理地址内存内容给CPU(告诉CPU,物理地址找到了),建立逻辑地址和物理地址之间的映射(确保应用互不干扰)

虚拟地址和物理地址的映射关系管理

内存分段(内存被看成一组不同长度的段)

内存分段下的虚拟地址分为段选择⼦和段内偏移量

段选择⼦保存在段寄存器中,段选择⼦其中的段号被用于段表的索引,段表中保存的是这个段的基地址和段界限等等

而段内偏移量是位于0和段界限之间的,如果段内偏移量合法,那么段内偏移量加段的基地址得到物理内存地址

分段的内存碎片问题,如果某个程序占用了128mb内存,然后该程序被关闭了,释放128mb内存,如果这个128mb内存不是连续的,而是被分段了,这将导致没有内存空间打开另一个内存占用128mb的程序

内存分页(将物理内存和虚拟内存切成一段段固定大小的内存空间)

内存分页解决了内存分段的内存碎片问题,其释放内存是以页为单位释放的,当内存空间不够,会释放其他正在运行的进程的没使用的内存页面

内存分页下的虚拟地址被分为页号和页内偏移,页好为页表的索引,页表保存着物理页的所在物理内存的基地址,基地址和页内偏移组成物理内存地址

内存分页的缺点就是在运行多线程时,页表会非常大,所以出现了多级⻚表(将页表分成一级一级的)

段⻚式内存管理(内存分段和内存分页的结合体)

先将内存分为多个段,再将每个端分为多个页,地址通过段号,段内⻚号和⻚内位移组成

连续性内存管理(内存碎片和分区的动态分配)

外部碎片:在分配单元间的未使用内存

内部碎片:在分配单元中的未使用内存

当一个应用被批准运行在内存中时,分配一个连续的区间,来给运行的应用访问数据

动态分配的策略:当想分配某字节,先从低地址找,找到第一个被某字节大的空闲块,就使用它

动态分配的缺点就是外部碎片严重

非连续内存分配

分段Segmentation:

逻辑地址空间连续,物理地址离散

一个段表示一个内存块,一个逻辑地址空间,应用访问内存地址的时候,需要个二维的二元组

虚拟内存:

早期内存不够应用消耗,应用的规模比存储器的容器大

当应用太大,超出内存,可采用手动的覆盖(overlay) 技术,只把需要的指令和数据保存在内存中

当应用太多,超出内存,可采用自动的交换(swapping) 技术,把暂时不能执行的程序送到外存(磁盘)中

进程和线程:

进程状态(state),线程(thread),进程间通信(inter-process communication),进程互斥与同步,死锁(deadlock)

进程包含正在运行的应用的全部状态信息

进程可动态化创建,结束进程,可以被独立调度并占用处理,不同的进程互不影响,可访问共享数据或者资源

进程控制块(process control block, PCB):进程的数据结构,操作系统管理控制进程运行所用的信息集合,操作系统为每一个进程都维护了一个PCB,用来存储保存和该进程有关的状态信息


进程、线程
进程 / 线程间通讯方式
进程调度算法
进程 / 线程状态
死锁
内存管理


FHS规范(3.0),全称Filesystem Hierarchy Standard,中文翻译为文件系统层次结构标准,用于定义根目录以及一级子目录的规范,大多数Linux版本使用该标准来定义文件系统(并不一定完全符合规范,只是大概上符合)

FHS规范定义了系统各个目录应该要放什么文件数据,以及所需要的文件和目录

例如:规范某一些文件或者目录可以分享或者不可以分享给给其他人使用

FHS规范了根目录(/),以及根目录的子目录etc(配置文件),bin(必要软件或者命令),usr(二级目录),home(当前用户的家目录),var(动态数据)

Linux文件系统---VFS(虚拟文件系统)(Linux下一切都是文件)

VFS不需要考虑不同文件系统和存储介质的差异,因为其内核抽象出了通用的文件系统接口,只要符合接口标准,一些文件或者比较特殊的文件系统都是可以兼容

VFS抽象对象,超级块:文件系统,目录项:文件的路径,索引节点:具体文件(操作文件的具体信息),文件:进程打开的文件。都有自己的接口来操作

XFS(高性能64位日志文件系统),带有日志功能防丢数据,原生提供备份工具(xfsdump/sfsrestore)


图灵机和冯诺依曼模型

图灵机实质就是机器模拟人类在纸上进行数学运算,先将数值写到一个纸带的小方格中,再通过读写头来读取小方格里面的信息

这个读写头具备存储,运算,控制功能。存储读取的数据以及运算出来的数据,可执行运算指令,可识别数据是运算指令(例如加号,减号等等运算符号)还是数字

冯诺依曼模型(约定使用二进制来存储和计算数据,并且定义计算机基本结构,CPU,内存,输入设备,输出设备,总线,具备这5个部分的计算机就是冯诺依曼模型)

CPU:中央处理器,64位处理器(64位指的CPU的位宽,位宽决定了处理器一次可以计算处理多少字节的数据,64位处理器可以一次计算8个字节)

CPU内部还有寄存器(存储CPU计算时的数据),运算单元(负责计算),控制单元(控制CPU工作)

常见的寄存器有:通用寄存器(存储需要进行计算的数据),程序计数器(存储CPU要执行下一个指令的内存地址),指令寄存器(存储程序计数器指向的指令)

总线(CPU和其他设备之间的通信,总线被分为3种,地址总线(传送外部存储器(内存)的地址),控制总线(用来传输和接收控制信号),数据总线(传送内存的数据信息,数据总线又分单向传输,双向传输))

输入输出设备(输入设备通过控制总线和CPU通信,CPU处理后,将数据输出给输出设备)

线路传输:通过电压来传输数据,低电压表示0,高电压表示1,一条线路可传输1bit的数据(二进制,0或1)

32位处理器的最大寻址空间为2的32次方(4294967296,大概4GB左右),所以32位CPU(或者操作系统)只能操作4G内存(而64位理论上寻址范围高达2的64次方)

CPU执行过程:CPU读取程序计数器的值(指令内存地址),控制单元通过地址总线访问到内存,并且通过数据总线获取数据给CPU,CPU接收到数据,将该数据存储在指令寄存器,CPU处理指令寄存器的数据,确定数据的类型,如果是计算类,就交给运算单元处理,如果是存储类,就交给控制单元处理,CPU处理完毕后,程序计数器的值自增(用来表示下一条指令,自增取决于CPU的位宽,如果是64位处理器就是自增8(因为64位一次性处理8个字节数据,一个字节数据需要一个地址来存放))

CPU会不断执行该过程,直到结束(这个过程叫CPU的指令周期)

CPU的执行速度取决于指令的执行速度,而指令的执行速度取决于CPU的时钟频率(Ghz),例如我电脑的CPU是 2.10 GHz的,这个 2.10 GHz指的是1秒内可以产生2.1G次数的脉冲信号,而每一次脉冲信号的高低电平的转换就是时钟周期(振荡周期)

时钟频率越高,时钟周期越低,CPU的处理速度越快


存储器

内存断电,数据会丢失,而硬盘不会,因为硬盘是持久化存储,而且CPU内部也有存储器(只不过其能存储的数据很小)

寄存器处理速度最快,再到CPU Cache(中⽂称为CPU缓存,一般分为L1,L2,L3这样的缓存层,比如我电脑的r5 3550h的一级缓存为384KB,二级缓存为2MB,三级缓存为4MB,二级缓存是一级缓存的缓冲器,三级缓存是二级缓存的缓冲器)

然后再到内存,最后是硬盘

一个主频为2.1Ghz的CPU,表示其1秒内完成2.1x10的9次方个时钟周期

CPU Cachee使用了⼀种叫 静态随机存取存储器(Static Random-Access Memory,SRAM)的存储器,一旦断电就会丢失数据

每个CPU核心都有属于自己的L1缓存和L2缓存,而L3缓存一般是多核心共享的

内存使用的是一种叫动态随机存取存储器(Dynamic Random Access Memory,DRAM)的存储器

SRAM存储1bit的数据,一般情况需要6个晶体管,而DRAM只需要一个晶体管和一个电容

硬盘就是固体硬盘(分为HDD硬盘(Hard Disk Drive)和SSD硬盘(Solid-state disk)),HDD硬盘结构和内存相似,但是和内存,缓存之类的不同的是其断电,数据不会丢失

CPU Cachee的数据是从内存中获取的,通过Cache Line(缓存块)来一块一块获取,L1缓存一般分为数据缓存和指令缓存

补码:将正数的二进制全部取反再加1,补码被用于处理负数

十进制小数转二进制用的是乘2取整法(将小数部分乘以2,作为二进制的一位,一直到不存在小数,整数还是用除2法,再合并就是小数的二进制结果)

不是所有小数都可以乘2取整的,例如0.1就不能取整,无法使用二进制精确表示0.1,只能使用近似值来表示,这将导致精度缺失的情况发生


操作系统内核:连接硬件设备的桥梁,应用只需要和内核交互,无需关注硬件,内核已提供访问硬件的接口

现代操作系统内核支持进程调度,内存管理,硬件通信,提供系统接口等功能

内核权限很高,并且将内存分称2个部分,分别是内核空间(只有内核程序可访问),用户空间(专门提供给应用使用)

当程序在使用用户空间时,那么该程序在用户态执行,如果在使用内核空间,那么该程序在内核态执行

内核一般分为三种,宏内核(Linux为代表,整个内核是一个完整的程序),微内核(具备一个小内核,一些服务或者模块由用户态来管理)以及混合内核(宏内核和微内核的结合体,windows为代表)

添加新评论

已有 2 条评论

  1. 香香甜甜的果粒橙

    1. 美汁源的好喝,嘻嘻~