操作系统简答题
操作系统简答题
死锁
死锁定义: 死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局,若没有外力作用,它们将无法再向前推进。死锁发生时,所有参与的进程都会处于一种等待状态,无法继续执行。
死锁的产生原因:
- 竞争资源:多个进程同时需要相同的资源,并且资源数量不足,导致进程间的资源竞争。
- 进程推进顺序非法:进程在执行时没有合理的顺序,导致相互等待某些资源,从而进入死锁状态。
死锁的必要条件:
- 互斥条件:至少有一个资源是不能共享的,资源只能被一个进程占用,其它进程必须等待。
- 请求和保持条件(占有):进程已经保持了至少一个资源,但又提出了对其它资源的请求,此时该进程不会释放当前资源。
- 不剥夺条件:已分配给进程的资源,不能被强行剥夺,进程必须主动释放资源。
- 环路等待条件:形成一个进程的等待环路,即进程A等待进程B占有的资源,进程B等待进程C占有的资源,直到进程X等待进程A占有的资源,形成闭环。
虚拟存储器与局部性原理
虚拟存储器: 虚拟存储器是一种存储管理技术,它通过请求调入和置换功能,允许程序看到比实际物理内存更大的逻辑内存空间。虚拟存储器的运行速度接近内存,而每个存储单元的成本接近外存,能够通过操作系统管理在物理内存和外存之间的交换,从而扩展内存容量。虚拟存储器使得程序能够不受物理内存大小限制而运行。
局部性原理: 局部性原理是指程序在执行过程中会表现出特定的访问模式。具体来说,程序的执行通常集中在某些特定的时间或空间区域。
时间局限性:如果程序访问了某个数据或指令,不久后该数据或指令可能会再次被访问。即程序在短时间内重复访问某些资源。
空间局限性:程序访问某个内存位置后,接下来可能会访问该位置附近的存储单元。例如,程序的顺序执行通常表现出空间局限性,即相邻的内存地址会在相近的时间内被访问。
这两个局部性特征是虚拟存储器设计中的基础,操作系统利用这些规律来优化内存的管理,例如通过分页、置换算法等技术提高程序的执行效率。
Spooling的工作原理(以打印机为例)
Spooling定义: Spooling(Simultaneous Peripheral Operations On-Line)是指一种将设备的输入输出操作从程序执行中分离出来的技术,通常用于缓解设备访问的瓶颈问题。通过Spooling,设备(如打印机)的使用可以被模拟成虚拟设备,允许多个进程排队请求设备而不发生冲突。
Spooling的工作过程:
- 用户请求打印:当用户进程请求打印输出时,Spooling系统并不会直接将打印机分配给用户进程,而是将打印任务存放在磁盘(通常称为“输出井”)中。系统为该任务分配一个空闲的磁盘空间区域,并将需要打印的数据写入这个区域。
- 打印请求管理:输出进程还会为用户的打印任务申请一张空白的打印请求表,并记录用户的打印要求。这个请求表被加入到请求打印的队列中,等待后续处理。
- 接受新的打印请求:如果在当前任务处理中有其他进程发起打印请求,Spooling系统仍然可以接受并同样按照上述步骤将打印任务存放到磁盘,并加入请求队列。
- 处理打印任务:
- 当打印机空闲时,输出进程会从请求打印队列的队首取出一个请求表,获取其中的打印数据,并将这些数据从磁盘输出井传送到内存缓冲区。
- 然后,数据被发送到打印机进行打印。
- 任务完成后继续处理:打印完成后,输出进程会检查请求打印队列,若队列中有未处理的打印请求,则继续取出下一个请求进行处理。
- 队列空闲时阻塞:当请求队列为空时,输出进程会阻塞,直到有新的打印请求时才被唤醒。
通过Spooling将打印机模拟为虚拟打印机: Spooling技术使得打印机可以像一个虚拟打印机一样工作。即使有多个进程同时请求打印输出,Spooling系统通过管理任务队列和缓冲区,允许它们共享打印机资源,而不会发生冲突。用户进程提交的打印任务被“排队”处理,就像操作系统提供一个虚拟的、按顺序处理的打印机一样。这样,多个进程可以并发地发起打印请求,而打印机在物理上一次只能执行一个打印任务。
文件系统必须完成的工作
文件系统是操作系统的重要组成部分,负责管理计算机上的数据存储和访问。文件系统的工作主要包括以下几项:
- 文件存取管理:
- 文件系统提供访问文件的接口,确保用户和程序能够顺利读写文件。它管理文件在磁盘中的存储位置和读取/写入的操作。
- 目录管理:
- 文件系统使用目录结构来组织文件。目录管理帮助用户和程序高效查找文件,确保文件能够按照一定的层次结构存储,避免文件之间的混乱。
- 文件组织:
- 文件的物理存储组织是文件系统的一项重要功能。文件可以按一定的格式(如顺序文件、索引文件等)存储在磁盘上。文件系统需要保证文件内容在磁盘上的存储方式对用户透明。
- 文件存储空间的管理:
- 文件系统负责管理磁盘的存储空间,包括文件的分配、回收等。它确保磁盘空间的合理利用,并通过分配合适的磁盘块来存储文件数据。
- 文件操作:
- 文件系统提供一系列的文件操作,如创建、删除、读取、写入、重命名等。它为程序和用户提供对文件的访问和操作能力。
- 文件的共享:
- 文件系统支持文件的共享操作,使得多个用户或进程可以同时访问同一文件。共享文件时,文件系统会管理并发访问,避免数据冲突和不一致性。
- 文件的保护与保密:
- 文件系统提供安全性机制,如文件权限设置(读、写、执行权限)和访问控制,确保文件的保护与保密。只有具备相应权限的用户或进程才能访问文件数据,防止非法访问。
通过这些管理和控制,文件系统确保计算机上的数据能够高效、安全地存储和访问,保证系统的稳定运行。
文件目录和目录文件的作用
文件目录: 文件目录是记录与单个文件相关的管理信息的结构。它包含了文件的以下信息:
- 文件名:标识文件的名称。
- 文件长度:文件占用的存储空间大小。
- 文件存放的物理地址:文件在外存(如硬盘)上的具体存储位置。
- 文件属性:如文件的访问权限、创建时间等。
- 文件建立时间和日期:记录文件的创建时间。
文件目录通常也称为文件控制块(File Control Block, FCB),它用于对单个文件进行管理和控制。每个文件在文件系统中都会有一个文件目录记录其基本信息。
目录文件: 目录文件是由文件系统组织的一种文件,它包含了某一卷(磁盘分区)上所有文件的文件目录。目录文件记录了所有文件的管理信息,并用于整个文件系统的管理。目录文件实际上是一个特殊的文件,它将所有的文件目录记录集合起来,为文件系统提供文件组织和索引功能。
文件目录与目录文件的区别:
- 文件目录:管理单个文件的相关信息,控制对单个文件的访问。
- 目录文件:包含一个卷(磁盘分区)上所有文件目录的记录,是整个文件系统的管理工具。
目前广泛采用的目录结构形式及其优点
目录结构形式: 目前广泛采用的目录结构形式是树形目录结构。树形目录结构是一种层次化的结构,文件系统中的文件和目录被组织成一个树状结构,根目录位于树的顶部,每个文件和目录都有父目录和子目录。
树形目录结构的优点:
- 检索效率高:树形结构通过层级关系,使得文件查找更加高效。通过逐层查找,可以快速定位文件。
- 允许文件重名:由于目录结构是层级化的,同名文件可以出现在不同的目录中,这样就避免了文件名冲突。
- 确切反映信息的层次结构:树形结构能够自然地反映出文件之间的层次关系,例如项目文件夹、子文件夹和文件的组织形式。
- 实现文件共享和保护:通过层次结构,可以控制对不同目录和文件的访问权限,易于进行文件共享和保护。不同目录可以设置不同的访问控制权限,确保安全性。
设备独立性
设备独立性定义: 设备独立性是指用户程序在运行时不需要关心具体的物理设备。换句话说,用户程序只关心设备的逻辑表示,而不关心设备的物理实现。设备独立性使得用户程序能够在不同的硬件环境下运行,而无需进行硬件相关的修改。
如何实现设备独立性:
- 一致的设备接口:所有设备通过统一的接口与操作系统交互。无论是硬盘、打印机还是显示器,操作系统都使用相同的设备访问接口来进行操作。
- 设备管理的统一方式:操作系统通过设备驱动程序来实现对各种设备的管理,不同类型的设备(例如磁盘、网络卡、显示器等)都通过相应的驱动程序来进行操作。系统为各个设备提供统一的访问机制,使得用户程序在不同设备上执行时不会感知到设备的差异。
- 逻辑设备名与物理设备名的映射:
- 操作系统为每个用户进程维护一张映射表,将逻辑设备名(如“打印机”、“磁盘”等)与物理设备名(如具体的打印机型号、硬盘设备编号等)对应起来。
- 用户程序使用的是逻辑设备名,而操作系统负责根据当前的实际设备状态(例如设备的可用性)将逻辑设备名映射到具体的物理设备,从而实现设备的抽象和独立性。
通过这些措施,操作系统可以确保不同的硬件设备对用户程序的透明性,使得程序能够独立于具体的物理设备运行,提高了系统的灵活性和可扩展性。
DMA方式与中断方式的区别
DMA(直接内存存取)方式: DMA方式是一种数据传输方式,其中外设可以直接与内存进行数据交换,而无需经过CPU的干预。DMA通过DMA控制器控制数据的传输,CPU的任务仅限于初始化DMA控制器并在传输完成后处理中断。DMA的主要特点是数据传输是批量完成的,CPU不需要介入每一个数据的传输。
DMA方式的工作过程:
- CPU启动DMA操作,并初始化DMA控制器。
- DMA控制器接管总线控制权,外设与内存之间进行数据交换。
- 数据传输完成后,DMA控制器向CPU发出中断请求。
- CPU响应中断,回收总线控制权,并处理与DMA操作相关的任务。
中断方式: 在中断方式下,外设每传输一个数据单元(如一个字节或一个字),就会向CPU发送一次中断请求。每个中断都需要CPU介入处理,CPU会中断当前任务,处理完该数据的传输后,再返回原来的工作。每个数据传输的处理都由CPU控制。
DMA与中断方式的主要区别:
- 数据传输方式:
- 中断方式:每传输一个数据单元,外设都会中断CPU,每次中断后CPU进行处理。
- DMA方式:DMA控制器一次性处理整个数据批量的传输,CPU只在数据传输完毕后介入。
- CPU参与的程度:
- 中断方式:每个数据单元的传输都需要CPU的参与,CPU控制每一步的数据传输过程。
- DMA方式:CPU只在开始和结束时参与,实际的数据传输由DMA控制器完成,减少了CPU的负担。
- 传输效率:
- 中断方式:每次中断和响应都占用CPU时间,因此效率较低。
- DMA方式:DMA控制器直接进行数据传输,减少了CPU干预,提高了效率。
磁盘块大小与FAT占用存储空间的计算
问题:假定磁盘块的大小为1K,对于540M的硬盘,其文件分配表FAT需要占用多少存储空间?
解题步骤:
- 计算磁盘的总块数:
- 硬盘大小为540M,磁盘块大小为1K。
- 硬盘共有磁盘块数量 = 硬盘大小 / 块大小 = 540M / 1K = 540K(个磁盘块)。
- 计算FAT表项所需的位数:
- 每个磁盘块需要一个表项来表示其状态或位置。
- 由于540K块的编号最大值为540K-1,需要用20位来表示块号(2^20 = 1048576,大于540K)。
- 每个FAT表项需要占用20位,20位即为2.5字节(每字节8位,因此2.5字节可以表示20位)。
- 计算FAT表所占存储空间:
- 每个表项占2.5字节,共有540K个表项。
- FAT所占存储空间 = 2.5字节 × 540K = 1350KB。
结果:FAT文件分配表需要占用1350KB的存储空间。
总结
- DMA方式是通过DMA控制器直接进行内存和外设之间的批量数据传输,减少CPU的负担。
- 中断方式则每传输一个数据单元都需要CPU介入处理,相对效率较低。
- FAT占用空间的计算示例中,540M硬盘的文件分配表FAT需要1350KB的存储空间。
进程与程序的区别
- 静态与动态:
- 程序是静态的,它是指存储在磁盘中的一组有序的指令集合。
- 进程是动态的,它是程序在计算机中的一次执行过程。进程是程序的一次实例化,具有生命周期。
- 存在形式:
- 程序是永久存在的,保存在磁盘或其他存储介质上。
- 进程是暂时的,它在执行时存在,当执行完成后,进程消失。
- 组成部分:
- 程序只是代码的集合,主要包含执行的指令。
- 进程的组成包括程序代码、数据以及进程控制块(Process Control Block, PCB),PCB记录了进程的状态信息,如进程状态、程序计数器、CPU寄存器的值、内存分配信息等。
- 生命周期:
- 程序在硬盘上存储,可以长久保存,不会改变。
- 进程是一个有生命周期的实体,从创建、运行到终止,进程状态不断变化。
- 执行关系:
- 程序是被执行的对象,不直接参与计算机资源的使用。
- 进程是程序执行的载体,是资源分配的基本单位。每个进程可以拥有独立的地址空间、资源和执行状态。
- 一对多关系:
- 一个程序可以对应多个进程。例如,同一个程序可以被多个用户执行,每个执行实例对应一个进程。
- 一个进程可以涉及到多个程序的调用。进程可以调用其他程序的代码,或通过多线程与其他程序交互。
PV原语与加锁法实现进程间互斥的区别
PV原语(信号量机制)*与*加锁法是两种常用的进程间互斥实现方法,下面是它们的区别:
1. 定义与原理:
- PV原语:
- PV原语是通过信号量(Semaphore)来实现进程间的互斥与同步。信号量是一个整型值,可以是整数,表示某个资源的可用数量。
- P操作(等待操作,Proberen)用于申请资源,如果信号量的值大于0,资源被分配,信号量减1;如果信号量为0,进程进入阻塞等待状态。
- V操作(释放操作,Verhogen)用于释放资源,信号量的值加1,若有等待的进程,则唤醒一个。
- 加锁法:
- 加锁法通过互斥锁(Mutex)来保护共享资源,确保一次只有一个进程或线程能访问某资源。
- 加锁法通过加锁(lock)和解锁(unlock)来控制对临界区资源的访问。进程在访问共享资源之前需要获得锁,访问结束后释放锁。
2. 控制方式:
- PV原语:
- PV原语由操作系统提供,基于信号量进行控制。信号量的操作通常是原子性的,且在进程间的同步和互斥上非常灵活。
- 信号量机制不仅可以用于互斥,还可以用于进程间的同步。
- 加锁法:
- 加锁法通常由操作系统或编程语言的库提供,用于在进程或线程中显式地控制对共享资源的访问。
- 主要用于实现互斥,确保同一时间只有一个进程或线程能访问临界区。
3. 易用性:
- PV原语:
- 使用信号量机制时,程序员需要明确地设计和管理信号量,并考虑信号量的初始化和维护。
- 它比加锁法更灵活,可以用于更复杂的同步和互斥问题。
- 加锁法:
- 加锁法相对简单,程序员只需在访问共享资源时显式地加锁,并在使用完成后释放锁。
- 在实现进程间的互斥时,加锁法的使用比信号量简单直观,但它不如信号量灵活,尤其在复杂的同步问题上。
4. 复杂性与开销:
- PV原语:
- PV原语的实现相对复杂,特别是在多进程的环境下,需要考虑信号量的正确使用,避免死锁、饥饿等问题。
- 信号量的管理需要操作系统提供内核支持,因此开销较大。
- 加锁法:
- 加锁法通常由操作系统或编程语言提供支持,相对较为高效,开销较小。
- 但是,如果锁的使用不当(如死锁、锁粒度不合适),可能会导致性能问题。
5. 死锁与饥饿:
- PV原语:
- 使用不当可能导致死锁(两个进程相互等待对方释放资源)或饥饿(进程长时间无法获得资源),需要特别注意信号量的管理。
- 加锁法:
- 如果锁的粒度过大或者锁的顺序不合理,也容易导致死锁。加锁法同样需要注意避免死锁和饥饿。
总结:
特性 | PV原语(信号量) | 加锁法(Mutex) |
---|---|---|
定义 | 通过信号量实现互斥与同步 | 通过互斥锁实现互斥 |
控制方式 | 基于P/V操作的信号量控制 | 基于lock/unlock的加锁控制 |
适用场景 | 更适用于复杂的同步和互斥问题 | 适用于简单的互斥问题 |
使用难度 | 需要处理信号量的管理与同步 | 使用简单,易于理解 |
性能开销 | 相对较高,涉及操作系统内核支持 | 相对较低,轻量级 |
潜在问题 | 死锁、饥饿、信号量管理复杂 | 死锁、竞争条件 |
两者各有优势,具体使用时根据应用场景选择合适的方式。