什么是操作系统?
- 本质是一个运行在计算机上的软件程序,管理计算机硬件与软件资源的程序
- 屏蔽硬件的复杂性,提供接口使用计算机硬件
- OS内核是核心部分,负责内存管理、硬件设备管理、文件系统管理、应用程序管理等
什么是系统调用
- 用户态:用户态运行的进程或可以直接读取用户程序的数据
- 系统态:简答理解为系统态运行的进程几乎可以访问计算机的任何资源,不受限制
- 我们的程序基本都在用户态运行,当需要使用OS提供的系统态下的功能时,通过系统调用去使用
- 调用功能有:
- 设备管理,完成设备启动、请求、释放
- 文件管理,目录及文件的读、写、创建、删除
- 进程控制:进程的创建、撤销、阻塞、唤醒
- 进程通信:实现进程之间的消息传递
- 内存管理:内存的分配、回收
进程的状态
- 创建状态:尚未创建或者正在创建
- 就绪状态:准备所有的了,就等CPU
- 运行状态:正在运行
- 阻塞状态:等待资源中
- 结束状态:运行结束或中断
进程通信方式
- 管道/匿名管道:管道是半双工的,当需要通信时建立两个管道;父子进程、兄弟进程之间的通信;本质上是一个特殊的文件,只存在内存中;从管道末尾写入,管道头读取
- 有名管道:匿名管道没有名字,只能用于有亲属关系的进程通信;有名管道以文件形式存在,并且有一个路径名与其相关;管道的名字(路径名)存在文件系统中,内容存在内存中;严格遵守FIFO
- 信号Signal:Linux中进程通信机制,信号可以发送给任意一个进程
- 消息队列:消息链表,存放在内存中,遵守FIFO,消息队列属于内核管理(存于内核内存),只有重启内核才会真正删除
- 信号量Semaphores:信号量是一个计数器,用于多进程对共享数据的访问
- 共享内存:多个进程可以访问同一块内存空间,例如互斥锁和信号量等
- 套接字Sockets:用于客户端和服务器之间的网络进程通信
线程同步方式
- 互斥量(Mutex):采取互斥对象机制,只有拥有互斥对象才能访问共享资源,比如Synchironized和Lock
- 信号量:信号量,允许多个线程同时访问同一资源,但是又数量限制
- 事件:wait、notify,使用通知方式,Condition类
进程调度算法
- FCFS先来先服务算法,公平
- SJF短作业优先算法,照顾短作业,忽略长作业
- RR时间片轮转调度算法
- 优先级调度算法,分为抢占式和非抢占式,优先级有静态和动态之分
- 非抢占式:处理机一旦分配给优先级最高的进程后,那么就一直执行直至完毕
- 抢占式:处理机执行过程中,如果出现优先级更高的进程,那么执行优先级更好的进程
- 多级反馈队列
- 设置多个就绪队列,每个队列赋予不同优先级,时间片也不一样,优先级高则时间片小
- 每个队列都采用FCFS算法,如果某个线程在分配的时间片没有执行完毕,那么转到下一个优先级的对尾排队等候执行
- 按照队列优先级执行,一定先执行高优先级的任务
内存管理
- 内存管理分为连续分配管理和非连续分配管理
- 连续分配管理是指一个用户程序分到连续的内存空间,比如块式管理
- 非连续分配管理允许一个用户程序使用不相邻离散的内存空间,比如页式管理、段式管理和段页式管理
- 块式管理:将内存分为几块,块的大小可以静态设置也可以动态调整,每个程序占一块,容易造成块碎片
- 页式管理:将程序内存分为大小相等的页,页比较小,一个程序可以占多个页,提高内存利用率,减少碎片,可以存在二级、多级页表;每页连续
- 段式管理:可以将作业(程序)按照不同功能分段,每个段大小可以不一样,按照每个程序段来决定段大小,相对于页式管理,段式管理中的每一个段都有实际功能意义;每段连续
- 段页式管理:简单来说,先将用户程序分成若干个段,然后每个段中分为若干页
快表和多级页表
- 快表:提高了虚拟地址到物理地址的转换速度;增设一个具有并行查询能力的特殊高速缓存器(快表),用来存放当前访问的页表项;
- 如果查询的时候能再页表项找到,那么Ok;
- 如果找不到,再去内存中找,找到了记得放到快表中
- 多级页表:避免将全部页表放在内存中占用过多空间,特别是不需要的表项,查询时,一级级往下查
分页机制和分段机制的异同点
- 分页和分段机制都是为了提高内存利用率,减少内存碎片;段和页都是离散存储,但是内部都是连续的
- 页的大小固定,段的不固定
- 分页仅是满足管理内存的需要,段式逻辑单位(体现为代码段、数据段等满足用户需要)
页面置换算法
- OPT页面置换算法(最佳页面置换算法,Optmal):选择淘汰的页面是以后永远不使用的,或者以后长时间不用的,但是现在还没有实现
- FIFO先进先出置换算法:总是淘汰最先进入内存的页面
- LRU最近最久未使用页面置换算法:每个页面赋予一个访问字段,用来记录每次被访问的时间,当淘汰页面时,选择最早被访问的页面
- LFU最少使用页面置换算法,选择被使用次数最少的页面作为淘汰页
逻辑地址和物理地址
- 逻辑地址是编程语言上使用的地址,由操作系统决定
- 物理地址是真正的内存地址
CPU寻址是什么?
- CPU使用的是虚拟寻址方式,需要将虚拟地址转换为物理地址
- 完成虚拟地址转换为物理地址的硬件是CPU总一个叫做内存管理单元(MMU)的硬件
为什么需要虚拟地址空间?
- 如果没有虚拟内存空间,那么所有操作都直接访问物理内存
- 直接访问物理内存,容易造成操作系统崩溃
- 直接访问物理内存,运行多个程序比较困难,使用虚拟地址可以隔离开每个程序,不至于发生冲突
- 提升内存使用效率,使用虚拟地址,一个程序可以使用不相邻的内存,且逻辑上可以增大内存区域(将超过内存的数据暂时存到硬盘)
什么是虚拟内存
- 虚拟内存内存管理的一种技术,定义连续的虚拟地址空间,并将内存扩展到硬盘空间
- 为每个进程提供一个私有的地址空间,让进程觉得自己独占内存并且使用的是连续的内存,能有效的管理内存
局部性原理
- 时间局部性:程序中某条指令一旦执行,不久后可能还要执行;某个数据被访问后,不久后可能还要被访问(因为程序中存在大量循环)
- 空间局部性:一旦访问了某个存储单元,那么不久后其附近的存储单元也将被访问,即一段时间内访问的地址可能在一定范围内(存在大量链表、数组)