当前位置: 首页 > news >正文

操作系统学习

操作系统

  • 一,操作系统相关概念
    • 1.1 操作系统概念
      • 1.1.1 操作系统 启动!!!
      • 1.1.2 大内核和微内核
    • 1.2 操作系统并发,共享,虚拟,异步四大特征
      • 1.2.1 并发和并行
      • 1.2.2 共享
      • 1.2.3 虚拟
      • 1.2.4 异步
    • 1.3 用户态和内核态
    • 1.4 中断的类型
    • 1.5 系统调用
    • 1.6 虚拟机
  • 二,进程和线程
    • 2.1 进程
      • 2.1.1 进程的概念
        • 2.1.1.1 程序运行
        • 2.1.1.2 进程控制块PCB
      • 2.1.2 进程的五种状态的转换
      • 2.1.3 进程的通信
        • 2.1.3.1共享内存
        • 2.1.3.2消息传递
        • 2.1.3.3管道通信
    • 2.2 线程
      • 2.2.1 线程的理解
      • 2.2.2 多线程模型
        • 2.2.2.1 一对一模型
        • 2.2.2.2 多对一模型
        • 2.2.2.3 多对多模型
      • 2.2.3 线程的状态转换
    • 2.3 调度
      • 2.3.1 调度的层次
      • 2.3.2 调度算法
    • 2.3 同步和互斥
      • 2.3.1 对临界资源的访问
      • 2.3.2 互斥访问的算法-单标志法
      • 2.3.3 信号量机制
        • 2.3.3.1 整型信号量
        • 2.3.3.2 记录型信号量
      • 2.3.4 生产者和消费者问题
      • 2.3.5 死锁和饥饿
  • 三,内存管理
    • 3.1 内存空间的分配和回收
      • 3.1.1 连续分配
        • 3.1.1.1 动态分区分配采用的算法
      • 3.1.2 离散分配
        • 3.1.2.1 基本分页管理
          • 3.1.2.1.1 概念
          • 3.1.2.1.2 逻辑地址→物理地址
          • 3.1.2.1.3 快表TLB
          • 3.1.2.1.4 两级页表
        • 3.1.2.2 基本分段管理
        • 3.1.2.3 基本段页式管理
    • 3.2 内存空间的扩充
        • 3.2.1 覆盖技术
        • 3.2.2 交换技术
    • 3.3 内存保护
    • 3.4 虚拟内存
      • 3.4.1 虚拟内存概念
      • 3.4.2 请求分页存储
        • 3.4.2.1 页表机制
        • 3.4.2.2 缺页中断
        • 3.4.2.3 地址变换机构
  • 四,文件管理
    • 4.1 文件内部如何被组织起来(逻辑结构)
      • 4.1.1 顺序文件
      • 4.1.2 索引文件
      • 4.1.3 索引顺序文件
    • 4.2 文件之间如何被组织起来(目录结构)
      • 4.2.1 目录结构
      • 4.2.2 索引结点
    • 4.3 系统调用,文件的基本操作(比如read write函数)
      • 4.3.1 创建文件
      • 4.3.2 删除文件
      • 4.3.3 打开文件
      • 4.3.4 关闭文件
      • 4.3.5 读文件
      • 4.3.6 写文件
    • 4.4 文件如何存放在外存(物理结构)
      • 4.4.1 连续分配
      • 4.4.2 链接分配
        • 4.4.2.1 隐式链接分配
        • 4.4.2.2 显式链接分配
      • 4.4.3 索引分配
        • 4.4.3.1 链接索引分配
        • 4.4.3.2 分层索引分配
        • 4.4.3.3 混合索引分配
    • 4.5 操作系统如何处理外存的空闲块(存储空间管理)
    • 4.6 文件共享和保护
      • 4.6.1 硬链接下文件共享
      • 4.6.2 软链接下文件共享
      • 4.6.3 文件保护
    • 4.7 Open系统调用如何打开文件
    • 4.8 为什么不同格式的硬盘,都能用同一函数去进行读写操作
    • 4.9 文件系统的挂载
  • 五,输入输出(I/O)设备
    • 5.1 I/O设备
    • 5.2 I/O控制器
      • 5.2.1 I/O控制器概念
      • 5.2.2 I/O控制方式(CPU控制设备的方式)
        • 5.2.2.1 程序直接控制方式
        • 5.2.2.2 中断驱动方式
        • 5.2.2.3 DMA方式
        • 5.2.2.4 通道控制方式
    • 5.3 输入输出设备(对于网络设备工作原理)
      • 5.3.1 网络设备接口
      • 5.3.2 阻塞和非阻塞I/O
    • 5.4 进程控制I/O设备采用的方法
      • 5.4.1 设备控制表
      • 5.4.2 控制器控制表
      • 5.4.3 通道控制表
      • 5.4.4 系统设备表
      • 5.4.5 进程怎么样控制I/O设备
    • 5.5 缓冲区

