操作系统
- 一,操作系统相关概念
- 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,相当于进程的“身份证”和“档案”。
- 进程标识信息
o 进程ID(PID):唯一标识进程的编号。
o 父进程ID(PPID):创建该进程的父进程ID。
o 用户标识(UID/GID):进程所属的用户和组权限。 - 进程状态
o 记录进程当前状态(如运行、就绪、阻塞、终止等)。 - CPU上下文(现场信息)
o 寄存器值(如程序计数器PC、堆栈指针SP等),用于进程切换时恢复执行环境。 - 内存管理信息
o 内存分配情况(如页表、段表、堆栈指针等)。 - 资源使用信息
o 打开的文件描述符、I/O设备占用情况等。 - 调度信息
o 进程优先级、调度队列指针、时间片剩余量等。 - 其他控制信息
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),当通道不忙碌,将通道分配给进程。因此设备的这种通道→控制器→设备,这种关系,因此分配给进程设备的时候,要依次分配通道→控制器→设备。