一:启动流程:
操作系统(os)是存放在disk(磁盘上:c盘)
BIOS(BASIC INPUT OUPUT SYSTEM) 一开机(通电源)=====检查外设(加电自检===网卡在哪,显卡在哪。。。),加载软件(先加载bootloader====将os的代码和数据读入内存=======cpu的控制权在bootloader),运行os(cpu控制权转到os)------------------->os处理软件发出的指令【系统调用】(异步或同步),os处理软件发生的异常(同步),os感知外设变化。如网络中断,声卡损坏。。【中断】(异步)
BOOTLoader【位于硬盘第一扇区512byte】:将os从磁盘加载进内存,让cpu可以执行os
1.中断:
硬件:cpu将内外事件设置中断标记,中断事件的id 软件:保存当前状态,清除中断标记
2.异常:
os保存现场,异常处理(kill program,restart program) 恢复现场
3.系统调用:
printf(“hi,os”) ==============>在哪个外设上打印【屏幕】,打印什么【hi,os】 这一步相关os会提供相应的API供程序去调用。系统调用:cpu形态发生改变,切换成os自己的堆栈。 应用程序的函数调用是用户态,使用的应用程序的堆栈
附:用户态 :cpu以该形态只能执行权限很低的机器指令 内核态:cpu以该形态可执行任意一条机器指令
二:计算机结构:
内存:
是CPU能直接寻址的存储空间(特点是存取速率快)(存的是:临时的或少量的数据和程序)它是无记忆存储,断电数据就没了,好比用记事本敲了一天的代码(内存),结果忘了保存(外存)电脑就关机了,那么重启电脑,你辛辛苦苦写的代码肯定就从内存中丢掉了。它的定义是相对于外存而言的。for example:书房里,存放书籍的书架和书柜相当于电脑的外存,而我们工作的办公桌就是内存(像什么RAM,Cache....)
内存有=============>RAM(随机存储器,掉电信息丢【静态RAM:SRAM,又叫一级缓存。。。。。。。。。。动态RAM:DRAM,又叫二级缓存。。。。。。。。二级缓存存储速度《一级缓存】) 和ROM(只读存储器,断电信息也不会丢)
外存:
与内存定义相反的那就是外存了。
缓存:
是CPU的一部分,它存在于CPU中
地址空间:
os完成逻辑与物理地址的映射
物理地址空间:真实的磁盘地址:如:C:\Program Files\MySQL\MySQL Server 5.7\log.txt
逻辑地址空间:供内存访问(地址是虚的,需要os映射成真实的磁盘地址):int a;a就是一个逻辑地址 :1001003
外碎片,内碎片:
没有被使用的空间
动态内存分配:(连续内存分配)
首次适配【400b======>3kb^^^,5kb,500b】,最优适配【500b^^^不会拆散3kb的空间】,最差适配【2kb^^^】
非连续分配(虚拟的内存地址)
段机制访问寻址::连续逻辑地址拆分成一段一段的逻辑地址------>cpu寻址,根据OS建立的段表,追踪到其所对应的--------------连续的所处的物理地址
页寻址机制:16bit的地址空间,9bit(512byte)大小的页帧。物理地址=(3【页帧号】,6【页帧偏移量】)=(2^9)*3+6=1542
附:
1.1 什么是堆:
堆通常是一个可以被看做一棵树的数组对象
堆总是一棵完全二叉树
堆是在程序运行时,而不是在程序编译时
堆是指程序运行时申请的动态内存
一般由程序员分配释放
栈使用的是一级缓存
1.2.什么是栈:
栈(stack)又名堆栈
栈(Stack)是操作系统在建立某个进程时或者线程,为这个线程建立的存储区域
由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等
堆则是存放在二级缓存
硬盘速度远远慢于内存速度(造成的原因就是cpu寻址的方式不同),为了解决内存容量小:
手动覆盖(首先要有常驻内存,打标签:那些是常用的程序,那些是不常用的。在同一块内存区分时执行这些任务【现有A调用BC,B调用D,C调用EF,则内存区分三块,A,BC,DEF,A调B执行完后,释放B所占内存,将C读入到B的内存区....c覆盖了b】,小部分放入)--->自动交换(建立内存交换区,bc执行完后,用ef交换bc,,大跨步的放入。但对于某些任务,这个步子就有点大了,造成了空间的浪费,效率的不高效)-------->
虚拟内存:
通过分页将代码,数据读入内存。使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间)的一种技术,而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
for example:页面大小为4k,分配给每个进程的页面数为1,定义int A[1024][1024],数组按行存入内存,每行放在一个页面\
a0,0 a0,1 a0,2........a0,1023 1
a1,0 a1,1 a1,2........a1,1023 2
...............................
................................
a1023,0 a1023,1............a1023,1023 1024
较差的程序:
for(j=0;j<1024;j++)
for(i=o;i<1024;i++)
A[i][j]=0;
1,2,3...1024,1,2,......1024,1,2..1024...共发生1024*1024次缺页中断
调优:
for(i=0;i<1024;i++)
for(j=o;j<1024;j++)
A[i][j]=0;
1,1,1....(1024个,1),2,2,2.....(1024个2),3,3,3.,1024,1024,1024.....共发生1024次缺页中断,大小为4b*1024=4kb内存
三.进程:
1.1 概念:正在进行的应用程序的状态的描述,如占用了多少cpu的资源,调用了多少外设)
1.2 包括:代码,数据,程序计数器中的值(指示下一条运行指令的地址),大量寄存器(存放当前值,堆,栈),一组系统资源(打开的文件)
1.3 理解: 一程序对应多个进程,又由于程序与程序之间的相互调用关系,一进程,可包含多程序。
进程是暂时的(像OS发出指令),是动态的(随着用户的输入的数据的不同而不同),程序的是永久的(存放于磁盘)
程序可以简单理解为代码。程序=代码。进程=程序+数据+进程状态信息
1.4 特点:
并发行,独立性
1.5 补充:
一时刻,多进程:并行 一时间段,多进程:并发
1.6开启进程:
程序计数器【寄存器】指定进程指向哪,栈指针【寄存器】知道代码间调用关系。实现是用汇编来实现的
四.线程:
1. 定义:线程=进程 - 共享资源
2.为什么使用线程:
mp3播放软件: 读取.mp3文件数据 --------解压缩数据 ------------------播放解压缩后的音频数据【组合了计算机外存的各个资源】
单线程:
while(true){
read();
decompress();
play();
}
多线程:
//读文件线程
while(true){
read();
}
//解压线程
while(true){
decompress()
}
//播放线程
while(true){
play();
}
3. 缺点:一线程崩,一进程的所有线程都崩
五。调度问题:
六:同步问题
七:信号量和管程
八:IPC 进程通信 inter process connection
九:文件系统
十:虚拟文件系统
是允许和操作系统使用不同的文件系统实现的接口。虚拟文件系统(VFS)是物理文件系统与服务之间的一个接口层,VFS并不是一种实际的文件系统。它只存在于内存中,不存在于任何外存空间