文章内容来自王道计算机教育-操作系统,皆用于个人学习,如有不妥,联系作者。

一,操作系统相关概念

1.1 操作系统概念

  操作系统:控制和管理整个计算机的硬件和软件资源。调度计算机的工作和资源分配,给用户和软件提供接口和环境,以便用户和软件对计算机进行操作。主要包括①处理②存储器管理③文件管理④硬件设备管理。
在这里插入图片描述

1.1.1 操作系统 启动!!!

在这里插入图片描述

上电,CPU启动,执行ROM中的BIOS引导程序,先进行硬件自检,再开机。
BIOS将主引导记录(MSR)读取到RAM,执行磁盘引导程序,扫描分区表。
磁盘引导程序根据分区表,找到带有操作系统的C盘(Windows基本上都是C盘),读入分区引导记录(PBR),执行其中的程序。
上面这个PBR中的程序,会从根目录下面找到完整的系统初始化程序(启动管理器即boot,如果是linux,常用uboot,然后将镜像和设备树进行加载,挂载到根文件下),并执行,完成开机的操作。

1.1.2 大内核和微内核

在这里插入图片描述
  大内核处理更快,比如应用程序读取内存操作,从用户态切换到内核态,在内核态中实现进程管理(多个程序)和存储管理,得到结果,返回用户态,中间切换两次‘态’。微内核如果进行内存操作,需要进程管理和存储管理,来回需要四次‘态’的切换,这个是要一定成本。

1.2 操作系统并发,共享,虚拟,异步四大特征

1.2.1 并发和并行

  并发:看着是同时发生,但实际上是交替发生。比如电脑单核CPU执行A和B程序,A和B都同时运行了,但是对于CPU来说,同一时刻运行的只能有一个程序。
  并行:同一时刻,能执行多个。比如多核CPU,可以同时运行A和B程序在具体又很真实的同一时刻。

1.2.2 共享

在这里插入图片描述

1.2.3 虚拟

  将物理上的实体变为若干逻辑上对应物,比如虚拟存储技术,电脑内存为4GB,映射出的的内存大于4GB。

1.2.4 异步

  比如两个程序在运行时候,可能出现先执行A程序的第一步,再执行B程序的第一步,然后A程序的第二步…因此在计算机中的执行顺序并不是A程序1-2-3-over,再B程序1-2-3-over。

1.3 用户态和内核态

在这里插入图片描述
  内核态→用户态:执行一条特权指令,修改程序状态字寄存器(PSW)由1变0,从而使得操作系统让出CPU使用权。
  用户态→内核态:由中断完成(唯一途径),触发中断信号,操作系统强行夺回CPU的使用权。

1.4 中断的类型

在这里插入图片描述

  内中断:与当前执行指令有关,中断来自CPU内部,比如在用户态下,应用程序有一条特权指令,但是CPU此时在用户态,不可能执行特权指令,因此产生中断。
  外中断:与当前执行指令无关,来源于外部。比如时钟中断,I/O中断,

1.5 系统调用

  对于共享资源,不可能谁都可以任意时刻进行操作,因此操作系统为了对共享资源进行统一的管理,向上层提供了“系统调用”,用户层想用比如打印机这个共享资源,就要通过系统调用向操作系统内核发送请求,内核进行处理。

在这里插入图片描述

具体执行过程:应用程序的传参指令1和2→CPU,CPU执行后将寄存器存入参数,即系统调用的类型,应用程序发送陷入指令到CPU,CPU即执行中断相关操作,即系统调用程序即中断函数对应的程序,系统调用指令→CPU,判断寄存器的内容,是什么类型的系统调用,比如判断出寄存器里面参数1是fork,就去fork系统调用的程序执行,执行完毕,由内核态切换到用户态。
在这里插入图片描述

1.6 虚拟机

在这里插入图片描述

二,进程和线程

2.1 进程

2.1.1 进程的概念

  进程:程序运行的一次过程,包括PCB(进程控制块,操作系统用),程序段和数据段(这两个段是进程自己用的,也放在RAM中)。
