操作系统学习小结
想写一写操作系统的学习小结,将自己学习的思路与想法记录下来,目标是想以尽量通俗易懂的语言将一些抽象性的概念描述出来,在记录过程中会有一些不足之处,希望大家批评指正!共勉!
操作系统的启动流程
一些概念
BIOS:BIOS为基本输入/输出系统的简称,是计算机系统中的一种固件,它位于计算机的主板上,通常存储在一块可擦写的芯片中。BIOS是计算机启动时的关键组件之一,它负责初始化和检测硬件设备,启动操作系统,并提供一些基本的输入/输出功能,如键盘、显示器和磁盘驱动器的控制。
bootloader:bootloader(引导加载程序)是一段特殊的程序,位于计算机硬盘或其他启动设备的特定区域,负责启动操作系统的加载过程。
启动流程
计算机开机后首先执行计算机主板上固化在芯片中的BIOS程序。
启动后,BIOS写入内存固定地址,CPU从内存起始位置开始执行命令
BIOS开始执行自检,将bootloader从DISK读入内存并开始执行

bootloader将操作系统从DISK加载到内存中并开始执行

(注:BIOS存放位置:BIOS是存放在主板的一块ROM芯片上,操作系统与bootloader存放在DISK中)
内存管理
一些概念
内存碎片:
1.内碎片:分配单元内未使用的内存,如进程需要100K的空间,但系统分配给进程128KB的地址空间,就会在空间内部产生28K的未使用部分,称之为内部碎片
2.外碎片:分配单元间未使用的内存,例如进程与进程间未被使用的空间
减少内存碎片两种简单方法:
1.压缩式:将内存中的进程向上压缩,更紧致,腾出更大空闲块。此方法内存能有效利用但开销大
2.交换式碎片整理:将暂时不需要运行的进程放入磁盘,此方法磁盘与内存的交互会变频繁
内存连续分配的几个原则:
1.第一匹配原则:找到内存中第一个空闲的内存块满足需求,此原则操作简单,但易于产生大空闲块,外碎片多
2.最佳匹配原则:找到内存中与所需分配内存差别最小的空闲块,此原则重分配慢,会很多小的外碎片
3.最差匹配原则:将最大的空闲块分配给新进程,此原则尽可能地减少碎片,但可能产生很多小的碎片
上述做法都是在内存找到连续的内存块来分配新的进程,那么当内存中没有足够的内存块来分配新进程怎么办呢?引入了分页和分段机制。
分段
1.什么是段:计算机进程由多个模块组成,有代码段、数据段、堆栈段、附加段等(共享库段、只读段)等,这些段就是分段需要处理的段,每个段都有自己的基址和界限信息,用于指定段在内存中的位置和大小,每个段也都有自己的标识符,通常是一个整数或字符串。
2.什么是段表:段表即映射逻辑地址空间的段号与实际物理地址空间的段号的映射表。通常以数组或其他数据结构的形式存在。
3.段表如何将逻辑地址转化为物理地址:实际上,逻辑地址转换可能涉及更多的步骤和复杂性,如权限检查、异常处理等,但基本的原理是查找段表中的表项,通过一定的计算方法计算出表项的物理地址,然后执行必要的操作。

分页
1.什么是页:操作系统将进程的逻辑地址空间划分成相等大小的地址空间,每个地址空间称为页,同时将物理内存划分成相同大小的页框(Page Frame)。
2.什么是页表:操作系统维护一个称为页表(Page Table)的数据结构,用于跟踪每个进程的页与物理内存中的页框之间的映射关系。页表的条目存储了逻辑页号与物理页框号之间的映射关系。
3.页的大小:分页系统中,页的大小通常是固定的,典型的页大小为4KB或更大。这个大小取决于硬件和操作系统的设计。
4.分页优势:
内存管理的简化: 分页可以简化内存管理,因为页的大小是固定的,操作系统无需处理不同大小的内存块。
虚拟内存支持: 分页为虚拟内存提供了基础,因为虚拟内存可以很大,使得程序可以访问超出物理内存容量的数据,而这些数据可以被交换到磁盘上。
隔离和保护: 分页允许操作系统为每个进程创建独立的页表,从而实现了内存隔离和进程间的保护。
高效的内存利用: 分页允许操作系统更有效地利用物理内存,因为它可以将物理页框动态地分配给不同的进程,以满足它们的需求。
5.分页与分段的优缺点比较:

