操作系统OS(笔记)

  • 基础

    • 常用术语:
      • PCB 进程控制块(PCB, Process Control Block),系统中存放、管理和控制进程信息的数据结构
      • TCB 线程控制块
      • FCB 文件控制块
      • PID 进程ID(Process ID)
      • PSW 程序状态字寄存器,用于存放PC、IR等的信息
      • PC 程序计数器,存放下一条指令地址
      • IR 指令寄存器,存放到当前进行的指令
      • 半双工 半双工和全双工是计算机网络中的概念,意思是通讯同一时间只允许一方发送数据(对讲机)
      • 全双工 通信允许两方向上同时传输数据(电话)
      • P操作 来自荷兰语proveren,代表wait原语,通常使用P(S)代替wait(S)
      • V操作 来自荷兰语verhogen,代表原语signal,通常使用V(S)代替signal(S)
      • 用户态 一般的操作系统对执行权限进行分级,分别为用保护态和内核态。用户态相较于内核态有较低的执行权限,很多操作是不被操作系统允许的,从而保证操作系统和计算机的安全。
      • 内核态 内核态相当于一个介于硬件与应用之间的层,可以进行硬件的调度、使用,可以执行任何cpu指令,也可以引用任何内存地址,包括外围设备, 例如硬盘, 网卡,权限等级最高。
      • 用户态内核态切换 三种情况下,用户态会转换到内核态,系统调用、程序异常(例如内存资源耗尽等)、来自外围设备的中断
      • 系统调用/程序接口 用户程序通过系统调用的方式才能对硬件进行使用,或者说操作系统将使用硬件的接口提供给用户程序
      • 中断 中断是操作系统内核程序夺取cpu的唯一途径,或者说用户程序调用内核代码的唯一途径,因为在一般情况下,操作系统会将cpu使用权交给应用程序。
    • app --> os --> 计算机硬件
      • 计算机怎么工作? 取址执行
      • BIOS : based input output sysmtem
      • 打开电源时,计算机开机执行的第一条命令:寻址0xFFFF0(BIOS映射区),进行检查RAM,键盘,显示器,软硬磁盘;将磁盘0磁道0扇区(引导扇区)读入0x7c00处
      • 操作系统的基本概念:操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境的程序集合。
      • 操作系统的特征:
      • 并发(Concurrence):并发是指两个或多个事件在同一时间间隔内发生。操作系统的并发性是指计算机系统中同时存在多个运行着的程序,因此它具有处理和调度多个程序同时执行的能力。并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。在操作系统 中,引入进程的目的是使程序能并发执行;
      • 共享(Sharing): 资源共享即共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。共享可分为以下两种资源共享方式:1) 互斥共享方式 2) 同时访问方式;互斥共享的资源称为临界资源,例如打印机等,在同一时间只允许一个进程访问,需要用同步机制来实现对临界资源的访问。
      • 虛拟(Virtual):虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实的,即实际存在的;而后者是虚的,是用户感觉上的事物。用于实现虚拟的技术,称为虚拟技术;
      • 异步(Asynchronism):在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
      • 操作系统最基本的特征是并发和共享。
      • 操作系统接口(OS Interface)
        用户使用应用软件 , 操作系统提供的接口 将操作系统和应用软件连接起来
        • 接口:连接两个东西、信号转换、屏蔽细节
        • OS提供了一些重要的函数,就是操作系统的接口;接口表现为函数调用,又由系统提供,所以称为系统调用。
  • 进程和线程

    • CPU进行交替执行多个程序 (并发),提升CPU的利用率。为了保证CPU处理过的程序在切回来继续执行,其运行的的状态应该得到保存
    • 运行的程序和静态程序是不一样的-------> “进程”概念(进行中的程序)
    • 进程有开始、有结束,会走走停停,需要记录运行状态;而程序没有中途的开始结束,走停无意义。
    • 进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;
    • 进程的几种状态:
      • 就绪状态:进程已获得除CPU以外的所需资源,等待分配CPU资源;
      • 运行状态:占用CPU资源运行,处于此状态的进程数小于等于CPU数;
      • 阻塞状态: 进程等待某种条件,在条件满足之前无法执行;
    • 进程状态转换的条件:
      • 运行 -> 阻塞 等待I/O或事件完成
      • 运行 -> 就绪 进程的CPU时间片用完
      • 就绪 -> 运行 获得了CPU的时间片
      • 阻塞 -> 就绪 I/O或事件完成
    • 进程控制流程图:
    • 根据进程状态的不同,创建不同的索引表,可以通过指针可以通过索引表指到个PCB。
    • 程序时如何执行?
    • 相较于程序,进程是动态的而程序是静态的。
    • 多进程如何组织???
      • 利用PCB(process Control Block ---> 用来记录进程信息的数据结构)放到不同队列中进行区分进程状态,利用状态转移推进进程
    • 多进程如何交替???
      • 交替的三个部分:队列操作+调度+切换
    • 进程 = 资源执行序列 + 指令执行序列
      • 资源的切换就是映射表切换,就是执行不同的进程时所选择的映射表是不一样;指令的切换就是从这段程序跳到另外一段程序执行,
    • 线程的分类:用户级线程和核心级线程
      • 用户级线程
        • 线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的 实时性,实现进程内部的并发;
        • 线程的切换:使用TCB(Thread control block )切换不同线程的栈
      • 核心级线程
        • 多处理器每一个cpu都有一套自己的MMU(memory management unit)。多核是所有的CPU共用一套MMU,也就是多个CPU的内存映射关系是一致的。
      • 用户级线程和核心级线程区别:
      • 核心级线程需要在用户态和核心态里面跑,在用户态里跑需要一个用户栈,在核心态里面跑需要一个核心栈。用户栈和核心栈合起来称为一套栈,这就是核心级线程与用户级线程一个很重要的区别,从一个栈变成了一套栈。用户级线程用TCB切换栈的时候是在一个栈与另外一个栈之间切换,核心级线程就是在一套栈与另外一套栈之间的切换(核心级线程切换),核心级线程的TCB应该是在内核态里面。
    • 进程和线程以及它们的区别:
      • 进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;
      • 线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的 实时性,实现进程内部的并发;
      • 一个程序至少有一个进程,一个进程至少有一个线程,线程依赖于进程而存在;
      • 进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。
      • 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
      • 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
      • 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
      • 一个程序至少有一个进程,一个进程至少有一个线程。一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
      • 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,可以极大地提高程序的运行效率。
    • 进程间通信

      • 管道,消息队列,共享内存,信号量,信号,socket
      • 管道是内核间的一段缓存,通信效率低,不适合用于频繁通信的进程之间
      • 消息队列是保存在内核中的消息链表,不适合进程间传输较大数据,通信不及时,存在用户态和内核态之间数据拷贝造成的系统开销
      • 共享内存:拿出⼀块虚拟地址空间来,映射到相同的物理内存中
      • 信号量:一个整型计数器,用于实现进程间的互斥与同步,⽽不是⽤于缓存进程间通信的数据
      • 信号:对于异常情况下的⼯作模式,就需要⽤「信号」的⽅式来通知进程。(kill -l查看Linux系统信号命令)
      • socket:前面的五种方式都是在同一主机上进程间的通信。跨网络与不同主机上的进程之间通信,就需要 Socket 通信(也可在同主机进程间通信)
    • 多线程同步

      • 互斥和同步
    • 死锁
      • 死锁满足的四大条件:互斥条件,持有并等待条件,不可剥夺条件,环路等待条件
      • 避免死锁方法:线程资源有序分配 --> 可以破坏环路等待条件
      • 悲观锁含有:互斥锁,自旋锁,读写锁
        • 悲观锁认为:多线程同时修改共享资源的概率⽐较⾼,于是很容易出现冲突,所以访问共享资源前,先要上锁。
        • 互斥锁:线程A对共享资源上锁失败时,内核会【切换线程】进行运行,线程A阻塞,共享资源被释放时内核唤醒线程A运行。两次线程切换时的额外开销较大。
        • 自旋锁:线程A对共享资源上锁失败时不会切换其他线程,会一直占用CPU资源进入等待状态,直到共享资源被释放;若线程A本身的运行时间短,可以舍弃互斥锁选择自旋锁。
        • 读写锁:分为读锁和写锁
      • 乐观锁:
        • 多线程同时修改共享资源的概率⽐较低,可以使用乐观锁。
        • 先修改完共享资源,再验证这段时间内有没有发⽣冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作。
        • 在线文档的编辑就是乐观锁(无锁编程)
          • 若使用悲观锁,1人进入编辑时其他人无法进入查看文档
          • 使用乐观锁,编辑完之后提交才验证是否有冲突地方。
          • 服务器会一直更新文档版本号,第一个人修改成功时会把原始版本号更新;第二人提交修改时,由于他的文档版本号是原始的,与现在服务器端的文档版本号不一致,所以修改失败。
        • 乐观锁去除了加锁操作,但一旦发生冲突,重试成本非常高,只有在冲突概率⾮常低,且加锁成本⾮常⾼的场景时,才考虑使⽤乐观锁。
  • 调度算法

    • 进程调度算法:

      • 进程是由CPU进行调度的,所以也叫CPU调度算法
      • CPU空闲时,会利用进程调度算法选择进程运行
        • 空闲含义:
          • 抢占式调度(时间片原则,优先权原则,短作业优先原则):运行 --> 就绪,阻塞 --> 就绪
          • 非抢占式调度:运行 --> 阻塞,运行 --> 终止
      • 常见进程调度算法:
        • 先来先服务调度算法(FCFS)
          • 非抢占式,对长作业有利,适用于CPU繁忙作业的系统,不适应于I/O繁忙系统
        • 短作业优先调度算法(SJF)
          • 抢占式,对短作业有利,可以提高系统的吞吐量。长作业可能一直都没有被运行
        • 高响应度比优先调度算法(HRRN)
          • 主要权衡了长作业和短作业,
        • 时间片轮转调度算法(RR)
          • 使用最广,最古老,最公平的算法,假设所有进程一样重要
          • 时间片太短 --> 进程切换太频繁,系统内销较大;
          • 时间片太长 --> 退化为了先来先服务调度算法。
        • 最高优先级调度算法
          • 低的优先级进程可能一直不会执行(HPF)
          • 进程具有优先级
            • 静态优先级:创建进程时就确定了优先级,优先级不会改变
            • 动态优先级:根据进程的状态调整优先级,运行时间越长,降低优先级。等待时间越长,提高优先级。
          • 也有抢占式调度和非抢占式调度
            • 当就绪队列中出现优先级高的进程,当前运行进程挂起,执行优先级高的进程。
            • 当就绪队列中出现优先级高的进程,当前运行进程运行结束后,执行优先级高的进程。
        • 多级反馈队列调度算法(MFQ)
          • 综合了时间片轮转和最高优先级;新的进程会被放在第一队列末尾;第一队列时间片用完的进程放入下一级队列末尾。
          • 【多级】代表:有多个队列,每个队列优先级由高到低,同时高优先级队列时间片短。
          • 【反馈】:抢占式,当有优先级高的加入队列时,停止当前运行进程并将其放入当前队列末尾,转而运行高优先级的队列
          • 兼顾了长短作业和响应时间
    • 内存页面置换算法

      • 缺页异常:进程只知道自己的虚拟地址,不知道某一页映射到内存里还是硬盘上,进程只管自己运行。当进程需要访问某一页时,操作系统通过页表查询被请求的页在内存中还是硬盘中。若在物理内存中则直接进行地址翻译;若在硬盘中,进程则会产生一个缺页中断,请求操作系统将其存入空闲的物理内存中,然后使该进程就绪(可以继续运行)。
      • 若在物理内存中找不到空闲的页,说明内存已满,利用【内存页面置换算法】选择一个物理页进行替换。如果此时被选中的物理内存页有被修改过(脏页),将此页换出到磁盘并将页表项的状态改为无效,然后进行替换。
      • 常用算法:
        • 最佳页面置换算法(OPT)
          • 置换在【未来】最长时间不被访问的页面。无法预知下一次是谁被访问,所以实际中无法实现该算法。可以用来衡量其他算法的效率(越接近效率越高)。
        • 先进先出置换算法(FIFO)
          • 选择物理内存中保留时间最长的页面进行替换。
        • 最近最久未使用置换算法(LRU)
          • 假设过去时间很久没被访问的页面在未来一段时间页不会被访问;选择最长时间没有被访问的数据页面进行替换
        • 页面时钟置换算法(CLOCK)
        • 最不常用置换算法(LFU)
          • 选择访问次数最少的页面进行替换
    • 磁盘调度算法

      • 访问磁盘时,磁盘的寻找磁道过程耗时。通过优化磁盘的访问请求顺序,提高磁盘的访问性能。
      • 常用算法:
        • 先来先服务(FCFS)
        • 最短寻道时间优先(SSF) --> 可能存在着某些请求的【饥饿】,磁头在一小块区域来回滑动
      • 扫描算法(SCAN),防止【饥饿】现象的出现
        • 磁头在⼀个⽅向上移动,访问所有未完成的请求,直到磁头到达该⽅向上的最后的磁道,才调换⽅向,这就是扫描(Scan)算法。存在着每个磁道的响应频率存在差异(中间大两边小)。
      • 循环扫描算法(CSCAN)
        • 解决扫描算法的响应频率差异问题
        • 磁道只响应⼀个⽅向上的请求,返回中途不处理任何请求。
      • LOOK算法和C-LOOK算法
        • 针对扫描算法(SCAN)和循环扫描算法(CSCAN)的优化,不用访问磁道的最始和最末端(磁头移动到最远的请求后返回)
  • 文件系统

    • 文件系统负责将用户文件存放的硬盘中
    • Linux 系统为每个分配两个数据结构:索引节点(index node)和⽬录项(directory entry)
    • 目录和目录项的区别:
      • 目录是一个文件,里面保存了子目录和其他文件,持久化存储在了磁盘中
      • 目录项是一个数据结构,缓存在了内存。
    • 索引节点,目录项和文件数据之间的关系:
  • 网络系统:

    • I/O多路复用(socket/poll/epoll)
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值