在这里插入图片描述

2.1.1.1 程序运行

  当A进程运行,此时产生中断,让B运行,cpu中寄存器相关信息会保存到A的PCB中,B进程运行完,A进程继续运行,会将PCB中相关寄存器信息在放到CPU的寄存器中,从而使得A进程按照之前半道的结果,继续往下运行。
在这里插入图片描述

2.1.1.2 进程控制块PCB

  进程的PCB(Process Control Block,进程控制块) 是操作系统中用于管理和描述进程的核心数据结构,存储了进程运行时的所有关键信息。每个进程在创建时,操作系统都会为其分配一个唯一的PCB,相当于进程的“身份证”和“档案”。

  1. 进程标识信息
    o 进程ID(PID):唯一标识进程的编号。
    o 父进程ID(PPID):创建该进程的父进程ID。
    o 用户标识(UID/GID):进程所属的用户和组权限。
  2. 进程状态
    o 记录进程当前状态(如运行、就绪、阻塞、终止等)。
  3. CPU上下文(现场信息)
    o 寄存器值(如程序计数器PC、堆栈指针SP等),用于进程切换时恢复执行环境
  4. 内存管理信息
    o 内存分配情况(如页表、段表、堆栈指针等)。
  5. 资源使用信息
    o 打开的文件描述符、I/O设备占用情况等。
  6. 调度信息
    o 进程优先级、调度队列指针、时间片剩余量等。
  7. 其他控制信息
    o 信号处理表、进程间通信(IPC)状态等。

2.1.2 进程的五种状态的转换

  PCB中,有state(状态变量)表示进程的当前状态,如1表创建态,2表示就绪态,3表示运行态这样。其中三种基本状态:①运行态:占有CPU,并在CPU上运行,②就绪态:具备运行的条件,但是没有CPU空闲,因此运行不了,③阻塞态:等待某一事件而不能运行。

在这里插入图片描述

2.1.3 进程的通信

  进程通信(IPC):进程间进行数据的交互,进程拥有的内存地址空间是相互独立的,彼此间不能直接访问,因此要有特定的方法。
在这里插入图片描述

2.1.3.1共享内存

  ①开辟共享的存储区域,但是保证对共享空间的访问是互斥的,比如不能A进程和 B进程同时对共享区写数据。②基于数据结构的,比如开辟一个数组,让这个数组称为‘全局变量’,让俩进程都能访问。
在这里插入图片描述

2.1.3.2消息传递

  数据交互按格式化的消息为单位,进程通过操作系统提供的“发送消息和接收消息”两个原语进行数据交换。(原语:就是把操作变成‘一步’,一下子就执行了,中间没有打扰)
  ①直接通信:进程P利用发送原语往操作系统内核中发送一个消息,指名道姓要Q接收(消息内部有接收进程),进程Q通过接收原语,操作系统会检进程Q的消息队列,找到消息。
在这里插入图片描述
  ②间接通信:进程P通过发送原语往操作系统内核的信箱A发送一个消息,与直接通信不同的是,发送的消息没有指明要进程Q接收,进程Q此时利用接收原语去信箱A中瞅瞅,发现信箱A中有消息,就接收了。
在这里插入图片描述

2.1.3.3管道通信

  管道就是在内存中开辟一个大小固定的内存缓冲区。不同于共享存储,管道通信的数据类似于数据流,先往前面1,再2,再3写数据,另一个进程只能先读取1,后2,再3。而对于共享存储,可以任意进行读写。
  管道通信时半双工,某一时刻只能单向传输,如果要实现双向,需要两个管道,管道写满的话,写进程将会阻塞,因为没地方写了,同样读也是。
在这里插入图片描述

2.2 线程

2.2.1 线程的理解

  就好像QQ运行后是一个进程,在QQ中能进行聊天,开视频,读文章等等,又将进程划分为多个线程,让这些线程成为CPU的基本执行单元,进程用来分配资源。

2.2.2 多线程模型

2.2.2.1 一对一模型

  用户级线程:实现某功能的代码。内核级线程:真正在操作系统中,运行的功能载体。
  比如QQ这个进程对应下面分为左→右:①文字聊天,②开视频,③传输数据,对于一对一模型,每个功能模块①②③都对应有内核级线程,当某个线程阻塞了,其他的线程依旧可以运行,因为内核级线程才是CPU运行的基本执行单元。但是如果要进行功能切换,比如①→②→③,就会出现用户态→内核态→用户态→内核态…这种切换,占用CPU处理功能,因此要找到更好的办法,想出了多对一模型。
