OS
计算机操作系统
第一部分:操作系统概述
1.1 什么是操作系统
是管理计算机硬件与软件资源的程序,是计算机系统中最基本的系统软件。操作系统需要处理管理与配置内存,决定系统资源供需的优先级,控制输入设备与输出设备,操作网络和管理文件系统等基本事务。
注意:执行一个程序前需要将该程序放到内存中,才能被CPU处理。
层次架构
- 硬件之上
- 应用程序之下
- Linux,windows,Android界面属于外壳(shell)而不是内核(kernel),内核在外壳之下
kernel内部组件
- CPU调度器
- 物理内存管理
- 虚拟内存管理
- 文件系统管理
- 中断处理与设备驱动
1.2操作系统的类型和结构
命令接口
联机命令接口(Online Command Interface):这种接口需要用户在命令执行过程中实时交互。例如,当一个程序运行时,它可能需要用户输入数据或选择选项。这种接口通常用于交互式应用程序,如文本编辑器或电子邮件客户端。在这种接口中,用户和计算机之间的交互是实时的,即用户的每个操作都会立即得到计算机的反馈。
脱机命令接口(Offline Command Interface):这种接口允许用户在没有实时交互的情况下执行命令。用户可以预先设置一系列的命令,然后让计算机在适当的时间执行。这种接口通常用于批处理任务,如数据分析或报告生成。在这种接口中,用户和计算机之间的交互不是实时的,用户可以在任何时间设置命令,然后离开,等待计算机完成任务。
操作系统的类型
- 批处理操作系统:这种类型的操作系统不与用户交互。所有需要执行的命令都被组织在批处理中,然后作为一个作业提交给系统。
- 多任务/多进程操作系统:也叫分时操作系统,这种类型的操作系统允许多个任务或进程同时运行。如Unix操作系统
- 多用户操作系统:这种类型的操作系统允许多个用户同时使用一个系统。
- 实时操作系统:这种类型的操作系统被设计用于实时应用程序,这些应用程序需要对事件的响应非常迅速。
- 分布式操作系统:这种类型的操作系统将多台机器的资源整合在一起,对用户来说就像一台机器一样。
- 嵌入式操作系统:这种类型的操作系统主要用于嵌入式系统,如家用电器、汽车等。
操作系统的基本结构
- 单体结构:所有操作系统功能都被组织在一起并运行在同一地址空间。
- 分层结构:操作系统被划分为不同的层次,每一层都建立在其下一层的基础上。
- 微内核结构:只有最基本的系统功能(如进程调度、内存管理等)运行在内核空间,其他服务则运行在用户空间。
- 客户-服务器模型:这种结构将操作系统服务视为服务器,应用程序视为客户。客户通过向服务器发送请求来使用服务。
- 虚拟机:这是一种特殊的操作系统结构,它通过虚拟化技术模拟出一台或多台“虚拟”计算机,每台虚拟计算机都可以运行一个完整的操作系统。
1.3操作系统的四大特征
并发
两个或多个事件在同一事件间隔内发生,这件事是在宏观上同时发生的,但微观上交替发生。
与并发不同的并行是指两个或多个事件在同一时刻同时发生。
操作系统的并发性
操作系统就是伴随着“多道程序技术”而出现的。因此操作系统和程序并发是一起诞生的。
注意:
- 单核CPU同一时刻只能执行一个程序,各个程序只能并发执行。
- 多核CPU同一时刻可以同时执行多个程序,多个程序可以并行执行。
共享
共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。
互斥共享方式
在任意时刻,只允许一个进程访问资源,当一个进程正在访问某个资源时,其他需要访问资源的进程必须要等待。
“同时”共享方式
允许同一时刻,多个进程同时访问同一资源。能够被多个进程同时使用。
并发和共享的关系。
并发和共享的关系是相辅相成的,二者在操作系统中是密不可分的。并发运行的多个程序共享同一套系统资源,比如CPU时间、内存空间、文件系统和输入输出设备等。因此,共享是并发存在的基础。反过来,如果没有并发,也就没有资源共享的必要性。
虚拟
- 是用多道程序设计技术。
- 操作系统将物理资源抽象为虚拟资源,如虚拟内存,虚拟处理器和虚拟设备等。虚拟性使得多个程序可以独立运行,它们实际上是共享同一组物理资源得虚拟实例。虚拟性提供了更好的资源管理和隔离性能。提高了系统的可靠性和安全性。
异步
- 任务的执行不需要等待前一个任务的完成才能执行下一个任务的能力。在异步操作中,任务可以并行执行或按照优先级进行调度,不依赖其他任务的完成状态。
- 程序的执行不是一贯到底,而是走停交接,推进的速度是不可预知的。
- 只要运行环境相同,OS需要保证程序运行的结果也要相同。
操作系统的启动
启动
- DISK:存放OS,一开始是放在硬盘上,并没有在cpu上
- BIOS:基本的IO处理系统,检测外设
- Bootloader:加载OS,把硬盘中的OS放在CPU上
基本过程
- 加电自检(Power-On Self-Test,POST):计算机开机后,会进行一系列的硬件自检,包括检查内存、显示适配器、硬盘驱动器等。如果自检过程中发现硬件故障,计算机可能会发出警报或显示错误信息。
- BIOS/UEFI 初始化:自检完成后,计算机会加载并执行基本输入/输出系统(Basic Input/Output System,BIOS)或统一固件接口(Unified Extensible Firmware Interface,UEFI)。BIOS/UEFI负责初始化硬件设备,包括检测和配置内存、硬盘驱动器、键盘、鼠标等。
- 引导加载程序(Boot Loader):BIOS/UEFI会在启动设备(通常是硬盘驱动器)上查找引导加载程序。引导加载程序是一个小型的程序,负责加载操作系统的核心组件。
- 操作系统内核加载:引导加载程序会加载操作系统内核到计算机的内存中。内核是操作系统的核心部分,负责管理计算机的资源和提供各种系统服务。
- 初始化和配置:操作系统内核加载后,会进行初始化和配置过程。这包括初始化设备驱动程序、建立系统数据结构、加载配置文件等。
- 用户登录:一旦操作系统初始化完成,计算机会显示登录界面,用户可以输入用户名和密码进行登录。
- 桌面环境加载:用户登录后,操作系统会加载桌面环境,例如Windows的资源管理器或Linux的图形用户界面(Graphical User Interface,GUI)。桌面环境提供了用户与计算机交互的图形界面。
中断,异常和系统调用
中断(来源于外设/异步处理)
- 来自不同的硬件设备的计时器和网络的中断。
- 操作系统回中断当前正在执行的程序,保存当前状态,并跳转道中断处理程序处理该事件。
- 允许操作系统对外部事件做出及时响应
- 持续,对用户程序是透明的.
及时响应
- 合理的时间内对外部事件做出快速的反应和处理.
- 意味着操作系统能够迅速中断当前程序,并跳转道相应的中断处理程序来处理事件.
系统调用(来源于应用程序/异步或同步处理)
- 应用程序主动向操作系统发出服务请求
- 等待和持续
异常(来源于不良的应用程序/同步处理)
- 执行程序中出现错误或异常的情况,例如除零错误,无效指令或内存访问错误.
- 杀死或重新执行意想不到的应用程序指令
进程
2.1 进程的概念
- 进程是操作系统就进行资源分配和调度的基本单位,是由程序,数据以及进程控制块三部分组成.
- 每个进程都有自己独立的空间地址,无法访问其他进程的内存,它们之间的信息交换需要通过操作系统提供的机制进行
2.2 进程的生命周期
进程的生命周期由以下五个状态组成: - 新建:进程刚被创建,但还未被调度到运行的状态。
- 就绪:进程已经准备好运行,正在等待系统分配资源。
- 运行:进程正在CPU上执行。
- 等待(阻塞):进程因为某些事件(比如I/O操作)而暂停执行。
- 结束:进程已经完成执行。
进程状态
除了上面的五大基本状态外还会存在一些特殊的状态:
僵尸(Zombie)状态:当一个进程完成执行(终止)后,它需要将退出状态返回给父进程。如果父进程还没有请求这个状态信息,那么终止的进程就会进入僵尸状态。僵尸进程不再执行任何操作,但仍然在进程表中占据一个位置,直到父进程获取了其状态信息。例如,如果你在Linux终端中运行一个程序并且这个程序已经结束,但是你没有关闭终端,那么这个程序就是一个僵尸进程。
孤儿(Orphan)状态:如果一个进程的父进程在它之前结束,那么这个进程就会变成孤儿进程。孤儿进程将被init进程(在Unix和Linux系统中,init是一个始终运行的进程,它是所有其他进程的祖先)接管,init会周期性地收集这些孤儿进程的状态信息,防止它们变成僵尸进程。例如,如果你在Linux终端中运行一个后台程序(使用&运行),然后关闭终端,那么这个程序就会成为孤儿进程。
阻塞(Blocked)状态:进程因为等待某个事件(如I/O操作)完成而无法继续运行,即使CPU是空闲的,这个进程也不会被调度到CPU上运行,直到所等待的事件完成。例如,如果一个进程正在读取一个非常大的文件,而这个文件的读取需要一些时间,那么在这个时间内,进程就会处于阻塞状态。
后台(Background)状态:后台进程是在后台运行的进程,它们在命令行界面中被启动并放在后台运行,不会影响用户在前台的操作。例如,如果你在Linux终端中使用&运行一个程序,那么这个程序就会在后台运行。
睡眠(Sleeping)状态:进程正在等待某个条件变为真,例如等待时间、等待某个信号、等待资源可用等。在睡眠状态的进程不会占用CPU资源。例如,如果一个进程正在等待用户的输入,那么在用户输入之前,这个进程就会处于睡眠状态。
停止(Stopped)状态:进程由于收到信号而被停止,例如用户可以发送SIGSTOP信号来停止一个进程。停止的进程可以通过SIGCONT信号来恢复执行。例如,如果你在Linux终端中运行一个程序,并且使用Ctrl+Z暂停它,那么这个程序就会进入停止状态。
2.3 进程调度
进程调度是操作系统的重要功能之一,它决定了哪个进程可以获得CPU的使用权,以及可以使用多长时间。这通常由操作系统的调度策略决定,比如先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转(RR)等。
先来先服务(FCFS)
进程按照它们到达的顺序进行调度。例如,打印作业通常使用FCFS调度,因为我们希望打印任务按照提交的顺序完成。
短作业优先(SJF)
选择最短的作业(进程)首先执行。例如,在批处理系统中,我们可能希望最短的作业先完成,以便快速释放系统资源。
优先级调度
每个进程都有一个优先级,优先级高的进程先执行。例如,在实时系统中,我们可能需要某些关键任务(如飞机的飞行控制)具有高于其他任务的优先级。
时间片轮转(RR)
进程被赋予一个固定的时间片(或称为时间量)。当一个进程的时间片用完时,操作系统就会剥夺该进程的CPU,将其转移到就绪队列的末尾,然后将CPU分配给下一个进程。这种调度算法常用于交互式系统,例如,多用户系统中,为了让每个用户都有公平的CPU使用时间,通常使用时间片轮转调度算法。
2.4 多进程和多线程
多进程和多线程是操作系统中两种重要的并发执行技术。它们都可以提高系统的性能和响应时间,但是它们的实现方式和使用场景有所不同。
- 多进程:
进程是操作系统进行资源分配和调度的基本单位,是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。多进程意味着有多个进程同时运行。每个进程都有自己的独立地址空间,进程之间的通信需要使用进程间通信(IPC)机制,如管道、消息队列、共享内存等。
优点:每个进程有自己的独立地址空间,一个进程崩溃不会影响其他进程,安全性和稳定性较高。
缺点:进程的创建和销毁以及进程切换的开销较大,进程间通信复杂。
- 多线程:
线程是进程中的执行单元,是CPU调度和分派的基本单位。一个进程可以包含多个线程,它们共享进程的地址空间和资源,线程之间的通信比进程间通信更简单。
优点:线程的创建和销毁以及线程切换的开销小于进程,线程间通信简单。
缺点:因为线程共享进程的地址空间和资源,一个线程崩溃可能会影响整个进程,安全性和稳定性较低。
在实际应用中,多进程通常用于CPU密集型任务,如科学计算、图像处理等,而多线程通常用于IO密集型任务,如网络服务、图形界面等。
进程间通信(IPC)机制
管道(Pipe):管道是最早的IPC机制之一,它允许一个进程向另一个进程传递数据。管道通常遵循“先进先出”(FIFO)原则,数据从管道的一端进入,从另一端出来。
消息队列(Message Queue):消息队列允许一个或多个进程向队列中添加消息,其他进程可以从队列中读取或删除消息。消息队列是一种比管道更灵活的IPC机制,因为它允许多个进程同时读写消息。
- 信号(Signal):信号是一种用于通知进程某个事件已经发生的IPC机制。当一个进程收到一个信号时,它可以选择忽略这个信号、捕获并处理这个信号,或者按照默认的方式处理这个信号。
- 共享内存(Shared Memory):共享内存允许多个进程访问同一块内存区域。这是一种非常高效的IPC机制,因为进程可以直接读写这块内存,而无需通过操作系统进行数据传输。但是,使用共享内存需要解决数据访问的同步问题,以防止多个进程同时修改同一块内存。
- 套接字(Socket):套接字是一种网络通信的IPC机制,它允许运行在不同机器上的进程进行通信。套接字可以支持TCP/IP、UDP等多种网络协议。
- 信号量(Semaphore):信号量主要用于解决多进程同步问题,它是一个整数值,可以用于控制对共享资源的访问。
2.5 线程的概念和实现
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。每个线程都有自己的一组CPU寄存器(如程序计数器,堆栈指针,累加器等),以及自己的堆栈空间,用于保存运行中的临时数据。但线程并不拥有系统资源,它与其它线程共享所属进程的资源。线程的实现主要有两种方式:用户级线程和内核级线程。
用户级线程和内核级线程
用户级线程和内核级线程是两种不同的线程实现方式,它们的主要区别在于管理线程的实体不同,以及对操作系统可见性的不同。
用户级线程(User-Level Threads):
用户级线程是完全在用户级别运行的线程,也就是说线程的创建、调度和管理都是由用户程序自行完成的,操作系统对其一无所知。这种方式的优点是线程切换开销小,不需要进行系统调用,同时可以定制化线程调度算法。但是,缺点是如果一个线程开始进行阻塞操作,那么整个进程(包括其中的所有线程)都会被阻塞,因为操作系统只能看到进程级别的阻塞。另外,由于操作系统对用户级线程不可见,因此不能利用多处理器并行处理。
内核级线程(Kernel-Level Threads):
内核级线程是由操作系统内核进行管理的线程。线程的创建、调度和管理都是由操作系统内核完成。这种方式的优点是,由于线程对操作系统可见,因此一个线程进行阻塞操作时,不会影响到同一进程中的其他线程,同时可以利用多处理器进行并行处理。但是,缺点是线程切换需要进行系统调用,开销比用户级线程大。
并发与同步
3.1 并发性的概念
并发性是指两个或多个事件在同一时间间隔内发生。在计算机科学中,这通常指的是能够让多个任务在一段时间内同时运行的能力。并发并不意味着这些事件必须在同一时刻发生,实际上,在多核处理器中,这可能会发生,但在单核处理器中,这些事件是交替发生的。
3.2 临界区和互斥
临界区是一个代码区域,其中包含访问共享资源的代码,这些资源在任何时候只能被一个线程使用。为了避免资源的冲突访问,必须确保在同一时间只有一个线程能够执行临界区的代码,这就需要使用互斥机制。
互斥是一种保护共享资源不被多个线程同时访问的方法。实现互斥的一种常见方法是使用锁,一个线程在访问资源时会锁定它,阻止其他线程访问,当它完成后会解锁,允许其他线程访问。
3.3 死锁的概念和处理
死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种僵局(即阻塞状态),若无外力作用,它们都将无法推进下去。
死锁的处理方式
预防死锁:这是最直接的方式,通过确保系统在分配资源时不满足死锁的4个必要条件(互斥、占有并等待、不可抢占、循环等待)中的一个或多个,从而预防死锁的发生。例如,只允许进程在没有占有任何资源的情况下请求资源,或者只允许进程一次性请求所有需要的资源。
避免死锁:在资源分配时采用某种算法进行动态检测,例如银行家算法,通过预测分配资源后系统的状态,如果可能导致死锁,则不分配。
检测死锁:定期检查系统资源分配状态,如果发现死锁,则进行处理。这种方法需要系统维护一个资源分配图,并定期进行检查。
解除死锁:当检测到死锁后,采取一些措施来解除死锁,例如撤销进程、剥夺资源、进程回滚等。
实践中,处理死锁的方法需要根据系统的具体需求和资源管理策略来选择。有些系统可能会选择预防或避免死锁,而有些系统可能会选择允许死锁的发生,但会设定一定的机制来检测和解除死锁。
3.4 同步机制
同步是指在多个进程(或线程)中,为了保证这些进程(或线程)之间能有序地访问某些共享资源或完成某些特定任务,需要它们之间进行某种协调或通信。
信号量(Semaphore)
信号量是一个整数值,可以用来解决临界区问题,实现进程或线程之间的同步与互斥。信号量有两种操作:P(等待)和V(信号)。P操作会检查信号量的值,如果值大于零则将其减一;如果值为零则挂起执行。V操作则会将信号量的值加一,如果有挂起的进程或线程,则唤醒它们。
条件变量(Condition Variables)
条件变量常与互斥锁(Mutex)一起使用,用于线程间的同步。一个线程会因为某个条件不满足而在条件变量上等待,当条件满足时,另一个线程会通知在条件变量上等待的线程。
管程(Monitor)
管程是一种同步机制,它将共享变量的操作和条件检查集中在一个数据结构中,通过对这个数据结构的互斥访问实现同步。管程内部通常包含共享变量、操作共享变量的一组过程、以及用于同步的条件变量。
消息传递(Message Passing)
消息传递是一种进程间通信方式,进程通过发送和接收消息进行通信。消息传递可以是同步的(发送者发送消息后必须等待接收者接收消息),也可以是异步的(发送者发送消息后可以继续执行,不必等待接收者接收消息)。
内存管理
4.1 内存的概念
内存是计算机的一种重要硬件设备,它用于存储和获取数据。内存是计算机中的临时存储区域,它可以在短时间内存储大量的信息,并且可以被处理器快速访问。内存是由一系列的存储单元组成,每个存储单元都有一个唯一的地址,用于标识数据的位置。
4.2 内存分配策略
内存分配策略是操作系统用于管理内存的方法,主要有以下几种:
- 首次适应(First Fit):这种方法是在内存中查找第一个足够大的空闲区域分配给进程。
- 最佳适应(Best Fit):这种方法是在内存中查找最小但足够大的空闲区域分配给进程。
- 最坏适应(Worst Fit):这种方法是在内存中查找最大的空闲区域分配给进程。
4.3 分页和分段
分页和分段是两种内存管理技术。
分页:是将物理内存分成固定大小的页,每页的大小通常设置为4KB。当程序需要内存时,操作系统会分配一个或多个页。分页可以减少内存碎片,提高内存利用率。
分段:是将程序分成一些逻辑上独立的段,每个段可以独立地加载到内存中。分段可以使程序更易于理解和修改,也可以提高内存利用率。
4.4 虚拟内存和页面替换算法
虚拟内存是一种内存管理技术,它使得程序可以使用比物理内存更多的内存。虚拟内存通过将内存和硬盘结合起来,使得程序可以使用硬盘上的空间作为内存使用。
页面替换算法是虚拟内存系统中的一种技术,用于决定当内存已满时,哪个页面应该被替换出内存。常见的页面替换算法有FIFO(先进先出)、LRU(最近最少使用)等。
FIFO(先进先出):
这是一种简单直观的策略,遵循的原则是先进入的数据先出去。例如,如果你有一个缓存空间,当它满了以后,你需要为新的数据项腾出空间,那么你会选择最早进入缓存的数据项进行替换。这种策略的优点是实现简单,但可能会导致频繁访问的数据被替换出去。
LRU(最近最少使用):
这种策略的原则是最近最少使用的数据最先被替换。这意味着如果一个数据项最近被访问过,那么在将来它被再次访问的可能性就更大。因此,当缓存满了以后,LRU策略会选择最长时间未被访问的数据项进行替换。这种策略相比FIFO能更好地处理局部性原理,即最近访问过的数据在未来可能再次被访问。
文件系统
5.1 文件系统的概念
文件系统是操作系统用于存储、组织、管理和访问计算机中的数据的一种方法。它定义了文件的命名规则,如何存储这些文件,以及如何从存储介质中检索这些文件。文件系统可以是磁盘文件系统,网络文件系统,或者分布式文件系统等。
5.2 文件的存储和管理
文件的存储和管理涉及到文件的创建、删除、读取、写入等操作。文件系统通常将文件存储在硬盘或其他形式的存储设备上。文件系统将存储设备分成一些小的存储单位,如扇区或块,然后将文件的数据存储在这些单位中。文件系统还需要管理文件的元数据,如文件名、文件大小、文件创建时间等。
元数据
- 元数据(Metadata)是用来描述其他数据的数据。它提供了关于其他数据的有用信息,但并不包含数据本身。元数据可以帮助我们理解数据的来源、结构、含义、时间和空间等相关信息。
例如,一张照片的元数据可能包括拍摄日期、相机类型、ISO设置、焦距等信息;一首歌曲的元数据可能包括歌曲名称、艺术家、专辑、发行日期等信息;一个文件的元数据可能包括文件名、创建日期、修改日期、文件大小等信息。
- 在数据库中,元数据可以描述数据表的名称、列的名称和类型、约束等信息;在网页中,元数据(如HTML的meta标签)可以描述网页的标题、描述、关键词等信息,这对搜索引擎优化(SEO)非常重要。
MD5
- 广泛使用的密码散列函数
- MD5常常用于检查数据的完整性。例如,在文件传输或存储的过程中,为了确保文件没有在传输或存储过程中被修改,我们可以计算文件的MD5值并将其存储为文件的元数据。当我们再次需要使用文件时,可以重新计算文件的MD5值并与存储的元数据中的MD5值进行比较,如果两者一致,那么就可以认为文件没有被修改。
5.3 文件的保护和安全
文件的保护和安全是文件系统的重要组成部分。文件系统通常提供一些机制来保护文件,防止未经授权的访问或修改。这些机制包括文件权限、文件所有权、访问控制列表等。此外,文件系统可能还提供数据加密功能,以增加数据的安全性。
文件权限:
文件权限决定了哪些用户或用户组可以访问或修改文件。在Unix和Linux系统中,文件权限通常分为读(r)、写(w)和执行(x)三类,每类权限可以赋予文件的所有者、所在组的成员以及其他用户。
文件所有权:
文件所有权决定了文件的所有者和所属的用户组。文件所有者通常可以更改文件的权限,包括决定哪些用户可以读取、写入或执行文件。
访问控制列表:
ACL是一种更细粒度的权限控制机制。它允许管理员为每个用户或用户组分别设置文件的访问权限,而不仅仅是基于文件所有者和用户组。ACL可以为特定用户提供更具体的权限,比如只读、只写或读写权限。
5.4 目录结构
目录结构是文件系统用来组织文件的方式。在大多数文件系统中,文件被组织成一种层次结构,称为目录树。每个文件都有一个路径,表示其在目录树中的位置。目录可以包含文件和其他目录。目录结构使用户和应用程序可以方便地找到和管理文件。
设备管理
6.1 设备管理的概念
设备管理是操作系统的一部分,主要负责管理和控制所有的输入/输出设备。设备管理的主要任务包括设备驱动程序的管理,设备调度,缓冲管理等。设备管理的主要目标是提高设备的利用率和系统的吞吐量,同时也要保证系统的公平性和响应时间。
6.2 设备驱动程序
设备驱动程序是操作系统的一部分,用于管理和控制特定硬件设备。它是硬件设备和操作系统之间的接口,用于转换操作系统的指令为硬件设备可以理解的指令。设备驱动程序通常是由硬件制造商提供的,可以根据硬件设备的特性和操作系统的要求进行定制。
6.3 设备调度
设备调度是设备管理的一部分,主要负责决定哪个进程可以使用设备,以及何时可以使用设备。设备调度的目标是提高设备的利用率和系统的吞吐量,同时也要保证系统的公平性和响应时间。设备调度策略通常包括先来先服务(FCFS),最短寻道时间优先(SSTF),扫描(SCAN)等。
先来先服务(FCFS,First-Come, First-Served):
这是最简单的磁盘调度算法。操作系统按照请求到达的顺序来处理它们。这种方法的主要缺点是可能会导致“饥饿”现象,即某些请求可能需要等待很长时间才能得到处理。
最短寻道时间优先(SSTF,Shortest Seek Time First):
在这种算法中,磁头会移动到距离当前位置最近的磁道。这种方法可以减少磁头移动的总时间,从而提高磁盘的性能。但是,它也可能导致饥饿现象。
扫描(SCAN):
在这种算法中,磁头从一端开始,逐渐向另一端移动,处理所有在其路径上的请求。当磁头到达磁盘的一端时,它会改变方向并继续扫描。这种方法被比喻为电梯运行,因此也被称为电梯算法。SCAN算法相比FCFS和SSTF更公平,因为它确保了所有的请求都会得到处理。
6.4 缓冲管理
缓冲管理是设备管理的一部分,主要负责管理和控制缓冲区的使用。缓冲区是一种临时存储区,用于存储从设备读取的数据或者要写入设备的数据。缓冲管理的目标是提高设备的利用率和系统的吞吐量,同时也要保证系统的公平性和响应时间。缓冲管理策略通常包括单缓冲,双缓冲,循环缓冲等。
安全与保护
7.1 操作系统的安全问题
操作系统是计算机系统的核心,也是最容易受到攻击的部分。例如,黑客可能通过漏洞攻击操作系统,获取系统权限,进而对系统进行不法操作。例如,勒索软件”WannaCry”就是利用Windows系统的一个漏洞,对全球范围内的计算机进行攻击,导致大量数据丢失。
7.2 访问控制和用户身份验证
访问控制和用户身份验证是保护信息系统安全的重要手段。例如,银行系统会通过密码和二次验证(如手机短信验证码)的方式,来验证用户的身份。此外,一些高安全级别的系统,如军事系统,可能还会使用生物特征(如指纹、虹膜)进行身份验证。
7.3 病毒和防火墙
病毒是一种能够自我复制并传播的恶意软件。例如,”ILOVEYOU”病毒在2000年通过电子邮件传播,导致全球范围内的大量计算机系统崩溃。防火墙则是一种可以阻止恶意软件进入系统的设备或软件。例如,家用路由器通常都内置了防火墙,可以阻止外部网络对家庭内部网络的非法访问。
7.4 加密和网络安全
加密技术是保护数据安全的重要手段。例如,当我们在网上购物时,信用卡信息会通过HTTPS协议进行加密,防止数据在传输过程中被窃取。网络安全则是保护网络系统不受攻击的一系列措施。例如,一些公司会定期进行网络安全演练,以提高员工对网络安全的意识,防止社会工程学攻击。
现代操作系统
8.1 分布式操作系统
分布式操作系统是一种控制和协调多台计算机共同工作的操作系统。在一个分布式系统中,用户可以访问远程资源就像访问本地资源一样。分布式操作系统提供了数据的一致性、容错性和并发性。
例如,Google的分布式文件系统GFS,它将文件分割成多个块存储在不同的节点上,从而提高了数据的可靠性和访问速度。Apache Hadoop也是一个著名的分布式操作系统,专门用于处理大数据。
8.2 实时操作系统
实时操作系统(RTOS)是为了控制实时应用程序而设计的操作系统,它能在特定的时间内稳定且预测性地响应外部事件。RTOS通常用于嵌入式系统如飞行控制系统、工厂自动化控制系统等。
例如,VxWorks是一个广泛使用的实时操作系统,被广泛应用在航空、航天、军事、网络通信等领域。另一个例子是FreeRTOS,一种开源的微型实时操作系统,适用于各种小型嵌入式设备。
8.3 嵌入式操作系统
嵌入式操作系统是专为嵌入式系统设计的,通常需要具有实时性、稳定性、小型化和低功耗等特点。嵌入式操作系统通常用于智能家电、工业控制设备、车载电子设备等。
例如,QNX是一种商业的嵌入式操作系统,被广泛应用在汽车、医疗、工业自动化等领域。另一个例子是Linux,其轻量级版本如OpenWrt、Raspbian等也被广泛应用于各种嵌入式设备。
8.4 云操作系统
云操作系统是基于云计算技术开发的新型操作系统。它将计算、存储、网络等资源统一管理和调度,为用户提供了伸缩性、弹性和按需付费等特点。
例如,Google的Chrome OS就是一种云操作系统,它把大部分计算和数据存储任务都放到了云端,用户只需要一台简单的设备就可以完成各种复杂的任务。另一个例子是OpenStack,这是一种开源的云操作系统,可以让任何人建立自己的私有或公有云。