添加图片注释,不超过 140 字(可选)
6.进程的页表:每个进程都有自己的页表,当进程访问虚拟地址时,操作系统通过访问页表映射到物理地址,将数据加载到正确的位置。
一个进程对应一张页表
进程的每一页对应一个页表项
每个页表项由页号和块号组成
页表记录进程页面和实际存放的内存块之间的对应关系
每个页表项的长度是相同的

页寻址机制
7.缺页:缺页(Page Fault)是指程序在访问虚拟内存中的某个页面时,发现该页面并未加载到物理内存中,需要将其从磁盘或其他外部存储器加载到物理内存中才能继续执行相应的指令或访问相应的数据。
进程管理
进程是什么
正在运行中的程序称为进程,进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。
进程的组成
1.程序代码:要执行的程序的代码。通常是二进制指令或机器码的形式。程序代码定义了进程的任务和功能。
2.数据:用于存储变量、数据结构等,可在进程的生命周期内被读取和修改,允许程序在运行时维护状态。
3.堆栈:用于管理函数调用和局部变量。堆栈是一种数据结构,用于跟踪函数的调用和返回,以及保存局部变量的状态。
4.程序计数器(PC):程序计数器是一个寄存器,用于存储下一条要执行的指令的地址。在执行程序时,PC会不断更新,以指示下一个要执行的指令。
5.寄存器状态:进程还包含了CPU寄存器的状态。寄存器用于存储计算中间结果、标志位和其他与进程执行相关的信息。
6.打开文件描述符:进程可以打开文件或其他资源,每个打开的文件都会分配一个文件描述符,用于跟踪和管理对文件的访问。
7.进程标识符PID:每个进程有唯一的标识符。
8.进程状态: 进程可以处于不同的状态,如运行、就绪、阻塞等。进程状态是进程的一个重要属性,操作系统根据状态来调度进程的执行。
9.上下文信息: 当操作系统需要切换到另一个进程时,它必须保存当前进程的上下文信息,包括寄存器状态、程序计数器值等。这个信息被存储在操作系统的数据结构中,以便在以后重新加载。

进程的上下文切换
10.进程控制块PCB:进程控制块是操作系统中用于管理进程的数据结构。它包含了进程的所有重要信息,包括进程的状态、上下文信息、PID、优先级等。
进程创建时间
1.系统初始化:操作系统本身也是一个进程,它在计算机启动时就会被创建。操作系统的启动过程涉及创建多个系统级别的进程,以便管理计算机的各个方面。
2.用户请求:用户启动一个应用程序,这是最常见的情况。
3.运行的进程执行创建进程的系统调用,即运行中的进程需要创建新的进程
进程如何创建

内存创建流程
分配进程控制块PCB与进程标识符PID:OS为新进程分配一个PCB与唯一的PID,PCB 是用来存储和管理进程信息的数据结构。PID用于唯一标识系统中的每个进程。
分配地址空间:OS会为新进程分配一块内存空间,用于存储程序代码、数据、堆栈等信息。这通常是通过虚拟内存管理实现的。
初始化上下文:OS会为新进程初始化上下文信息,主要为内部寄存器信息。
置于就绪状态:OS会将新进程设置为就绪状态并加入就绪队列
这些步骤构成了进程的创建流程。需要注意的是,不同的操作系统和编程环境可能具有不同的细节和方式来创建进程,但上述步骤是通用的概括。进程的创建是操作系统中的一个复杂任务,操作系统必须有效地管理和维护进程的状态和资源,以实现多任务处理。
进程的生命周期