在这里插入图片描述

2.2.2.2 多对一模型

  这个多对一的好处就是不用来回进行麻烦的用户态→内核态,这种切换。但是多个用户态线程对一个内核级线程,当①功能执行,在内核态线程中出现了阻塞,那么其他的②③线程也执行不了,于是就有了下面多对多模型,让内核态线程少点,而不是只有一个,既能保证不阻塞,又能减少用户态到内核态的切换。
在这里插入图片描述

2.2.2.3 多对多模型

在这里插入图片描述

2.2.3 线程的状态转换

基本上和进程的一样。
在这里插入图片描述

2.3 调度

  调度机制:处理一堆任务,该按照什么顺序处理。
  用户提交作业 → 存入后备队列(JCB)→ 作业调度器选中 → 分配内存 → 创建PCB → 加入就绪队列 → 进程调度器分配CPU(作业调度器选中后,创建进程,PCB)

2.3.1 调度的层次

  高级调度(作业调度,即程序→创建态的策略):比如好几个程序要启动,先启动谁。按照一定的原则从外存的作业(类似于要运行的程序)后备队列中挑选一个作业调入内存,并创建进程,每个作业只调入一次,调出一次,作业调入分配内存(RAM),建立PCB,调出时撤销PCB。
  内存(RAM)不够时候,可以将进程的数据调出到外存,等RAM空闲或者进程要运行时,重新调入RAM,调到外面的进程状态称为挂起状态,被挂起的进程会组织成挂起队列。

  中级调度(内存调度,挂起态→就绪态):按照某种策略将挂起的进程重新调入内存中。

  低级调度(进程调度,就绪态→运行态):按照策略从就绪队列中(在RAM中)选取一个进程,将CPU分配给这个进程。这种调度是操作系统最基本的调度,频率很高,几十ms。
  进程调度的步骤,即进程A→进程B,假如A和B都没执行完,①那么要对A进程在CPU上的各种数据进行保留,比如程序计数器,程序状态字等寄存器数据,以便切换到A进程时,能从之前的运行结果继续运行,保存在A进程的PCB中,②对B进程各种数据的恢复,将B进程PCB中的内容,恢复到CPU的寄存器中。什么时候需要进行进程调度:
在这里插入图片描述

2.3.2 调度算法

  调度程序,主要实现①让谁运行,由调度算法决定,②运行多久,由时间片决定。Windows上采用的调度算法:多级反馈队列
在这里插入图片描述
例如:
在这里插入图片描述
  (注意右上角的时间片,分别分配1,2,4)P1首先运行,当时间为1时,P2进程到达,P1此时时间片用完了,进程还没结束,因此放到第二级队列(二级队列对首),执行P2运行时间,按照时间片1,然后P2也放到第二级队列(二级队列队二的位置),此时P3并为来,一共运行了2,于是来到二级队列执行P1,执行时间2,放到第三队列,再执行P2,执行时间本来能有2,但P3来了,实际1,并且在一级队列,先执行P3,执行1,正好P3结束,由于二级队列P2,于是执行P2,时间2,执行完毕P2,跑到三级队列执行P1,再执行时间4,由于没有更下级队列了,因此将P1继续放到三级队列的队尾,还差时间1,执行完后,结束。

2.3 同步和互斥

  同步:让并发的进程按照要求有序的推进,比如在进程的管道通信方式中,不清楚是写数据在前,还是读数据在前,进程同步就是保证了要让写数据在前读数据在后,即先写,然后才能读。
  临界资源:一个时间段内,只允许一个进程使用,比如摄像头。
  互斥:进程A访问临界资源F,进程B也想访问临界资源F,只有当进程A访问完临界资源F后,进程B才能访问。

2.3.1 对临界资源的访问

  分为四个阶段:
在这里插入图片描述

2.3.2 互斥访问的算法-单标志法

  进程进入临界资源的权限只能被另一个进程赋予,P0操作完,让变量turn为1,P1进程才能访问。除了单标志法还有双标志法等,其也是在进入区进行判断(不过增加了好几条语句,因此也会造成一定问题),硬件实现互斥的主要原理就是让在进入区位置的好几条合并为一条,利用原语这种思想。
在这里插入图片描述

2.3.3 信号量机制

  信号量机制:信号量就表示这种资源,信号量值就是资源剩余数量。

