30 操作系统

操作系统是运行在计算机上的软件程序,用来管理计算机硬件和软件资源。
操作系统内核负责

  • 系统内存管理
  • 硬件设备管理
  • 文件系统管理
  • 应用程序管理
    30 操作系统
    文章图片
系统调用 根据进程访问资源的特点,把进程在系统上的运行分为:
  • 用户态:读取用户程序的数据
  • 系统态:访问计算机的资源
    运行程序基本是在用户态,需要访问以下资源时,需要通过系统调用的方式,向操作系统提出服务请求,由操作系统代为完成。
  • 设备管理:完成设备的请求、释放、启动等
  • 文件管理:完成文件的读、写、创建、删除等
  • 进程控制:完成进程的创建、撤销、阻塞、唤醒等
  • 进程通信:完成进程之间的消息传递或信号传递等
  • 内存管理:完成内存的分配、回收以及获取作业占用内存区大小及地址等
进程与线程的区别 一个进程可以有多个线程,共享进程的堆和方法区(元空间),独享自己的程序计数器,虚拟机栈和本地方法栈。
各进程相互独立,各线程可能相互影响。
进程间的通信方式
  1. 管道/匿名管道:用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。只存在于内存中。
  2. 有名管道:遵循先进先出,以磁盘文件的形式存在,实现本机任意两个进程通信。
  3. 信号:用于通知进程某个事件已经发生。
  4. 消息队列:消息的链表,存放在内核中,由消息队列标识符标识。要先进先出的消费,但可以随机查询。只有内核重启(即操作系统重启)或者显式删除一个消息队列时才会被删除。和消息队列相比,信号承载的信息量少,管道只能承载无格式字节流且缓冲区大小受限。
  5. 信号量:是个计数器,用于多进程对共享数据的访问,意图在于进程间同步。
  6. 内存共享:使多进程同时访问同一块内存空间,需要依靠某种同步操作,例如互斥锁或信号量。
  7. 套接字:用于在客户端和服务器之间通过网络通信,套接字是支持tcp/IP的网络通信的基本操作单元。
线程间的同步的方式
  1. 互斥量:持有“互斥量(就是锁)”的线程才有访问公共资源的权限。
  2. 信号量:允许同一时刻多个线程访问统一资源,但是需要控制最大线程数量。
  3. 事件:wait/notify 通过通知保证多线程同步
进程的调度算法 为了实现最大cpu利用率
  1. 先到先服务算法FCFS:从就绪队列中选第一个进程,立即执行移植到被阻塞放弃占用cpu。
  2. 短作业优先算法SJF:从就绪队列中选执行时间最短的进程,立即执行直到被阻塞放弃占用cpu。
  3. 时间片轮转调度算法:每个进程轮流执行一个时间片
  4. 多级反馈队列调度算法:高优先级和短时间的优先完成。unix系统使用这种算法。
  5. 优先级调度:根据内存要求、时间要求或其他资源要求制定优先级,按照优先级执行。
内存管理 内存的分配与回收(malloc函数申请内存,free函数释放内存)
地址转换:将逻辑地址转换成物理地址
内存管理机制
  • 连续分配管理方式
    • 块式管理
    远古时代,内存分为几个固定大小的块,每个块中只包含一个进程,
  • 非连续分配管理方式
    • 页式管理
    把主存分为较小的页,通过“页表”对应逻辑地址和物理地址,提高内存利用率。
    • 段式管理
    段比页更小,每个段定义一组逻辑信息,例如主程序段main,子程序段X,数据段D,栈段S,通过“段表”对应逻辑地址和物理地址。
    • 段页式管理
    每个段分成若干页
快表和多级页表 内存管理中,最重要的两点是:
  • 虚拟地址到物理地址的转换要快
  • 解决虚拟地址空间大,页面也会很大的问题
    快表
    【30 操作系统】页表的缓存。
    多级页表
    像树一样,一级页表映射二级页表地址,二级页表映射物理地址。
    为了节省页表占用的内存空间,未被真实占用的二级页表可以暂不创建。
    或把二级页表放在磁盘里。
分页和分段的共同点和区别
  • 共同点:都是为了提高内存利用率,减少内存碎片。都是离散存储的,页内、段内都是连续的。
  • 区别:页大小固定,由操作系统决定,段大小不固定,取决于当前运行的程序。段式逻辑单位,分为代码段、数据段等。
cpu寻址
  • 为什么要有虚拟地址:直接访问物理地址会有意无意的造成操作系统和程序崩溃
  • 使用虚拟内存的好处:可以使用相邻的虚拟地址访问物理内存中不相邻的大内存缓冲区,第二条没看懂,不同进程使用的虚拟地址彼此隔离,一个进程无法修改由另一进程或操作系统使用的物理内存。
虚拟内存 虚拟内存使得应用程序认为它拥有连续的可用的内存,实际上它拥有的是被分割成多个的物理内存碎片,还有部分暂存在外部磁盘存储器上,在需要时进行数据交换。
局部性原理
  • 时间局部性:因为程序中存在着大量循环操作。某条指令一旦执行,不久后可能再次执行;某数据被访问过,不久之后可能再次被访问。
  • 空间局部性:因为指令通常是顺序存放、顺序执行的,数据一般也是以向量、数组、表等形式簇聚存储的。一旦程序访问了某个单元,不久以后其附近的存储单元也将被访问。
    局部性原理使得只需要装入部分程序到内存就可以开始运行。
虚拟内存的技术实现
  1. 请求分页存储管理,基于“分页管理”+按需置换“页”进内存。
  2. 请求分段存储管理,基于“分段管理”+按需置换“段”进内存
  3. 请求段页式存储管理
页面置换算法
  • 缺页中断:需要访问的页不再主存,需要操作系统将其调入主存后访问。
    如果此时主存已满,就需要删除一个页面,删除页面的规则就是页面置换算法。
  • opt页面置换算法:选择“以后将永不使用”的页面,过于理想无法实现,成为衡量其他算法的标准。
  • fifo置换算法,先进先出。
  • lru置换算法,least currently used,最近没被使用过的先出
  • lfu置换算法,least frequently used,最少使用的先出。

    推荐阅读