进程间的通信
进程通信是指在计算机系统中,不同的进程之间需要传递信息、共享数据或协同工作的一种机制。进程通信通常发生在多任务操作系统中,其中多个进程同时运行并可能需要协作完成任务。以下是一些常见的进程通信方式:
管道(Pipe):管道是一种单向通信机制,允许一个进程将数据写入管道,而另一个进程从同一管道读取数据。通常,一个进程充当写入者,而另一个充当读取者。
命名管道(Named Pipe):与管道类似,但允许不同进程通过共享的命名管道进行通信,而不仅仅是父子进程之间。
消息队列(Message Queue):消息队列允许进程通过发送消息进行通信。这些消息可以包含数据以及用于标识消息类型或目标进程的信息。
信号(Signal):信号是一种用于通知进程发生某些事件的机制。例如,一个进程可以向另一个进程发送信号,通知它应该终止或重新启动。
共享内存(Shared Memory):共享内存允许多个进程共享同一块物理内存区域。这使得数据可以直接从一个进程传递到另一个进程,而无需复制数据。
套接字(Socket):套接字是一种网络通信的方式,但也可以用于本地进程之间的通信。通过套接字,进程可以在不同计算机上或同一计算机上的不同端口进行通信。
信号量(Semaphore):信号量是一种用于控制对共享资源的访问的机制。进程可以使用信号量来协调对共享资源的访问,以防止竞争条件。
文件(File):进程可以通过读写共享文件来进行通信。一个进程可以将数据写入文件,而另一个进程可以从同一文件读取数据。
远程过程调用(RPC)和进程间通信(IPC):这些是高级通信机制,允许远程计算机上的进程相互调用函数或方法,并通过网络传递数据。
选择哪种进程通信方式取决于应用程序的需求和设计,以及操作系统提供的支持。不同的通信方式有不同的复杂性和性能特性,开发人员需要谨慎选择以满足特定场景的需求。
进程阻塞原因
1.请求数据未到达
2.等待系统调用
3.启动某种操作,无法马上执行
线程的概念
线程是进程(Process)内部的一条执行路径。线程是操作系统能够进行调度和执行的最小单位,它包含了在进程中执行的指令序列和相关的数据。每个进程可以包含一个或多个线程,这些线程可以并发执行,共享进程的资源和内存空间。
线程与进程的区别
进程是资源分配的基本单位,线程是CPU调度的基本单位
单独性:
进程是独立的执行单元,拥有自己的独立内存空间和资源。每个进程都有自己的代码、数据和堆栈。进程与进程间是一般是互相隔离的。
线程是进程内的子执行单元,多个线程属于同一个进程,共享进程的内存空间和资源。
切换开销:
由于进程有独立的内存空间,进程之间的切换开销较大,需要保存和恢复大量的上下文信息。
线程之间的切换开销较小,因为它们共享相同的内存空间,上下文切换通常只需要保存和恢复寄存器的值,线程上下文切换不需要改变地址空间(不需要切换当前的虚拟内存空间或使用的页表)。
通信和同步:
进程之间通信较为复杂,通常需要使用进程间通信(IPC)机制,如管道、消息队列、共享内存等,来实现数据交换。
线程之间通信更容易,可以直接读写共享内存,但也需要注意同步问题,以避免竞态条件和数据一致性问题
创建和销毁成本:
创建和销毁进程的成本较高,因为每个进程都需要分配独立的内存空间和资源。
创建和销毁线程的成本较低,因为它们共享进程的资源,只需要分配一些额外的栈空间即可
安全性:
由于进程拥有独立的内存空间,进程之间更加隔离,一个进程的崩溃通常不会影响其他进程。
线程共享相同的内存空间,一个线程的错误可能会影响整个进程,导致进程崩溃(缺陷)。
线程的组成
线程是计算机程序执行的最小单位,它由多个组成部分组成,这些部分协同工作以执行线程的任务。以下是线程的主要组成部分:
线程ID(Thread ID):线程ID是唯一标识一个线程的数字或标识符。它允许操作系统和程序来区分不同的线程。
寄存器集合(Register Set):每个线程都有自己的寄存器集合,包括通用寄存器、程序计数器(PC)等。寄存器用于存储线程执行时的临时数据和状态信息。
栈(Stack): 每个线程都有自己的栈,用于存储函数调用和局部变量。栈是一个后进先出(LIFO)数据结构,用于跟踪函数的调用和返回。
线程局部存储(Thread-Local Storage,TLS):线程局部存储是线程私有的内存区域,用于存储线程特定的数据,这些数据对于其他线程不可见。线程局部存储通常用于保存线程的状态信息或其他线程无法共享的数据。
线程控制块(Thread Control Block,TCB):线程控制块是操作系统维护的数据结构,用于存储线程的状态信息和管理线程的执行。TCB 包含线程的状态、优先级、寄存器值、线程ID等信息。
线程优先级(Thread Priority):线程通常具有优先级,用于确定线程在竞争CPU时间时的执行顺序。较高优先级的线程可能会在较低优先级的线程之前执行。
线程状态(Thread State):线程可以处于不同的状态,如运行、就绪、阻塞等。线程状态用于描述线程当前的执行情况。
线程同步机制:线程可能需要进行同步操作以避免竞态条件和数据访问冲突。线程同步机制包括互斥锁、信号量、条件变量等,用于控制线程的访问和操作共享资源。
这些组成部分协同工作,使线程能够执行任务并与其他线程共享数据和资源。线程的创建、调度、销毁和同步等操作都受线程的组成部分和线程控制块的管理。理解线程的组成部分有助于开发者编写多线程程序并有效地管理线程的行为。
处理机调度概念
处理机调度是操作系统的核心功能之一,它负责决定在多个就绪状态的进程或线程之间分配CPU时间片,以实现公平共享CPU资源,提高系统的性能和响应速度。以下是处理机调度的一些关键概念和方法:
调度队列(Scheduling Queue):调度队列通常指的是在计算机操作系统中用于管理和执行进程的一种数据结构。它是一个按照一定的策略来安排和分配CPU时间的队列。调度队列的目的是优化资源的利用,确保系统能够高效地运行多个任务。
优先级(Priority):在操作系统中,优先级调度是一种调度算法,它根据任务的优先级来分配CPU时间。每个任务都被分配一个优先级值,通常是一个整数,数值越小表示优先级越高。当系统中有多个任务需要执行时,优先级高的任务将会先被执行。
抢占性(Preemption):抢占性是指操作系统可以在一个进程或任务还未完成时,剥夺其正在使用的CPU资源,将CPU资源分配给具有更高优先级的另一个进程或任务的能力。
在抢占性调度中,操作系统会根据某些规则(如优先级或时间片)来决定是否暂停当前正在执行的任务,并将CPU资源分配给另一个任务。这使得高优先级任务能够及时响应并执行,而不会被低优先级任务长时间占用CPU。
多核调度、实时调度(Real-Time Scheduling)、调度策略(Scheduling Policies)、上下文切换(Context Switching)
处理机调度策略
先来先服务调度(First-Come, First-Served,FCFS):按照进程到达的顺序分配CPU时间片。FCFS通常用于处理任务或进程的顺序,其中任务按照它们到达系统或队列的顺序来执行,最先到达的任务首先被处理,直到完成或等待某种事件发生后才进行下一个任务。
优缺点:简单且公平,但可能导致长作业等待时间。
最短作业优先调度(Shortest Job First,SJF):选择估计执行时间最短的进程或线程先执行。(非抢占式)若在进程A进行过程中到来进程B和C,则比较BC的运行时间长短,等待A一直运行到结束,选择执行时间最短的任务。(抢占式)系统可以在任何时刻中断当前执行的任务,如果有一个更短的任务到达就绪队列,系统会立即切换到该任务。这种方式需要动态地监测任务的执行时间,并在需要时进行切换。
优缺点:最小化平均等待时间,但需要准确的执行时间估计。
轮转调度(Round Robin,RR):将CPU时间划分成固定大小的时间片,每个进程或线程执行一个时间片,然后排到队列的末尾。
优缺点:公平分配CPU时间,适用于时间共享系统,但可能导致上下文切换开销。
优先级调度(Priority Scheduling):
为每个进程或线程分配一个优先级,高优先级的先执行。
优缺点:可以根据任务的重要性分配优先级,但可能导致低优先级任务饥饿。
多级反馈队列调度(Multilevel Feedback Queue,MLFQ):
将进程分为多个队列,每个队列有不同的优先级,新进程进入最高优先级队列。
根据进程的行为和性能动态调整队列和优先级,适用于多样化的工作负载。
处理机调度准则
处理机调度是操作系统中的一个重要任务,它决定了在多个进程之间如何分配处理机时间,以最大程度地提高系统的吞吐量、响应时间和效率。不同的调度算法和准则可以用来实现不同的性能目标,以下是一些常见的处理机调度准则:
公平性(Fairness):确保每个进程都能获得公平的处理机时间,以防止某个进程长时间占用处理机而导致其他进程无法运行。
优先级(Priority):为每个进程分配一个优先级,高优先级的进程在竞争处理机时间时会被优先考虑。这可以用于确保关键任务得到及时处理。
短作业优先(Shortest Job First,SJF):优先选择估计执行时间最短的进程,以最小化平均等待时间。这需要对进程的执行时间有良好的估计。
轮转(Round Robin):按照固定时间片(时间片轮转)或时间片可变(多级反馈队列)的方式分配处理机时间,以确保每个进程都有机会运行。这种方法适用于多任务系统。
多级队列(Multilevel Queue):将进程分为多个队列,每个队列具有不同的优先级,不同队列之间采用不同的调度算法。例如,高优先级队列可能采用SJF调度,而低优先级队列采用轮转调度。
最早截止时间优先(Earliest Deadline First,EDF):为每个进程分配一个截止时间,选择下一个要执行的进程时优先考虑截止时间最早的进程,以确保实时任务按时完成。
响应时间(Response Time):优先选择能够更快响应用户输入或事件的进程,以提高系统的交互性能。
负载均衡(Load Balancing):在多处理器系统中,调度器可以尝试将进程分配到不同的处理器上,以确保系统资源充分利用。
静态调度和动态调度:静态调度是在编译或系统启动时确定进程的调度顺序,而动态调度是在运行时根据系统的状态和进程的特性进行调度决策。
不同的应用场景和系统要求可能需要不同的调度准则和算法。操作系统的调度器通常会根据实际情况选择合适的调度策略来满足性能需求。
进程间的制约关系
在多进程或多线程的计算机程序中,进程之间可以存在不同的制约关系,这些关系可以影响进程的执行顺序、资源共享和数据一致性。以下是一些常见的进程间制约关系:
竞争条件(Race Condition):竞争条件发生在多个进程试图同时访问共享资源时,而没有适当的同步机制来保护这些资源。这可能导致不可预测的结果和数据不一致。
互斥(Mutual Exclusion):互斥关系是指多个进程不能同时进入临界区(访问共享资源的关键部分)。通过互斥锁或信号量等同步机制,可以确保只有一个进程能够进入临界区,从而防止竞争条件。
有序执行(Ordering Constraint):有时,程序需要确保一些操作按照特定的顺序执行。例如,一个进程可能需要等待另一个进程完成某个操作后才能执行。
死锁(Deadlock):死锁是一种进程间制约关系,其中多个进程都在等待对方释放某个资源,从而导致所有进程都无法继续执行。解决死锁问题需要谨慎地设计同步机制和资源管理策略。
优先级(Priority):某些情况下,进程的执行顺序受其优先级的影响。高优先级的进程可能会在低优先级的进程之前执行。
依赖关系(Dependency):多个进程之间可能存在依赖关系,其中一个进程必须等待另一个进程完成某项任务才能继续执行。这通常涉及到任务的协同工作。
通信(Communication):进程之间可能需要进行通信以共享信息或传递数据。通信可以通过消息传递、共享内存等方式实现,并可能受到同步和顺序的影响。
条件等待(Conditional Wait):某些情况下,一个进程可能需要等待某个条件满足后才能继续执行。这通常涉及到条件变量和等待/通知机制。
饥饿(Starvation):饥饿是指一个或多个进程由于长时间无法获得所需的资源或执行时间而无法继续执行。这可能由于优先级不当或竞争资源导致。
进程同步的概念
进程同步用于协调多个并发执行的进程或线程之间的操作,以确保数据的一致性和正确性。在多任务和多进程的操作系统中,进程同步非常关键,因为多个进程可能同时访问共享资源,如内存、文件、设备等,如果没有适当的同步机制,就会导致竞态条件和数据不一致的问题。
进程同步的目标是避免竞态条件(Race Condition)、死锁(Deadlock)、饥饿(Starvation)和优先级反转(Priority Inversion)等问题,以确保多个进程能够协作并正确地访问共享资源。
信号量的概念
信号量(Semaphore)是一种用于多进程或多线程编程中的同步工具,它用于控制对共享资源的访问。信号量可以帮助解决多个进程或线程之间的竞争条件,确保对共享资源的访问是有序和同步的。
信号量的基本概念包括以下几个要点:
计数器:信号量是一个整数计数器,通常初始化为非负整数。这个计数器用来表示可用资源的数量或者某种条件的状态。
原子操作:对信号量的操作必须是原子操作,即不会被中断的操作。这确保了多个进程或线程同时尝试修改信号量时不会导致竞态条件。
等待和释放:信号量提供两种基本操作:等待(wait)和释放(post)。
等待操作:当一个进程或线程希望访问某个共享资源时,它首先执行等待操作。如果信号量的计数器大于零,那么等待操作会减少计数器的值,并允许进程或线程继续执行。如果计数器为零,等待操作可能会阻塞(挂起)进程或线程,直到计数器变为大于零为止。
释放操作:当一个进程或线程完成对共享资源的访问后,它执行释放操作,这会增加信号量的计数器。这样,其他等待资源的进程或线程可以继续执行。
控制资源访问:通过适当调整信号量的初始值和执行等待/释放操作的时机,可以实现对共享资源的访问控制。例如,可以用信号量来限制同时访问某个共享资源的进程或线程数量。
死锁的概念
它发生在多个进程或线程之间,每个都在等待某个事件或资源,但这些事件或资源互相依赖,导致所有进程或线程都无法继续执行的情况。简而言之,死锁是一种互相等待的僵局,阻塞了程序的进一步执行。
死锁触发的条件
互斥条件(Mutual Exclusion):至少有一个资源是互斥的,即只能被一个进程或线程占用,其他进程或线程必须等待释放。
持有与等待条件(Hold and Wait):进程或线程至少持有一个资源,并等待获取其他资源,这时候如果其他资源正好被其他进程或线程占用,就会发生死锁。
不可剥夺条件(No Preemption):资源不能被强制剥夺,只能由持有它的进程或线程主动释放。
环路等待条件(Circular Wait):存在一个等待链,每个进程或线程都在等待下一个进程或线程释放资源,形成一个环路等待情况。
解决死锁策略
资源分配策略:设计合理的资源分配策略,确保不会出现持有与等待和环路等待条件。例如,一种常见的策略是要求进程在开始执行之前一次性获取所有需要的资源,以防止持有与等待。
资源预分配:在系统初始化或运行时,为每个进程分配所需的资源,而不是等待进程请求资源。这种方法可以避免持有与等待条件。
资源优先级:给资源分配优先级,确保资源会被高优先级的进程或线程剥夺,并重新分配给其他进程。
超时机制:为等待资源的进程或线程设置超时,如果超时,则放弃等待或采取其他措施。
死锁检测与恢复:定期检测系统中是否存在死锁,一旦检测到死锁,采取措施中断其中一个进程或线程,以解除死锁。
避免共享资源:尽量减少共享资源的使用,或者使用无锁数据结构和算法,以减少发生死锁的机会。
设备管理
设备的概念与分类
“设备”泛指计算机系统中的各种外部设备,即主机以外的其他所有设备。外部设备品种繁多,功能各异,对它们管理的好坏,会直接影响到整个系统的效率。
按分配特性分:
独享设备:一次只能分配给一个进程使用,常见有打印机。
共享设备:可以由几个用户进程交替地对它进行信息的读或写操作,常见有磁盘。
虚拟设备:把独享设备“改造”成为可以共享的设备,但实际上这种共享设备是不存在的,常见有虚拟网卡、虚拟磁盘等。
按功能分:
字符设备:一种在操作系统中表示以字符为单位进行读写的设备。如键盘、鼠标、串口、打印机等,与块设备相比,字符设备不会缓冲数据,而是将数据直接传输给设备或者从设备获取数据。这使得字符设备更适合处理以字符为单位的输入和输出操作。
优缺点:不需要缓存、低延时、灵活性高。但效率低(可能需要频繁读取)、不适合大量数据传输、不支持随机访问。
块设备:一种在操作系统中表示以固定大小的块(通常为512字节)为单位进行读写的设备。如硬盘、SD卡、CD/DVD驱动器等,块设备的特点是能够以相对较高的速率进行数据传输,因为它们以较大的数据块为单位进行操作,而不是单个字符。这使得块设备适用于需要大量数据传输的场景,比如文件系统的读写操作。
优缺点:能大量传输数据、支持随机访问、支持缓存。复杂度高、不能实时响应。
如何完成一个IO请求
一些概念:
1.设备管理器:是操作系统中的一个系统工具或应用程序,用于管理计算机硬件设备。
2.设备驱动程序:是一种软件程序,它允许操作系统与硬件设备进行通信和控制。设备驱动程序充当操作系统与硬件之间的中介,使得操作系统可以通过标准接口来访问和控制各种硬件设备,而无需了解硬件的具体细节。简单地说,设备驱动程序将硬件设备抽象化,隐藏硬件细节,向操作系统提供接口。设备驱动程序的编写需要对硬件的特性和操作系统的接口有深入的了解。
3.设备控制器:与CPU进行交互,处理各种传入传出信号的硬件,内部有不同种类的寄存器来进行设备发送数据,接收数据、开启或者关闭等。每个设备控制器都会有一个应用程序与之对应,设备控制器通过应用程序的接口通过中断与操作系统进行通信。设备控制器是硬件,而设备驱动程序是软件。
步骤分析:
用户在程序中使用系统提供的输入/输出命令发出I/O请求——>输入/输出管理程序接受这个请求——>设备驱动程序来具体完成所要求的 I/O操作——>设备中断处理程序来处理这个请求
1.I/O请求来自用户作业进程。比如在某个进程的程序中使用系统提供的I/O命令形式为READ(input,buffer,n),它表示要求通过输入设备input,读入n个数据到由buffer指明的内存缓冲区中。
2.输入/输出管理程序一方面从用户程序那里接受I/O请求,另一方面把I/O请求交给设备驱动程序去具体完成,因此起到一个桥梁的作用。输入/输出管理程序首先接受用户对设备的操作请求,并把发出请求的进程由原来的运行状态改变为阻塞状态。如果当前设备空闲,那么管理程序验证了 I/O 请求的合法性(比如不能对输入设备发输出命令,不能对输出设备发输入命令等)后,就把这个设备分配给该用户进程使用,调用设备驱动程序,去完成具体的输入/输出任务。在整个 I/O 操作完成之后,管理程序控制由设备驱动程序返回到输入输出管理程序,把等待这个 I/O 完成的进程从阻塞队列上摘下来,并把它的状态由阻塞变为就绪,到就绪队列排队,再次参与对CPU的竞争。因此,设备的输入/输出管理程序由3块内容组成:接受用户的I/O请求,组织管理输入/输出的进行,以及输入/输出的善后处理。
3.在从输入/输出管理程序手中接过控制权后,设备驱动程序就读出设备状态,判定其完好可用后,就直接向设备发出 I/O 硬指令。在多道程序系统中,设备驱动程序一旦启动了一个I/O操作,就让出对CPU的控制权,以便在输入/输出设备忙于进行I/O操作时,CPU能脱身去做其他的事情,从而提高处理机的利用率。
4.在设备完成一次输入/输出操作之后,是通过中断来告知 CPU 的。当 CPU 接到来自 I/O设备的中断信号后,就去调用该设备的中断处理程序。
为什么进行设备管理
操作系统设备管理的目标之一,是提高外部设备的利用率。在多道程序设计环境下,外部设备的数量肯定少于用户进程数,竞争不可避免。因此在系统运作过程中,如何合理地分配外部设备,协调它们之间的关系,如何充分发挥外部设备之间、外部设备与CPU之间的并行工作能力,使系统中的各种设备尽可能地处于忙碌状态,显然是一个非常重要的问题。
操作系统设备管理的目标之二是为用户提供便利、统一的使用界面。“界面”是用户与设备进行交流的手段。计算机系统配备的外部设备类型多样,特性不一,操作各异。操作系统必须把各种外部设备的物理特性隐藏起来,把各种外部设备的操作方式隐藏起来,这样,用户使用时才会感到便利,才会感到统一。
如何进行设备管理