2.3.3.1 整型信号量

  进程P0先运行,进入区对S进行wait操作,此时S=0,进入临界区,使用打印机这种资源,此时如果进程P1在CPU运行,也想使用打印机,当其对S进行判断,发现S=0,在wait中一直陷入while循环中,状态也变为阻塞态,CPU继续让P0运行,当P0执行signal操作使S=1,此时其他进程P1,P2等才能使用打印机资源。
在这里插入图片描述

2.3.3.2 记录型信号量

在这里插入图片描述
  记录型信号量,比整型更好使一些,更聪明。当进程P0,P1先后执行,并且暂时不停,P2进程运行,执行wait操作,value由0变为-1,P2进程到等待队列头,P3运行同理也放到等待队列,value=-2,此时P0执行完毕,使得value变为-1,当value为-1<0,说明有俩等待进程,-1和0,唤醒P2进程,当P1进程执行完毕,value变为0,唤醒P3进程,然后P2和P3依次执行完毕。
在这里插入图片描述

2.3.4 生产者和消费者问题

  P即进入区的操作,V即退出区的操作。正常对一个进程,先P后V。对于生产者,只有当缓冲区没满,才能往里面写数据。对于消费者,只要缓冲区有东西,就能读。主要对full,empty和mutex(这个是操作数据的,为了保护数据用的)。
在这里插入图片描述

在这里插入图片描述

2.3.5 死锁和饥饿

死锁:即进程之间互相等待对方手里的资源,导致进程都阻塞,例如进程A:
// 进程A
P(S1); // 获取信号量S1
P(S2); // 然后尝试获取S2
V(S2);V(S1);// 临界区

// 进程B
P(S2); // 获取信号量S2
P(S1); // 然后尝试获取S1
V(S1);V(S2);// 临界区
如果进程A获取了S1,进程B获取了S2,然后两者都试图获取对方持有的信号量,就会导致死锁。

饥饿:比如一个耗时长的进程,并且优先级低,当它执行一段时间,来了高优先级并且耗时短的进程,一直来,导致这个长进程一直无法运行。

三,内存管理

在这里插入图片描述

3.1 内存空间的分配和回收

3.1.1 连续分配

  单一连续:分为操作系统和用户区,用户区只有一个程序应用。
  固定分配:分为操作系统和用户区,用户区均匀或者非均匀的分配给若干进程。
  动态分区分配:在进程装入内存时,根据进程的大小建立分区,使分区的大小正好适合进程的需要,系统分区的大小和数目可变。
  内部碎片:比如给进程2MB大小空间,但是进程就用了1.5MB,有剩余没用上,称为内部水片。
  外部碎片:比如进程需要20MB空间,并且需要的是连续空间,内存中分别有10MB,5MB和5MB的剩余空间,分散开,虽然内存的剩余空间总和够用,但是不连续,进程还是用不了,称为外部碎片。

3.1.1.1 动态分区分配采用的算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.2 离散分配

3.1.2.1 基本分页管理
3.1.2.1.1 概念

  页框内存被分成一个一个4KB的内存空间,即页框。
  页和页面:是进程比如16KB大小,被分为四个部分,一个占4KB,这称为页面和页。
  页表:将进程中的页(页面)和内存中的页框进行联系,一个进程只建立一个页表。

在这里插入图片描述
在这里插入图片描述

3.1.2.1.2 逻辑地址→物理地址

例如:
在这里插入图片描述
页号=110/50=2,页内偏移量=110%50=10

在这里插入图片描述

3.1.2.1.3 快表TLB

  快表:由逻辑地址计算出页号后,到快表中查找,要是有一样的页号,直接(映射关系)就能得到页框号(内存块号),然后由内存块号号+偏移地址,计算出物理地址,因此相对于慢表两次内存访问(首先是在找内存块号上,它不是映射关系,要根据页表,由页号对应页表项中的内容(地址),找到内存号,一次内存访问,然后后面由内存块号+偏移地址找到物理地址,第二次内存访问),快表只需要一次。
在这里插入图片描述
在这里插入图片描述

3.1.2.1.4 两级页表

  就是进程分割成多个页,对应的页表中的页表项需要连续存放,实现困难,其次是对于一个进程,常用的部分占进程很小一部分,对应的也就几个页面,不需要把整个进程的页都放到页表中。相当于是把页表拆开,分成多个,然后再用一个页表表示其中的关系,这样既能解决连续问题,还能容易调用常用的进程部分。
在这里插入图片描述

在这里插入图片描述

