操作系统基础
什么是操作系统
内核的管理工作
让内核作为应用连接硬件设备的桥梁,应用程序只需关心与内核交互,不用关心硬件的细节。
内核态与用户态
内核的两种体系结构(宏内核和微内核)
CPU工作模式
内存管理
虚拟内存的概念
内存的存储管理(虚拟地址->物理地址)
分段式存储管理(外部内存碎片问题)
虚拟地址的段选择因子里的段号对应“段表”的索引(段寄存器查看自己的段号对应的段基址,注意段基址对应的段界限限定了虚拟地址的偏移量,偏移量不能超过段的界限)
优点:分段的好处就是能产生连续的内存空间;缺点:外部内存碎片–>进一步引起内存置换
外部内存碎片和内部内存碎片de区别
外部内存碎片(没人能够使用),内部内存碎片(占了茅坑不拉屎)
分页式存储管理(解决内存碎片问题—>页表大)
将虚拟内存(页)与物理内存空间(页框)划分为更细粒度的“固定尺寸”的大小!!!!就是“页”
分页管理的缺陷:页表本身很占内存(映射过多)
利用页面置换算法,将不需要的页换出,需要用到的页换入
(非连续式分配管理)
多级页表和快表
一级页表对应一级页号与二级页表地址的关系,二级页表真正存放的是二级页号和物理内存地址的关系
段页式存储管理 (段+页)
给每个程序一张段表,段表的每个段又建立一张页表
进程(CPU)管理
什么是进程
进程的状态
进程间的通信方式
1.共享存储(同步互斥控制)
2.消息传递(消息缓冲队列—信箱)
3.管道通信
信号量(进程间的同步方式)
p操作减一后需要判断自身需不需要阻塞,v操作加一后需要判断自己需不需要唤醒别人(一个线程执行的pv操作是成对出现的,先占用资源在释放资源的成对操作)
互斥信号量:信号初始化为 1,就代表着是互斥信号量,它可以保证共享内存在任何时刻只有一个进程在访问,这就很好的保护了共享内存。
同步信号量:进程 A 是负责生产数据,而进程 B 是负责读取数据,这两个进程是相互合作、相互依赖的,进程 A 必须先生产了数据,进程 B 才能读取到数据,所以执行是有前后顺序的。那么这时候,就可以用信号量来实现多进程同步的方式,我们可以初始化信号量为 0
总结
注意:
1.父子进程指主进程fork出来的子进程
(对于匿名管道,它的通信范围是存在父子关系的进程。因为管道没有实体,也就是没有管道文件,只能通过 fork 来复制父进程 fd 文件描述符,来达到通信的目的。
另外,对于命名管道,它可以在不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。)
2.消息队列位于内核的一个消息链表,如何需要实现消息的读取与写入都要涉及到----用户态与内核态之间的数据拷贝。
3.共享内存实际是两个应用有一个共享的物理内存空间(需要解决共享资源的同步与互斥的相关操作)
如何解决多进程间共享资源的同步方式—信号量机制(针对同一台主机);
内核与应用进程之间的交互—信号(异步通信机制);
不同主机的进程间通信—socket通信
线程间的同步方式
调度算法(进程调度/页面置换)
进程间的调度算法
页面置换算法
IO模型
(用户态与内核态 / 调用者与被调用者 / 发起请求者与处理请求者)
系统调用
IO模型
BIO同步阻塞模型(JDK1.4之前)
对服务器端的CPU造成了压力了,需要维护很多的线程(上下文切换)。多线程中某个线程阻塞,导致CPU的占用
NIO同步非阻塞模型
NIO 与BIO的区别
NIO-单线程模型
NIO-多线程reactor模型
selector()+线程池里的工人
AIO异步IO模型(了解)
IO多路复用模型(select,poll,epoll)
Netty (NIO)
RPC(远程过程调用)