DCB(设备控制块)
设备控制块作用:
设备状态追踪:DCB 会记录设备的状态信息,比如设备是否处于空闲状态、是否正在执行某个操作等。
设备控制:DCB 可以包含控制设备的信息,比如控制设备开始读取或写入数据。
缓冲区管理:DCB 可能会包括一个或多个缓冲区,用于暂存数据。例如,当你向打印机发送数据时,通常会先将数据写入一个缓冲区,然后再由打印机逐步处理。
中断处理:DCB 可能会包含一些用于处理设备中断的信息,以便及时响应设备事件。
错误处理:DCB 可以记录设备操作过程中发生的错误信息,以便系统能够采取相应的措施,比如重新尝试、报告错误等。
设备标识:DCB 包括了用于唯一标识设备的信息,以便操作系统能够正确地识别和管理不同的设备。
设备管理步骤:

操作系统对字符设备进行管理步骤
文件管理
文件管理可从两方面看—文件和文件的管理,也就引申出什么是文件,文件组织方式(结构),操作系统如何对文件进行管理、调度。
前面介绍的存储管理和处理机管理,它们涉及的管理对象都是计算机系统中的硬件资源,即中央处理机(CPU)和内存储器(Memory)。计算机系统中还有一类资源,即软件资源,对它们的管理,要由操作系统中的“文件管理”来完成。
内存中的数据在断电时会丢失,如何将数据持久地存储,引入了文件管理的概念。由于系统的内存有限且不能长期保存,故将文件存放在外存中,到需要时再调入内存使用,需要操作系统高效地进行文件管理。
什么是文件
定义:所谓“文件”,是指具有完整逻辑意义的一组相关信息的集合,它保存在磁盘上,可进行读取与修改等操作。
文件的类型有哪些
文件按照不同的分类标准可进行不同的分类,下面列举几个常见分类标准:
按文件的性质和用途:
(1)系统文件:操作系统及其他系统程序(如语言的编译程序)构成系统文件的范畴。这些文件通常是可执行的目标代码及所访问的数据,用户对它们只能执行,没有读和写的权利。
(2)用户文件:用户文件是用户在软件开发过程中产生的各种文件,如源程序、目标程序代码和计算结果等。这些文件只能由文件主和被授权者使用。
(3)库文件:常用的标准子程序(如求三角函数sin、cos的子程序)、实用子程序(如对数据进行排序的子程序)等组成库文件。库文件中的文件,用户在开发过程中可以直接调用,不过用户对这些文件只能读取或执行,不能修改。
按文件的保护性质:
(1)只读文件:只允许查看的文件为只读文件。对于只读文件,使用者不能对它们进行修改,也不能运行。
(2)读写文件:这是一种允许查看和修改的文件,但不能运行。
(3)可执行文件:这是一种可以在计算机上运行的文件,以期完成特定的功能。使用者不能对它进行查看和修改。
(4)不保护文件:这是一种不设防的文件,可以任意对它进行使用、查看和修改。
文件如何使用
1.文件的共享
文件有两种共享方式:1.任一时刻只能有一个用户对文件进行操作 2.多个用户能同时对一个文件进行读操作
2.文件的保护
文件保护是指要防止未经授权的用户使用文件,也要防止文件主自己错误地使用文件而给文件带来破坏。通常,可以采用存取控制矩阵、存取控制表、权限表和口令等方法,来达到保护文件不受侵犯的目的。
3.文件的备份
为防止数据的意外丢失,需要对文件进行备份。
4.文件的操作
对于文件的操作主要有创建、删除、读取、写入、关闭。
文件的存储方式
存取方式可以作为文件的分类依据。用户在访问文件时,常采用顺序存取和随机存取(也称直接存取)两种方式。
文件管理是什么
那么,用户在以“按名存取”的方式,对自己的文件进行访问时,系统如何知道这个文件存放在哪里,如何得到有关这个文件的各种信息,以便完成用户的读/写请求,这些涉及到对具体文件的管理问题。系统是通过文件的目录来管理文件的。
如何进行文件管理
一些概念:
1.文件控制块(FCB)
操作系统都是通过各种“控制块”对具体的管理对象实施管理的,比如进程控制块(PCB)、作业控制块(JCB)和设备控制块(DCB)等。对于文件,操作系统仍然采用这种老办法来管理。即为每一个文件开辟一个存储区,在它的里面记录着该文件的有关信息,我们把该存储区称为“文件控制块(FCB)”。于是,找到一个文件的 FCB,也就得到了这个文件的有关信息,就能够对它进行所需要的操作了。
FCB是计算机操作系统中用于管理文件的一种数据结构。它包含了关于文件的各种信息,以便于操作系统进行文件的读取、写入和管理。包含具体信息如下:
文件名和扩展名:标识文件的唯一名称。
文件类型:指示文件的类型(例如文本文件、二进制文件等)。
文件属性:包括文件是否只读、隐藏等属性。
文件大小:指示文件所占用的存储空间大小。
文件位置:指示文件在存储介质上的物理位置。
访问权限:包括读取、写入、执行等权限。
创建日期和时间:记录文件创建的具体日期和时间。
修改日期和时间:记录文件最后一次修改的日期和时间。
访问日期和时间:记录文件最后一次被访问的日期和时间。
文件指针:用于指示当前读写位置,以便于在文件中进行定位和操作。
2.文件目录(File Catalog)
把文件的文件控制块汇集在一起,就形成了系统的文件目录,每个文件控制块就是一个目录项,其中包含了该文件的文件名、文件属性,以及文件的数据在磁盘上的地址等信息。
一级目录结构:在系统只创建一张目录表,所有的文件都存放在这个目录表下。
优点:方便、直观。
弊端:当文件过多时,此结构不利于文件的创建、查找,由于文件不能重名,用户之间的操作容易产生冲突。
二级目录结构:在主目录下有多个用户目录,每个用户目录拥有自己的子文件。
优点:用户之间可以取重名文件,缩短了按名查找文件的时间。
弊端:但是,如果一个用户拥有很多的文件,那么在他的目录中进行查找,所花费的时间仍然会很长。另外,在二级目录结构中,用户无法对自己的文件进行再分类安排。所以,这种目录结构还是难以使用户感到满意。
树型目录结构:主目录下的每个用户目录可以有多个子目录,每个子目录又可以拥有多个子目录。
优点:大大缩短了查找文件的时间,结构清晰化。
弊端:处理大量文件时会造成目录的变化,此时需要调整树的结构。可能会导致深层的树形结构,是文件路径变长。当需要在已有的树型结构中添加新的分类或主题时,可能需要对整个结构进行调整,这可能会导致混乱。

树型目录