3.1.2.2 基本分段管理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  分段比分页更容易实现信息的保护和共享,比如按照段,让不同进程段号对应的段基址指向相同位置,能共享数据。
在这里插入图片描述
在这里插入图片描述

3.1.2.3 基本段页式管理

在这里插入图片描述
  相当于是组合了两者,按照分段的思想,把分出来的段又再分页,从而即有逻辑上(分段的好处)的结构,又能提高内存空间利用率(分页的好处)。

3.2 内存空间的扩充

3.2.1 覆盖技术

  覆盖技术:设置经常使用的设置为固定区,不经常使用的设置为覆盖区,按照逻辑设置覆盖区和固定区。在这里插入图片描述

3.2.2 交换技术

  交换技术:当内存空间紧张,将一些此时不用进程换出外存,将外存中具备运行条件的进程换入内存。

3.3 内存保护

  这个是为了进程之间不相互干扰,彼此的数据不能放在一个地方,想要通信有通信的三种方式。
在这里插入图片描述
在这里插入图片描述

3.4 虚拟内存

在这里插入图片描述

3.4.1 虚拟内存概念

  在操作系统管理系,比如4GB运行内存的计算机,能运行两个4GB的程序。一般一个进程运行一条指令,还有很大可能继续用这个指令,其次是由很大可能运行这个指令旁边内存单元的指令,因此将这种‘大可能的放到内存中’。虚拟内存解决传统存储方式两个问题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.2 请求分页存储

3.4.2.1 页表机制

  在原来页表的前提下,增加了比如状态位,访问字段,修改位和外存地址这种信息,目的是为了换入换出内存。
在这里插入图片描述

3.4.2.2 缺页中断

  通过这个状态位,判断页面在不在内存,没有在内存就产生缺页中断。

3.4.2.3 地址变换机构

在这里插入图片描述
在这里插入图片描述

四,文件管理

在这里插入图片描述

4.1 文件内部如何被组织起来(逻辑结构)

  文件控制块FCB:存储了文件的基本信息(文件名,物理地址,逻辑结构,物理结构),用于管理打开的文件,实现了文件名和文件之间的映射,用户程序可以根据文件名来操作文件,最重要的就是文件名和存放的物理地址,FCB有序集合称为文件目录,一个FCB就是一个文件目录项。无结构文件比如.txt文件
在这里插入图片描述
在这里插入图片描述

4.1.1 顺序文件

  逻辑上相邻,就是用户方面认为是挨着,比如建立一个表格后,有一号,二号这样的,为逻辑上相邻,但是在外存中,这俩数据放的物理地址不一定是相邻的。
在这里插入图片描述

4.1.2 索引文件

在这里插入图片描述

4.1.3 索引顺序文件

在这里插入图片描述

4.2 文件之间如何被组织起来(目录结构)

在这里插入图片描述

4.2.1 目录结构

  单级目录:早期操作系统整个系统只建立一张目录表,每个文件占一个目录表。
  两级目录:分为主文件目录和用户文件目录,一直到后面的多级目录表
  无环图目录在这里插入图片描述

4.2.2 索引结点

  就是将原来的FCB(文件名,类型…)变为文件名+索引结点指针,plus版本FCB。在这里插入图片描述

4.3 系统调用,文件的基本操作(比如read write函数)

在这里插入图片描述

4.3.1 创建文件

在这里插入图片描述

4.3.2 删除文件

在这里插入图片描述

4.3.3 打开文件

在这里插入图片描述
在这里插入图片描述

4.3.4 关闭文件

在这里插入图片描述

4.3.5 读文件

在这里插入图片描述

4.3.6 写文件

在这里插入图片描述

4.4 文件如何存放在外存(物理结构)

  本节讲的是如何将文件放到外存中,采用什么办法,逻辑块是用户方面,物理块是操作系统方面。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.4.1 连续分配

在这里插入图片描述
在这里插入图片描述

4.4.2 链接分配

4.4.2.1 隐式链接分配

  隐式就是磁盘块相当于链表,一个磁盘块中指明了下一个用的磁盘块,都是放在外存中的,再添加一个磁盘块的话也容易,让原本末尾的磁盘块指向这个添加的磁盘块就行了。
在这里插入图片描述

4.4.2.2 显式链接分配

  显式链接就是FCB中只有文件的起始块号,将这些磁盘块的下一块关系用一个表来描述,这样如果想要读取某个磁盘块的块,就不像隐式磁盘块那样,要从头和链表一样,一直读到自己想要的磁盘块,这个直接用表,查表就行了。
在这里插入图片描述
在这里插入图片描述

4.4.3 索引分配

  链接分配是针对物理块的关系,指向下一块,索引分配是建立表,表明逻辑块和物理块的关系。
在这里插入图片描述

4.4.3.1 链接索引分配

在这里插入图片描述

4.4.3.2 分层索引分配

在这里插入图片描述

4.4.3.3 混合索引分配

在这里插入图片描述

4.5 操作系统如何处理外存的空闲块(存储空间管理)

在这里插入图片描述

4.6 文件共享和保护

在这里插入图片描述

4.6.1 硬链接下文件共享

  每个文件在创建时候会分配唯一一个索引结点号,当多个文件名(目录项)指向同一个 索引结点,索引结点的数量记录了有多少个文件名指向它,只有当为0时,文件数据才会真正的删除,允许多个文件名(硬链接)或路径指向同一个文件数据,而不会重复存储文件内容。

4.6.2 软链接下文件共享

在这里插入图片描述

4.6.3 文件保护

在这里插入图片描述

4.7 Open系统调用如何打开文件

一个666进程,执行了打开文件操作。
①执行open函数,想打开目录M下的文件A,先把目录M送到内核中,然后在内核中找到A文件对应的FCB_A。
②将A文件对应的FCB_A放到系统打开文件表(系统只有一张),并且将打开计数设置为1,说明A文件只打开一次即被一个进程打开了。
③在执行①步骤的同时,进程同时在进程打开文件表(一个进程有一个)中建立对应的索引,打开方式(根据open函数),并且给用户返回一个文件描述符,便于用户操作这个文件,这个用户描述符号,指向进程打开文件表的索引。这个进程打开文件表里面不保存FCB信息,而是有一个系统打开文件表索引,指向系统打开文件表,对应有FCB_A的信息。
如果想执行读操作,即文件描述符→进程打开文件表的索引→系统打开文件表索引→PCB_A。
在这里插入图片描述

4.8 为什么不同格式的硬盘,都能用同一函数去进行读写操作

  比如对UFS文件系统,FAT文件系统等,open函数对于不同的文件系统就不一样,但是为了用户好用,将这些不同的文件系统操作函数,进行了统一。

在这里插入图片描述
在这里插入图片描述
  怎么样实现的:创建一个vnode节点,将不同的文件系统的信息,用统一的数据结构存储。并且有函数功能指针,包括open、read、write等函数,这个对于用户来说吴无论是什么文件系统,这些函数都是一样的,vnode的函数功能指针,再指向不同的文件系统。
在这里插入图片描述
在这里插入图片描述

4.9 文件系统的挂载

  其实挂载到的是虚拟文件系统上。步骤②的函数地址表,即这个文件系统的open,read等函数的地址。在这里插入图片描述

五,输入输出(I/O)设备

5.1 I/O设备

在这里插入图片描述

5.2 I/O控制器

5.2.1 I/O控制器概念

在这里插入图片描述
  对于一个I/O控制器可能对应多个设备,因此数据寄存器、控制寄存器、状态寄存器可能有多个。
在这里插入图片描述

5.2.2 I/O控制方式(CPU控制设备的方式)

在这里插入图片描述
在这里插入图片描述

5.2.2.1 程序直接控制方式

  就是CPU直接通过I/O控制器控制设备,CPU采用轮询的方式,查状态寄存器为0,说明准备好了,然后读取数据寄存器中的信息。
在这里插入图片描述

5.2.2.2 中断驱动方式

  当设备执行完,往I/O控制器中放入数据,I/O控制器会给CPU发送一个中断信号,表示设备执行完了,CPU从I/O控制器中读取一个字的数据。
在这里插入图片描述
在这里插入图片描述

5.2.2.3 DMA方式

  DMA和中断的区别在于,中断是一个字,太慢了传输数据,因此在中断的基础上,操作以为单位,再产生中断。(真实的传输过程,也是一个一个字这样,不过积累到块,再产生中断。)
  DMA和下面通道控制的区别在于,DMA方式,CPU已经把很详细的信息比如进行的操作(读/写),读入多少数据,放到什么位置等等,对于通道的话,相当于给他了一段代码,让他去执行,然后执行完毕,产生中断。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2.2.4 通道控制方式

  DMA方式只能操作一个块,或者是连续的块,当应对离散的块就需要多次调用DMA方式,产生多个中断,通道控制的话,相当于它执行一段程序,方便处理这种离散的块,只产生一次中断。
在这里插入图片描述

5.3 输入输出设备(对于网络设备工作原理)

在这里插入图片描述
在这里插入图片描述

5.3.1 网络设备接口

P3进程想要进行网络通信,使用socket(网络套接字),作用相当于在内核空间开辟一段空间,并且给用户返回一个fd指针,使用bind将这个套接字绑定到本地的6666端口。
P1进程也进行同样操作,绑定端口为211,使用connect函数调用(举例connect(P1的fd,168.98.×××.×××,6666)),将P1的套接字和P2的套接字进行应用层上的连接。
通信,在传输层,假如采用TCP通信,假如P1进程用write函数将数据写到套接字对应的缓冲区,设备独立性软件将缓冲区的数据通过网卡,采用TCP通信,将数据发送到另外一个网卡上,对于主机2,网卡来了数据,会产生一个中断信号,中断处理程序调用网卡的驱动程序,将数据从网卡放到内核空间的套接字中,进程P2就可以调用read函数读取到P1发来的数据。

在这里插入图片描述

5.3.2 阻塞和非阻塞I/O

  阻塞I/O:比如调用scanf函数后,要从键盘输入一个字符,但是一直没输,此时就会将这个进程变为阻塞态等待。
  非阻塞I/O:往磁盘写入数据调用write函数,即使磁盘忙碌,将要写入的数据放入到缓冲区,就不用管了,不会影响进程等待。
在这里插入图片描述

5.4 进程控制I/O设备采用的方法

在这里插入图片描述
在这里插入图片描述

5.4.1 设备控制表

在这里插入图片描述

5.4.2 控制器控制表

在这里插入图片描述

5.4.3 通道控制表

在这里插入图片描述

5.4.4 系统设备表

在这里插入图片描述

5.4.5 进程怎么样控制I/O设备

  就是进程通过在逻辑上的设备名,比如/dev/print查找系统设备表(SDT)中空闲的,给这个进程用,并且在逻辑表中建立逻辑名和物理名的关系,在系统设备表(SDT)找到设备控制表(DCT),继续查询控制器控制表(COCT),不忙碌将控制器分配给进程。继续查询通道控制表(CHCT),当通道不忙碌,将通道分配给进程。因此设备的这种通道→控制器→设备,这种关系,因此分配给进程设备的时候,要依次分配通道→控制器→设备。
在这里插入图片描述
在这里插入图片描述

5.5 缓冲区

在这里插入图片描述

相关文章:

  • 小米MiMo推理大模型开源:7B参数规模超越更大规模模型
  • 电子制造业智能化转型:APS高级排程软件如何破局效率革命
  • x-cmd install | Tewi - 终端里的 Transmission 掌控者,功能全面的 BT 下载管理工具!
  • VSCode Auto Rename Tag插件不生效
  • 一套SaaS ERP管理系统源码,支持项目二开商用,SpringBoot+Vue+ElementUI+UniAPP
  • MicroPython for esp32s3开发HX711称重模块指南
  • 管家婆易指开单如何设置零售开单
  • Git从入门到精通-第二章-工具配置
  • 在TensorFlow中,`Dense`和`Activation`是深度学习模型构建里常用的层
  • Socket-UDP
  • [Unity]设置自动打包脚本
  • [Survey] Image Segmentation in Foundation Model Era: A Survey
  • VBA代码解决方案第二十四讲:EXCEL中,如何删除重复数据行
  • 2025深圳杯东三省数学建模竞赛选题建议+初步分析
  • hadoop伪分布式模式
  • MySQL RR (Repeatable Read) 隔离级别规则细节
  • B/S架构:定义、原理及其在软件测试中的应用
  • 软考中级-软件设计师 数据结构(手写笔记)
  • 基于静态局部立方体贴图的高效软阴影
  • 【效率提升】Vibe Coding时代如何正确使用输入法:自定义短语实现Prompt快捷输入
  • 当农民跨进流动的世界|劳动者的书信①
  • 《求是》杂志发表习近平总书记重要文章《激励新时代青年在中国式现代化建设中挺膺担当》
  • 中国科学院院士张泽民已任重庆医科大学校长
  • 十大券商看后市|A股风险偏好有望边际改善,市场仍处黄金坑
  • 我国核电总体规模首次跃居世界第一,发电量持续增长
  • 大家聊中国式现代化|邓智团:践行人民城市理念,开创人民城市建设新局面