期末速成复习资料——操作系统
体型:选择20+判断10+填空10*2+简答4*5+计算2*10
第一章
在一个计算机系统中,通常都含有多种硬件和软件资源。归纳起来可将这些资源分为四类:处理机、存储器、I/O设备以及文件(数据和程序)。相应地,OS的主要功能也正是对这四类资源进行有效的管理。处理机管理是用于分配和控制处理机;存储器管理主要负责内存的分配与回收;I/O设备管理是负责I/O设备的分配(回收)与操纵;文件管理是用于实现对文件的存取、共享和保护。可见,OS的确是计算机系统资源的管理者。
**操作系统(Operating System, OS)**是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。
-
没有任何软件支持的计算机成为裸机。
-
通常把覆盖了软件的机器成为扩充机器,又称之为虚拟机。
-
操作系统对硬件机器的拓展:将CPU、内存、磁盘、显示器、键盘等硬件合理地组织起来,让各种硬件能够相互协调配合,实现更多更复杂的功能普通用户无需关心这些硬件在底层是怎么组织起来工作的,只需直接使用操作系统提供的接口即可。
OS的发展与分类:
-
手工操作阶段 缺点:人机速度矛盾
-
批处理阶段
-
单道批处理系统(引入脱机输入输出技术)优点:缓解人机速度矛盾 缺点:资源利用率依然很低
-
多道批处理系统(操作系统开始出现) 优点:多道程序并发执行,资源利用率高。缺点:不提供人机交互功能
- 主要优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其他资源更能保持“忙碌”状态,系统吞吐量增大。
- 主要缺点:用户响应时间长,没有人机交互功能(用户提交自己的作业之后就只能等待计算机处理完成,中间不能控制自己的作业执行。eg:无法调试程序/无法在程序运行过程中输入一些参数)
-
-
分时操作系统
- 分时操作系统:计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互。
- 优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
- 缺点:不能优先处理一些紧急任务。操作系统对各个用户/作业都是完全公平的,循环地为每个用户/作业服务一个时间片,不区分任务的紧急性。
- 分时操作系统:计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互。
-
实时操作系统(硬实时系统、软实时系统)
- 优点:能优先处理紧急任务,某些紧急任务不需时间片排队。
- 在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性。
操作系统的基本特性:并发、共享、虚拟和异步
并发并行区别【考点】:并发性是指若干时间在同一时间间隔内发生(宏观上,有多个程序同时运行),而并行性是指若干时间在同一时刻发生。
并行是指两个或多个事件在同一时刻发生。
并发是指两个或多个事件在同一时间间隔内发生(这些事件宏观上是同时发生的,但微观上是交替发生的)。
- 考点:单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行;多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行;
- 注意同一时间间隔(并发)和同一时刻(并行)的区别。在多道程序环境下,一段时间内,宏观上有多道程序在同时执行,而在每个时刻,单处理机环境下实际仅能有一道程序执行,因此微观上这些程序仍是分时交替执行的。操作系统的并发性是通过分时得以实现的。
- 注意,并行性是指系统具有同时进行运算或操作的特性,在同一时刻能完成两种或两种以上的工作。并行性需要有相关硬件的支持,如多流水线或多处理机硬件环境。我们以现实生活中的直观例子来认识并发和并行的区别。例如,如果你在9:00~9:10仅吃面包,在 9:10~9:20仅写字,在 9:20~9:30仅吃面包,在 9:30~10:00 仅写字,那么在 9:00~10:00吃面包和写字这两种行为就是并发执行的;再如,如果你在9:00~10:00右手写字,左手同时拿着面包吃,那么这两个动作就是并行执行的。
共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。 共享由两种方式:互斥共享方式和同时访问方式
互斥共享方式:系统中的某些资源,如打印机、磁带机等,虽然可以提供给多个进程(线程)使用,但应规定在一段时间内,只允许一个进程访问该资源。为此,在系统中应建立一种机制,以保证多个进程对这类资源的互斥访问。
-
并发指计算机系统中同时存在着多个运行着的程序。
-
共享是指系统中的资源可供内存中多个并发执行的进程共同使用。
虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。显然,如果失去了并发性,则一个时间段内系统中只需运行一道程序,那么就失去了实现虚拟性的意义了。因此,没有并发性,就谈不上虚拟性。
如果失去了并发性,即系统只能串行地运行各个程序,那么每个程序的执行会一贯到底。只有系统拥有并发性,才有可能导致异步性。
- 考点:理解并发和并行的区别;
- 并发和共享互为存在条件。没有并发和共享,就谈不上虚拟和异步,因此并发和共享是操作系统的两个最基本的特征。
CPU 有两种状态,“内核态”和“用户态”:
- 处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令。
- 处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令。
操作系统的内核程序是系统的管理者,既可以执行特权指令,也可以执行非特权指令,运行在核心态。为了保证系统能安全运行,普通应用程序只能执行非特权指令,运行在用户态。
计算机系统的层次结构
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。实现操作系统内核功能的那些程序就是内核程序。
别名:内核态=核心态=管态;用户态=目态
普通应用程序:可直接进行系统调用,也可使用库函数。有的库函数涉及系统调用,有的不涉及
⏫
编程语言:向上提供库函数。有时会将系统调用封装成库函数,以隐藏系统调用的一些细节,使程序员编程更加方便。
⏫
操作系统:向上提供系统调用,使得上层程序能请求内核的服务。
⏫
裸机
内核功能【考点】
内核是计算机上的底层软件,是操作系统最基本最核心的部分,实现操作系统内核功能的那些程序就是内核程序,内核的主要功能:①中断管理②时间管理③原语④进程管理⑤存储管理⑥设备管理
1.操作系统是对(计算机资源)进行管理的软件
2.下面的(D )资源不是操作系统应该管理的。
A.cpu B.内存 C.外存 D.源程序
在单处理机系统中,可并行的是( D )。
Ⅰ 进程与进程 Ⅱ 处理机与设备 Ⅲ 处理机与通道 Ⅳ 设备与设备
A.Ⅰ、Ⅱ和Ⅲ B.Ⅰ、Ⅱ和Ⅳ C.Ⅰ、Ⅲ和Ⅳ D.Ⅱ、Ⅲ和Ⅳ
操作系统最基本的特征是并发和共享,两者互为存在条件。
用户可以通过(命令接口和系统调用)来管理使用计算机。
系统调用由操作系统提供给用户,它只能通过应用程序使用内核所提供的接口。
系统调用的目的是(请求服务资源)
提高单机资源利用率的关键技术是:(多道程序设计技术)
批处理的主要缺点是(无交互能力)
不属于多道程序设计的是(C)
A.制约性 B.间断性 C.顺序性 D.共享性
操作系统的基本类型主要有:批处理OS,分时OS,实时OS
实时操作系统必须在(被控制对象规定时间)内处理来自外部的事件
实时操作系统的进程调度,通常采用(抢占式的优先级高者优先)算法
(资源利用率)不是设计实时操作系统的主要目标
分时操作系统追求的目标是(比较快速的响应用户)
分时系统中,时间片一定(用户数越多)响应时间越长。
批处理的缺点是(缺少交互性)
输入输出需要中断操作,终端操作必须在核心态下进行,因此输入输出必须在核心态下执行。
多道性是为了提高系统的利用率和吞吐量。
中断发生后,进入中断处理的程序属于(操作系统程序)
第二章 进程的描述与控制
在程序顺序执行时,具有这样三个特征:
① 顺序性:指处理机严格地按照程序所规定的顺序执行,即每一操作必须在下一个操作开始之前结束;
② 封闭性:指程序在封闭的环境下运行,即程序运行时独占全机资源,资源的状态(除初始状态外)只有本程序才能改变它,程序一旦开始执行,其执行结果不受外界因素影响;
③ 可再现性:指只要程序执行时的环境和初始条件相同,当程序重复执行时,不论它是从头到尾不停顿地执行,还是“停停走走”地执行,都可获得相同的结果。程序顺序执行时的这种特性,为程序员检测和校正程序的错误带来了很大的方便。
进程和程序是两个截然不同的概念,除了进程具有程序所没有的PCB结构外,还具有下面一些特征:(1) 动态性。(2) 并发性。(3) 独立性。(4) 异步性。
进程线程区别【考点】
**进程只作为除CPU之外的系统资源的分配单元,线程是一个基本的CPU执行单元,也是程序执行流的最小单位。**线程则作为处理机的分配单元。
① 进程是一个可拥有资源的独立单位,一个进程要能独立运行,它必须拥有一定的资源,包括用于存放程序正文、数据的磁盘和内存地址空间,以及它在运行时所需要的I/O设备、已打开的文件、信号量等;② 进程同时又是一个可独立调度和分派的基本单位,一个进程要能独立运行,它还必须是一个可独立调度和分派的基本单位。每个进程在系统中有唯一的PCB,系统可根据其PCB感知进程的存在,也可以根据其PCB中的信息,对进程进行调度,还可将断点信息保存在其PCB中。反之,再利用进程PCB中的信息来恢复进程运行的现场。正是由于进程有这两个基本属性,才使进程成为一个能独立运行的基本单位,从而也就构成了进程并发执行的基础。
进程三状态图和五状态图(填空或简答) **状态转换 ** 【考点】
由于多个进程在并发执行时共享系统资源,致使它们在运行过程中呈现间断性的运行规律,所以进程在其生命周期内可能具有多种状态。一般而言 ,每一个进程至少应处于以下三种基本状态之一: 1️⃣就绪(Ready)状态。2️⃣ 执行(Running)状态。3️⃣阻塞(Block)状态。
进程在运行过程中会经常发生状态的转换。
- 处于就绪状态的进程,在调度程序为之分配了处理机之后便可执行,相应地,其状态就由就绪态转变为执行态;
- 正在执行的进程(当前进程)如果因分配给它的时间片已完而被剥夺处理机暂停执行时,其状态便由执行转为就绪;
- 如果因发生某事件,致使当前进程的执行受阻(例如进程访问某临界资源,而该资源正被其它进程访问时),使之无法继续执行,则该进程状态将由执行转变为阻塞。
图2-5示出了进程的三种基本状态,以及各状态之间的转换关系。
创建状态:如前所述,进程是由创建而产生。创建一个进程是个很复杂的过程,一般要通过多个步骤才能完成:如首先由进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后,把该进程转入就绪状态并插入就绪队列之中。但如果进程所需的资源尚不能得到满足,比如系统尚无足够的内存使进程无法装入其中,此时创建工作尚未完成,进程不能被调度运行,于是把此时进程所处的状态称为创建状态。
终止状态:进程的终止也要通过两个步骤:首先,是等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还系统。当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。进入终止态的进程以后不能再执行,但在操作系统中依然保留一个记录,其中保存状态码和一些计时统计数据,供其他进程收集。一旦其他进程完成了对其信息的提取之后,操作系统将删除该进程,即将其PCB清零,并将该空白PCB返还系统。图2-6示出了增加了创建状态和终止状态后进程的五种状态及转换关系图。
挂起操作的引入:引入挂起操作的原因,是基于系统和用户的如下需要:
(1) 终端用户的需要。(2) 父进程请求。(3) 负荷调节的需要。(4) 操作系统的需要。
在引入挂起原语Suspend和激活原语Active后,在它们的作用下,进程将可能发生以下几种状态的转换:
(1) 活动就绪→静止就绪。 (2) 活动阻塞→静止阻塞。 (3) 静止就绪→活动就绪。(4) 静止阻塞→活动阻塞。
进程控制块的组织方式ppt39
目前常用的组织方式有以下三种。
- 线性方式,即将系统中所有的PCB都组织在一张线性表中,将该表的首址存放在内存的一个专用区域中。该方式实现简单、开销小,但每次查找时都需要扫描整张表,因此适合进程数目不多的系统。
- 链接方式,即把具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列。这样,可以形成就绪队列、若干个阻塞队列和空白队列等。对就绪队列而言,往往按进程的优先级将PCB从高到低进行排列,将优先级高的进程PCB排在队列的前面。同样,也可把处于阻塞状态进程的PCB根据其阻塞原因的不同,排成多个阻塞队列,如等待I/O操作完成的队列和等待分配内存的队列等。
- 索引方式,即系统根据所有进程状态的不同,建立几张索引表,例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。
进程控制,就是系统使用一些具有特定功能的程序段来创建、撤消进程以及完成进程各状态间的转换,从而达到多进程高效率并发执行和协调、实现资源共享的目的。
原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。可以用 “关中断指令”和“开中断指令”这两个特权指令实现原子性。用于进程控制的原语有:创建原语、撤消原语、阻塞原语、唤醒原语等。
创建原语:申请空白PCB➡️ 为新进程分配所需资源➡️ 初始化PCB ➡️ 将PCB插入就绪队列 (创建态➡️ 就绪态)
撤销原语:从PCB集合中找到终止进程的PCB➡️ 若进程正在运行,立即剥夺CPU,将CPU分配给其他进程➡️ 终止其所有子进程➡️ 将该进程拥有的所有资源归还给父进程或操作系统➡️ 删除PCB(就绪态/阻塞态/运行态➡️ 终止态➡️ 无)
阻塞原语:找到要阻塞的进程对应的PCB➡️ 保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行➡️ 将PCB插入相应事件的等待队列 (运行态➡️ 阻塞态)
唤醒原语:在事件等待队列中找到PCB➡️ 将PCB从等待队列移除,设置进程为就绪态➡️ 将PCB插入就绪队列,等待被调度(阻塞态 就绪态)
注:唤醒原语必须成对使用
切换原语:将运行环境信息存入PCB➡️ PCB移入相应队列➡️ 选择另一个进程执行,并更新其PCB➡️ 根据PCB恢复新进程所需的运行环境(运行态➡️ 就绪态;就绪态➡️ 运行态)
进程通信是指进程之间的信息交换。由于进程的互斥与同步,需要在进程间交换一定的信息,故不少学者将它们也归为进程通信,但只能把它们称为低级进程通信。我们以信号量机制为例来说明,它们之所以低级的原因在于:① 效率低,生产者每次只能向缓冲池投放一个产品(消息),消费者每次只能从缓冲区中取得一个消息;② 通信对用户不透明,OS只为进程之间的通信提供了共享存储器。
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。为了保证安全,一个进程不能直接访问另一个进程的地址空间。
线程的实现方式:
-
内核级线程KST(Kernel Supported Threads):在OS中的所有进程,无论是系统进程还是用户进程,都是在操作系统内核的支持下运行的,是与内核紧密相关的。而内核支持线程KST同样也是在内核的支持下运行的,它们的创建、阻塞、撤消和切换等,也都是在内核空间实现的。为了对内核线程进行控制和管理,在内核空间也为每一个内核线程设置了一个线程控制块,内核根据该控制块而感知某线程的存在,并对其加以控制。当前大多数OS都支持内核支持线程。
- 内核级线程的管理工作由操作系统内核完成。
- 线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
- 操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),通过TCB对线程进行管理。“内核级线程”就是“从操作系统内核视角看能看到的线程”
- 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
- 在多处理器系统中,内核能够同时调度同一进程中的多个线程并行执行;
- 如果进程中的一个线程被阻塞了,内核可以调度该进程中的其它线程占有处理器运行,也可以运行其它进程中的线程;
- 内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开销小;
- 内核本身也可以采用多线程技术,可以提高系统的执行速度和效率
- 缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
-
用户级线程ULT(User Level Threads):用户级线程是在用户空间中实现的。对线程的创建、 撤消、同步与通信等功能,都无需内核的支持,即用户级线程是与内核无关的。在一个系统中的用户级线程的数目可以达到数百个至数千个。由于这些线程的任务控制块都是设置在用户空间,而线程所执行的操作也无需内核的帮助,因而内核完全不知道用户级线程的存在。
- 用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换)
- 用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
- 在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。“用户级线程”就是“从用户视角看能看到的线程”
- 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。调度算法可以是进程专用的。用户级线程的实现与OS平台无关,因为对于线程管理的代码是属于用户程序的一部分,所有的应用程序都可以对之进行共享。
- 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
- 系统调用的阻塞问题。在基于进程机制的OS中,大多数系统调用将使进程阻塞,因此,当线程执行一个系统调用时,不仅该线程被阻塞,而且,进程内的所有线程会被阻塞。而在内核支持线程方式中,则进程中的其它线程仍然可以运行。
- 在单纯的用户级线程实现方式中,多线程应用不能利用多处理机进行多重处理的优点,内核每次分配给一个进程的仅有一个CPU,因此,进程中仅有一个线程能执行,在该线程放弃CPU之前,其它线程只能等待。
-
组合方式:有些OS把用户级线程和内核支持线程两种方式进行组合,提供了组合方式ULT/KST 线程。在组合方式线程系统中,内核支持多个内核支持线程的建立、调度和管理,同时,也允许用户应用程序建立、调度和管理用户级线程。
- 多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。
- 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统,开销小,效率高,
- 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
- 重点:操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。
- 一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
- 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
- 缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
- 多对多模型:n 用户及线程映射到 m 个内核级线程(n >= m)。每个用户进程对应 m 个内核级线程。克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
- 多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。
可以这么理解:用户级线程是“代码逻辑”的载体,内核级线程是“运行机会”的载体。
用户级线程的实现:运行时系统(Runtime System) ,所谓“运行时系统”,实质上是用于管理和控制线程的函数(过程)的集合,其中包括用于创建和撤消线程的函数、线程同步和通信的函数,以及实现线程调度的函数等。正因为有这些函数,才能使用户级线程与内核无关。运行时系统中的所有函数都驻留在用户空间,并作为用户级线程与内核之间的接口。
内核控制线程:这种线程又称为轻型进程LWP(Light Weight Process)。每一个进程都可拥有多个LWP,同用户级线程一样,每个LWP都有自己的数据结构(如TCB),其中包括线程标识符、优先级、状态,另外还有栈和局部存储区等。LWP也可以共享进程所拥有的资源。LWP可通过系统调用来获得内核提供的服务,这样,当一个用户级线程运行时,只须将它连接到一个LWP上,此时它便具有了内核支持线程的所有属性。这种线程实现方式就是组合方式。
线程包含CPU现场,可以独立执行程序。但每个线程没有独立的地址空间,它共享所属进程的空间。
进程与程序的根本区别是(动态性)
对进程的管理和控制使用(原语)
线程不能创建进程。
第三章 处理机调度
- 多道程序环境下,内存中进程数目和处理机数目谁多?
在多道程序环境下,内存中存在着多个进程,进程的数目往往多于处理机的数目。 这就要求系统能按某种算法,动态地将处理机分配给一个处于就绪状态的进程,使之执行。 分配处理机的任务是由处理机调度程序完成的。
-
如何将处理机分配给处于就绪状态的进程?
-
分配处理机的任务由谁来完成?
分配处理机的任务是由处理机调度程序完成的。 由于处理机是最重要的计算机资源,提高处理机的利用率及改善系统性能(吞吐量、响应时间)
- 什么是死锁?
处理机调度概述
在多道程序系统中,调度的实质是一种资源分配,处理机调度是对处理机资源进行分配。处理机调度算法是指根据处理机分配策略所规定的处理机分配算法。在多道批处理系统中,一个作业从提交到获得处理机执行,直至作业运行完毕,可能需要经历多级处理机调度。
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。
-
高级调度(High Level Scheduling)(作业调度): 按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调入时会建立PCB,调出时才撤销PCB。
-
作业:一个具体的任务,是用户提交给系统的一项相对独立的工作。
-
作业控制块(Job Control Block,JCB):为了管理和调度作业,“作业注册” 程序为每个作业设置了JCB,包含:作业标志、用户名称、用户账号、作业类型、调度信息、资源需求情况等。
-
作业调度的主要任务:接纳所少个作业,接纳哪些作业。
-
-
中级调度(Intermediate Scheduling)(内存调度): 内存不够时,可将某些进程的数据调出外存。等内存空闲或者进程需要运行时再重新调入内存。暂时调到外存等待的进程状态为挂起状态。被挂起的进程PCB会被组织成挂起队列。中级调度(内存调度):按照某种策略决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。
-
低级调度(Low Level Scheduling)(进程调度): 低级调度(进程调度/处理机调度): 按照某种策略从就绪队列中选取一个进程,将处理机分配给它。进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。
“挂起” 与“阻塞” 的区别
暂时调到外存等待的进程状态为挂起状态(挂起态,suspend)。挂起态又可以进一步细分为就绪挂起(静止就绪)、阻塞挂起(静止阻塞)两种状态。
“挂起”和“阻塞”的区别,两种状态都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中。有的操作系统会把就绪挂起、阻塞挂起分为两个挂起队列,甚至会根据阻塞原因不同再把阻塞挂起进程进一步细分为多个队列。
进程调度
-
进程调度任务:保存CPU现场信息,按照某种算法选取进程,把CPU分配给进程。
-
调度时机:
- 需要进程调度的时候:主动放弃----进程正常终止;运行时发生异常而终止;主动阻塞。被动放弃----分给进程时间片用完;有更紧急的事情需要处理;有更高优先级的进程进入
- 不能进行进程调度的时候:在处理终端的过程中;在操作系统内核程序临界区中;原子操作过程中。
-
进程调度的方式:
-
非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
-
剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。
-
注意:进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少
-
处理机调度算法的共同目标和批处理系统的目标
一般而言,在设计一个OS时,应如何选择调度算法,在很大程度上取决于OS的类型及其设计目标,如:在批处理系统、分时系统和实时系统中,通常会采用不同的调度算法。
资源利用率:为提高系统的资源利用率,应使系统中的处理机和其它所有资源都尽可能地保持忙碌状态,其中最重要的处理机利用率,即CPU 的利用率可以用以下公式计算:
CPU利用率 = CPU 有效工作时间 CPU 有效工作时间 + CPU 空闲等待时间 \text{CPU利用率} = \frac{\text{CPU 有效工作时间}}{\text{CPU 有效工作时间} + \text{CPU 空闲等待时间}} CPU利用率=CPU 有效工作时间+CPU 空闲等待时间CPU 有效工作时间
例题:某计算机只支持单道程序,某个作业刚开始需要在CPU上运行5秒,再用打印机打印输出5秒,之后再执行5秒,才能结束。在此过程中,CPU利用率、打印机利用率分别是多少?
要计算某计算机在给定作业运行过程中的 CPU 利用率和打印机利用率,我们首先需要明确作业的运行顺序和时间。
CPU 的利用率计算为:
CPU利用率 = 5 5 + 5 + 5 = 5 15 = 0.5 = 66.6 % \text{CPU利用率} = \frac{5}{5 +5+ 5} = \frac{5}{15} = 0.5 = 66.6\% CPU利用率=5+5+55=155=0.5=66.6%
打印机的利用率为:
打印机利用率 = 5 15 × 100 % = 1 3 × 100 % ≈ 33.33 % \text{打印机利用率} = \frac{5}{15} \times 100\% = \frac{1}{3} \times 100\% \approx 33.33\% 打印机利用率=155×100%=31×100%≈33.33%
对每个用户而言,都希望自己作业的周转时间(从提交到完成)最短。
周转时间 = 作业完成时间 − 作业提交时间 \text{周转时间} = \text{作业完成时间}-\text{作业提交时间} 周转时间=作业完成时间−作业提交时间
周转时间,包括四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等待进程调度(低级调度)的时间、进程在CPU上执行的时间、进程等待I/O操作完成的时间。后三项在一个作业的整个处理过程中,可能发生多次。
对每个用户而言,都希望自己作业的周转时间(从提交到完成)最短。但作为计算机系统的管理者,则总是希望能使平均周转时间最短,这不仅会有效地提高系统资源的利用率,而且还可使大多数用户都感到满意。应使作业周转时间和作业的平均周转时间尽可能短。否则,会使许多用户的等待时间过长,这将会引起用户特别是短作业用户的不满。可把平均周转时间描述为(各作业周转时间之和/作业数)。
在计算机系统中,作业的周转时间是指从作业提交到完成的整个时间。平均周转时间则是所有作业的周转时间的平均值,用于衡量系统的性能和效率。
假设我们有几个作业的周转时间已知,我们可以按照以下步骤计算平均周转时间:
-
收集作业的周转时间:假设我们有几个作业的周转时间,用 ( T_i ) 表示第 ( i ) 个作业的周转时间。
-
计算总周转时间:将所有作业的周转时间相加,得到总的周转时间之和。
-
计算平均周转时间:使用下面的公式计算平均周转时间
T = ∑ T i 作业数 \text{T} = \frac{\sum T_i}{\text{作业数}} T=作业数∑Ti
其中, 作业数是系统中的作业总数。
平均周转时间的计算帮助系统管理员评估系统的整体性能和资源利用率。
为了进一步反映调度的性能,更清晰地描述各进程在其周转时间中,等待和执行时间的具体分配状况,往往使用带权周转时间,即作业的周转时间T与系统为它提供服务的时间(实际运行时间)Ts之比,即W = T/Ts。而平均带权周转时间则可表示为:
W = ∑ T i T s 作业数 \text{W} = \frac{\sum \frac{T_i}{T_{s}}}{\text{作业数}} W=作业数∑TsTi
其中, 分子是所有作业的带权周转时间之和,而分母则是系统中的作业总数。
- 带权周转时间必然 ≥ 1。
- 带权周转时间与周转时间都是越小越好。
例题:某计算机系统处理完10道作业,共花费100秒,则系统吞吐量为?
系统的吞吐量(Throughput)是指单位时间内完成的作业数。在这个例题中,我们知道系统处理了 10 道作业,共花费了 100 秒。
系统的吞吐量可以通过以下公式计算:
吞吐量 = 完成的作业数 总花费时间 \text{吞吐量} = \frac{\text{完成的作业数}}{\text{总花费时间}} 吞吐量=总花费时间完成的作业数
将已知的值代入公式:
吞吐量 = 10 100 = 0.1 作业/秒 \text{吞吐量} = \frac{10}{100} = 0.1 \text{ 作业/秒} 吞吐量=10010=0.1 作业/秒
因此,该计算机系统的吞吐量为 0.1 作业/秒,即每秒完成 0.1 个作业。
进程或作业的调度算法
- 先来先服务(first-come first-served,FCFS)调度算法
FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。然后把它放入就绪队列。用于进程调度时,考虑的是哪个进程先到达就绪队列。
- 短作业优先(Shortest Job First,SJF)的调度算法和最短剩余时间优先算法(Shortest Remaining Time Next,SRTN)
由于在实际情况中,短作业(进程)占有很大比例,为了能使它们能比长作业优先执行,而产生了短作业优先调度算法。求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间。用于进程调度时称为“短进程优先(SPF, Shortest Process First)算法”。
SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业调度和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行。(“最短”,是指要求服务时间最短)
每当有进程加入就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度。
如果题目中未特别说明,所提到的“短作业/进程优先算法”默认是非抢占式的
很多书上都会说“SJF调度算法的平均等待时间、平均周转时间最少”。严格来说,这个表述是错误的,不严谨的。之前的例子表明,最短剩余时间优先算法得到的平均等待时间、平均周转时间还要更少应该加上一个条件“在所有进程同时可运行时,采用SJF调度算法的平均等待时间、平均周转时间最小”;或者说“在所有进程都几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最少”;
如果不加上述前提条件,则应该说“抢占式的短作业/进程优先调度算法(最短剩余时间优先,SRNT算法)的平均等待时间、平均周转时间最少“。
虽然严格来说,SJF的平均等待时间、平均周转时间并不一定最少,但相比于其他算法(如FCFS),SJF依然可以获得较少的平均等待时间、平均周转时间
如果选择题中遇到“SJF 算法的平均等待时间、平均周转时间最少”的选项,那最好判断其他选项4.是不是有很明显的错误,如果没有更合适的选项,那也应该选择该选项。
FCFS 算法是在每次调度的时候选择一个等待时间最长的作业(进程)为其服务。但是没有考虑到作业的运行时间,因此导致了对短作业不友好的问题。
SJF 算法是选择一个执行时间最短的作业为其服务。但是又完全不考虑各个作业的等待时间,因此导致了对长作业不友好的问题,甚至还会造成饥饿问题。
- 高响应比优先调度算法(Highest Response Ratio Next,HRRN)
高响应比优先调度算法则是既考虑了作业的等待时间,又考虑作业运行时间的调度算法,因此既照顾了短作业,又不致使长作业的等待时间过长,从而改善了处理机调度的性能。非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比。
高响应比优先算法是如何实现的呢?如果我们能为每个作业引入一个动态优先级,即优先级是可以改变的,令它随等待时间延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可描述为:
优先级 = 等待时间 + 要求服务时间 要求服务时间 \text{优先级} = \frac{\text{等待时间}+\text{要求服务时间}}{\text{要求服务时间}} 优先级=要求服务时间等待时间+要求服务时间
- (时间片)轮转调度算法(Round Robin,RR)
原理:在轮转(RR)法中,系统将所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔一定时间(如30 ms)便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,并令其执行一个时间片。当它运行完毕后,又把处理机分配给就绪队列中新的队首进程,也让它执行一个时间片。这样,就可以保证就绪队列中的所有进程在确定的时间段内,都能获得一个时间片的处理机时间。
进程切换时机:在RR调度算法中,应在何时进行进程的切换,可分为两种情况:
- 若一个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片。
- 在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送往就绪队列的末尾。
如果时间片太大,使每个进程都可以在一个时间片内就完成,则RR算法就退化为先来先服务算法,并且会增大进程相应时间。因此时间片不能太大。
- 优先级调度算法(Priority-Scheduling Algorithm,PSA)
原理:可以这样来看作业的优先级,对于先来先服务调度算法,作业的等待时间就是作业的优先级,等待时间越长,其优先级越高。对于短作业优先调度算法,作业的长短就是作业的优先级,作业所需运行的时间越短,其优先级越高。但上述两种优先级都不能反映作业的紧迫程度。每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程。
非抢占:
抢占:
- 多级反馈队列(Multileved Feedback Queue)调度算法
机制:
- 多级队列调度算法
如前所述的各种调度算法,尤其在应用于进程调度时,由于系统中仅设置一个进程的就绪队列,即低级调度算法是固定的、单一的,无法满足系统中不同用户对进程调度策略的不同要求,在多处理机系统中,这种单一调度策略实现机制的缺点更显突出,由此,多级队列调度算法能够在一定程度上弥补这一缺点。
系统中按进程类型设置多个队列,进程创建成功后插入某个队列。
队列之间可采取固定优先级,或时间片划分固定优先级:高优先级空时低优先级进程才能被调度时间片划分:如三个队列分配时间50%、40%、10%。各队列可采用不同的调度策略,如:系统进程队列采用优先级调度;交互式队列采用RR;批处理队列采用FCFS。
Unix使用多级反馈队列
一般来说IO型作业的优先权高于计算行作业,因此
死锁相关内容(选择)【考点】
在系统中有许多不同类型的资源,其中可以引起死锁的主要是,需要采用互斥访问方法的、不可以被抢占的资源,即在前面介绍的临界资源。系统中这类资源有很多,如打印机、数据文件、队列、信号量等。
可重用性资源和消耗性资源
- 可重用性资源:可重用性资源是一种可供用户重复使用多次的资源,它具有如下性质:
- 每一个可重用性资源中的单元只能分配给一个进程使用,不允许多个进程共享。
- 进程在使用可重用性资源时,须按照这样的顺序:① 请求资源。如果请求资源失败,请求进程将会被阻塞或循环等待。② 使用资源。进程对资源进行操作,如用打印机进行打印;③ 释放资源。当进程使用完后自己释放资源。
- 系统中每一类可重用性资源中的单元数目是相对固定的,进程在运行期间既不能创建也不能删除它。
- 可消耗性资源:可消耗性资源又称为临时性资源,它是在进程运行期间,由进程动态地创建和消耗的,它具有如下性质:① 每一类可消耗性资源的单元数目在进程运行期间是可以不断变化的,有时它可以有许多,有时可能为0;② 进程在运行过程中,可以不断地创造可消耗性资源的单元,将它们放入该资源类的缓冲区中,以增加该资源类的单元数目。③ 进程在运行过程中,可以请求若干个可消耗性资源单元,用于进程自己的消耗,不再将它们返回给该资源类中。
可抢占性资源和不可抢占性资源
- 可抢占性资源:可把系统中的资源分成两类,一类是可抢占性资源,是指某进程在获得这类资源后,该资源可以再被其它进程或系统抢占。
- 不可抢占性资源:另一类资源是不可抢占性资源,即一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。
死锁的定义 :在一组进程发生死锁的情况下,这组死锁进程中的每一个进程,都在等待另一个死锁进程所占有的资源。在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。发生死锁后若无外力干涉,这些进程都将无法向前推进。
死锁、饥饿、死循环共同点:都是进程无法顺利向前推进的现象(故意设计的死循环除外)
死锁、饥饿、死循环的区别:
-
死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。
- 死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,那至少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻塞态。
-
饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。
- 可能只有一个进程发生饥饿。发生饥饿的进程既可能是阻塞态(如长期得不到需要的I/O设备),也可能是就绪态(长期得不到处理机)。
-
死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑 bug 导致的,有时是程序员故意设计的。
- 可能只有一个进程发生死循环。死循环的进程可以上处理机运行(可以是运行态),只不过无法像期待的那样顺利推进。死锁和饥饿问题是由于操作系统分配资源的策略不合理导致的,而死循环是由代码逻辑的错误导致的。死锁和饥饿是管理者(操作系统)的问题,死循环是被管理者的问题。
产生死锁的必要条件:
- 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁。
- 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
- 不可抢占条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
- 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
⚠️发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)。
什么时候会发生死锁?
-
对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁的。
-
进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1、P2 分别申请并占有了资源 R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。
-
信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就有可能导致死锁。(可以把互斥信号量、同步信号量也看做是一种抽象的系统资源)
总之,对不可剥夺资源的不合理分配,可能导致死锁。
处理死锁的方法:
目前处理死锁的方法可归结为四种:
-
预防死锁(静态策略):破坏死锁产生的四个必要条件中的一个或几个。
-
避免死锁(动态策略) :用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)。
-
检测和解除死锁:允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种施解除死锁。
预防死锁的方法是通过破坏产生死锁的四个必要条件中的一个或几个,以避免发生死锁。
由于互斥条件是非共享设备所必须的,不仅不能改变,还应加以保证,因此主要是破坏产生死锁的后三个条件。
死锁检测时检测的是资源有向图和资源矩阵法zzzzz
第四章 进程同步
进程同步:进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能(进程控制用原语实现)。
进程具有异步性的特征。异步性是指:各并发执行的进程以各自独立的、不可预知的速度向前推进。
为实现进程互斥地进入自己的临界区,可用软件方法,更多的是在系统中设置专门的同步机构来协调各进程间的运行。所有同步机制都应遵循下述四条准则:(1) 空闲让进。(2) 忙则等待。(3) 有限等待。(4) 让权等待。
信号量同步互斥(选填)(第二章ppt70)【考点】
最初由Dijkstra把整型信号量定义为一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作(Atomic Operation) wait(S)和signal(S)来访问。很长时间以来,这两个操作一直被分别称为P、V操作。
为使多个进程能互斥地访问某临界资源,只需为该资源设置一互斥信号量mutex,并设其初始值为1,然后将各进程访问该资源的临界区CS置于wait(mutex)和signal(mutex)操作之间即可。
PV操作是低级进程通信原语。
1、生产者-消费者问题
描述如下:
semaphore mutex = 1; //互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n; //同步信号量,表示空闲缓冲区的数量
semaphore full = 0; //同步信号量,表示产品的数量,也即非空缓冲区的数量consumer (){ while(1){ P(mutex); //③ P(full); //④//从缓冲区取出一个产品 V(mutex); V(empty); //使用产品; }
}
producer (){while(1){//生产一个产品;P(mutex); //①P(empty); //②//把产品放入缓冲区;V(mutex);V(full);}
}
若此时缓冲区内已经放满产品,则 empty=0,full=n。
则生产者进程执行① 使mutex变为0,再执行②,由于已没有空闲缓冲区,因此生产者被阻塞。
由于生产者阻塞,因此切换回消费者进程。消费者进程执行③,由于mutex为0,即生产者还没释放对临界资源的“锁”,因此消费者也被阻塞。
这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。
同样的,若缓冲区中没有产品,即full=0,empty=n。按③④① 的顺序执行就会发生死锁。
因此,实现互斥的P操作一定要在实现同步的P操作之后。
V操作不会导致进程阻塞,因此两个V操作顺序可以交换。
临界区和临界资源是什么?【考点】
在第一章中我们曾经介绍过,许多硬件资源如打印机、 磁带机等,都属于临界资源,诸进程间应采取互斥方式,实现对这种资源的共享。 (第二章63ppt)
由前所述可知,不论是硬件临界资源还是软件临界资源,多个进程必须互斥地对它进行访问。人们把在每个进程中访问临界资源的那段代码称为临界区(critical section)。 (第二章64ppt)
我们把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。
对临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。
不论是硬件临界资源还是软件临界资源,多个进程必须互斥地对它进行访问。人们把在每个进程中访问临界资源的那段代码称为临界区(critical section)。
临界区实现同步机制依赖哪些准则 【考点】
为实现进程互斥地进入自己的临界区,可用软件方法,更多的是在系统中设置专门的同步机构来协调各进程间的运行。所有同步机制都应遵循下述四条准则:
- 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
- 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。
- 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
- 让权等待:当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
互斥锁
解决临界区最简单的工具就是互斥锁(mutex lock)。一个进程在进入临界区时应获得锁;在退出临界区时释放锁。函数acquire()
获得锁,而函数release()
释放锁。
acquire(){ while(!available); //忙等待 available=false;
} //获得锁
release(){available=true;//释放锁
}
acquire()
或release()
的执行必须是原子操作,因此互斥锁通常采用硬件机制来实现。
互斥锁的主要缺点是忙等待,当有一个进程在临界区中,任何其他进程在进入临界区时必须连续循环调用acquire()
。当多个进程共享同一CPU时,就浪费了CPU周期。因此,互斥锁通常用于多处理器系统,一个线程可以在一个处理器上等待,不影响其他线程的执行。
需要连续循环忙等的互斥锁,都可称为自旋锁(spin lock),如 TSL指令、swap指令、单标志法。
特性:
- 需忙等,进程时间片用完才下处理机,违反“让权等待”
- 优点:等待期间不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价很低
- 常用于多处理器系统,一个核忙等,其他核照常工作,并快速释放临界区
- 不太适用于单处理机系统,忙等的过程中不可能解锁。
1.单处理机系统中,可并行的是( D )。
①进程与进程 ②处理机与设备 ③处理机与通道
④设备与设备
A. ① ②③ B. ①②④ C.① ③④ D.②③④
2.下列选项中,操作系统提供给应用程序的接口是(A )
A. 系统调用 B.中断 C.库函数 D.原语
3.下列选项中,在用户态执行的是(A )。
A. 命令解释程序 B.缺页处理程序
C.进程调度程序 D.时钟中断处理程序
4.下列选项中,不可能在用户态发生的事件是( C )。
A. 系统调用 B.外部中断 C.进程切换 D.缺页
5.下列选项中,降低进程优先级的合理时机是( A )。
A. 进程时间片用完
B.进程刚完成I/O操作,进入就绪队列
C.进程长期处于就绪队列
D.进程变为运行状态
6.下列进程调度算法中,综合考虑进程等待时间和执行时间的是( D)。
A. 时间片轮转调度算法 B.短进程优先调度算法
C.先来先服务调度算法 D.高响应比优点调度算法
7.一个多道批处理系统中仅有P1和P2两个作业,P2比P1晚5ms到达,它的计算和I/O操作顺序如下:
P1:计算60ms,I/O80ms,计算20ms
P2:计算120ms,I/O40ms,计算40ms
若不考虑调度和切换时间,则完成两个作业需要的时间最少是( B )。
A. 240ms B.260ms C.340ms D.360ms
- 计算要占CPU
- I/O不占CPU
- 先出发的先执行
- 计算使用CPU可以与I/O一起进行,但是i/o操作不能并行
8.设与某资源关联的信号量(K)初值为3,当前值为1.若M表示该资源的可用个数,N表示等待该资源的进程数,则M、N分别是( B )。
A. 0、1 B.1、0 C.1、2 D.2、0
9.某计算机系统中有8台打印机,由K个进程竞争使用,每个进程最多需要3台打印机。该系统可能会发生死锁的K的最小值是(C)。
A. 2 B.3 C.4 D.5
第五章 存储器管理
内存可存放数据。程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾。
存储器的多层结构
对于通用计算机而言,存储层次至少应具有三级:最高层为CPU寄存器,中间为主存,最底层是辅存。在较高档的计算机中,还可以根据具体的功能细分为寄存器、高速缓存、主存储器、磁盘缓存、固定磁盘、可移动存储介质等6层。
主存储器简称内存或主存,是计算机系统中的主要部件,用于保存进程运行时的程序和数据,也称可执行存储器。程序员写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址读/写数据,这个数据应该做什么样的处理。
寄存器具有与处理机相同的速度,故对寄存器的访问速度最快,完全能与CPU协调工作,但价格却十分昂贵,因此容量不可能做得很大。寄存器是CPU内部的一些小型存储区域,用于暂时存放参与运算的指令、数据和运算结果等内容。
高速缓存是现代计算机结构中的一个重要部件,它是介于寄存器和存储器之间的存储器,主要用于备份主存中较常用的数据,以减少处理机对主存储器的访问次数,这样可大幅度地提高程序执行速度。高速缓存容量远大于寄存器,而比内存约小两到三个数量级左右,从几十KB到几MB,访问速度快于主存储器。
由于目前磁盘的I/O速度远低于对主存的访问速度,为了缓和两者之间在速度上的不匹配,而设置了磁盘缓存,主要用于暂时存放频繁使用的一部分磁盘数据和信息,以减少访问磁盘的次数。但磁盘缓存与高速缓存不同,它本身并不是一种实际存在的存储器,而是利用主存中的部分存储空间暂时存放从磁盘中读出(或写入)的信息。主存也可以看作是辅存的高速缓存,因为,辅存中的数据必须复制到主存方能使用,反之,数据也必须先存在主存中,才能输出到辅存。
用户程序要在系统中运行,必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常都要经过以下几个步骤:
(1) 编译,由编译程序(Compiler)对用户源程序进行编译,形成若干个目标模块(Object Module);
(2) 链接,由链接程序(Linker)将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module)。链接分为静态链接(先将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开)和装入时动态链接(将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式), 运行时动态链接(需要什么链接什么)。
(3) 装入(装载),由装入程序(Loader)将装入模块装入内存。分为绝对装入方式和可重定位装入方式。
覆盖(Overlay)与对换(Swapping)
覆盖与对换(交换)技术是在多道程序环境下用来扩充内存的两种方法。
覆盖技术的思想:将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。
内存中分为一个“固定区”和若干个“覆盖区”。需要常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束)不常用的段放在“覆盖区”,需要用到时调入内存,用不到时调出内存。(已成为历史)
对换技术也称为交换技术,最早用于麻省理工学院的单用户分时系统CTSS中。由于当时计算机的内存都非常小,为了使该系统能分时运行多个用户程序而引入了对换技术。系统把所有的用户作业存放在磁盘上,每次只能调入一个作业进入内存,当该作业的一个时间片用完时,将它调至外存的后备队列上等待,再从后备队列上将另一个作业调入内存。这就是最早出现的分时系统中所用的对换技术。现在已经很少使用。
对换技术也称为交换技术,最早用于麻省理工学院的单用户分时系统CTSS中。由于当时计算机的内存都非常小,为了使该系统能分时运行多个用户程序而引入了对换技术。系统把所有的用户作业存放在磁盘上,每次只能调入一个作业进入内存,当该作业的一个时间片用完时,将它调至外存的后备队列上等待,再从后备队列上将另一个作业调入内存。这就是最早出现的分时系统中所用的对换技术。现在已经很少使用。
交换(对换)技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)。
中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。暂时换出外存等待的进程状态为挂起状态(挂起态,suspend)挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态。
在每次对换时,都是将一定数量的程序或数据换入或换出内存。根据每次对换时所对换的数量,可将对换分为如下两类:
(1) 整体对换:以整个进程为单位的,称为进程对换或整体对换。
(2) 页面(分段)对换:以进程的一个“页面”或“分段”为单位进行的,则称之为“页面对换”或“分段对换”(后面虚拟存储器中介绍)。
交换主要是在进程或作业之间进行的,而覆盖则主要是在同一个作业或进程内进行。
进程的换出与换入
1. 进程的换出:对换进程在实现进程换出时,是将内存中的某些进程调出至对换区,以便腾出内存空间。换出过程可分为以下两步:
* (1) 选择被换出的进程:首先选择处于阻塞状态或睡眠状态的进程,当有多个,选优先级最低的,也应考虑进程在内存中的驻留时长;如无阻塞进程,内存仍不足,选优先级最低的就绪进程换出。
* (2) 进程换出过程:换出非共享的程序和数据段。
2. 进程的换入:对换进程将定时执行换入操作,它首先查看PCB集合中所有进程的状态,从中找出“就绪”状态但已换出的进程。当有许多这样的进程时,它将选择其中已换出到磁盘上时间最久(必须大于规定时间,如2 s)的进程作为换入进程,为它申请内存。如果申请成功,可直接将进程从外存调入内存;如果失败,则需先将内存中的某些进程换出,腾出足够的内存空间后,再将进程调入。
连续分配存储管理方式
单一连续分配:在单道程序环境下,当时的存储器管理方式是把内存分为系统区和用户区两部分,系统区仅提供给OS使用,它通常是放在内存的低址部分。而在用户区内存中,仅装有一道用户程序,即整个内存的用户空间由该程序独占。这样的存储器分配方式被称为单一连续分配方式。
优点:实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护(eg:早期的 PC 操作系统 MS-DOS)。
缺点:只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低。
-
内部碎片:分配给某进程的内存区域中,如果有些部分没有用上。
-
外部碎片:是指内存中的某些空闲分区由于太小而难以利用。
固定分区分配:20世纪60年代出现了支持多道程序的系统,为了能在内存中装入多道程序,且这些程序之间又不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式。(如有3个分区,允许多少个程序并发运行?3个)
- 划分分区的方法:(1) 分区大小相等(指所有的内存分区大小相等)。 (2) 分区大小不等。
分区大小相等:缺乏灵活性,但是很适合用于用一台计算机控制多个相同对象的场合(比如:钢铁厂有n个相同的炼钢炉,就可把内存分为n个大小相等的区域存放n个炼钢炉控制程序)
分区大小不等:增加了灵活性,可以满足不同大小的进程需求。根据常在系统中运行的作业大小情况进行划分(比如:划分多个小分区、适量中等分区、少量大分区)
- 内存分配:为了便于内存分配,通常将分区按其大小进行排队,并为之建立一张分区使用表,其中各表项包括每个分区的起始地址、大小及状态(是否已分配)。
当某用户程序要装入内存时,由操作系统内核程序根据用户程序大小检索分区使用表,从中找到一个能满足大小的、未分配的分区,将之分配给该程序,然后修改状态为“已分配”。
优点:实现简单,无外部碎片。
缺点:a. 当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采用覆盖技术来解决,但这又会降低性能;b. 会产生内部碎片,内存利用率低。
动态分区分配: 动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。
- 动态分区分配中的数据结构:常用的数据结构有以下两种形式:
- ① 空闲分区表,在系统中设置一张空闲分区表,用于记录每个空闲分区的情况。每个空闲分区占一个表目,表目中包括分区号、分区大小和分区始址等数据项。
- ② 空闲分区链。为了实现对空闲分区的分配和链接,在每个分区的起始部分设置一些用于控制分区分配的信息,以及用于链接各分区所用的前向指针,在分区尾部则设置一后向指针。通过前、后向链接指针,可将所有的空闲分区链接成一个双向链。
- 动态分区分配算法:动态分区分配又称可变分区分配,这种分区方法不预先将内存划分,而是在进程装入内存时,根据大小动态建立分区。因此系统中分区的大小和数目是可变的。
- 有多个足够大的空闲块时,为把一个新作业装入内存,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。由于内存分配算法对系统性能有很大的影响,故人们对它进行了较为广泛而深入的研究,于是产生了许多动态分区分配算法:
- (1)基于顺序搜索的动态分区分配算法(顺序分配算法)FF NF BF WF
- (2)基于索引搜索的动态分区分配算法(索引分配算法)快速适应算法 伙伴系统 哈希算法
- 有多个足够大的空闲块时,为把一个新作业装入内存,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。由于内存分配算法对系统性能有很大的影响,故人们对它进行了较为广泛而深入的研究,于是产生了许多动态分区分配算法:
① 首次适应(First Fit,FF)算法:
算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。
如何实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
我们以空闲分区链为例来说明采用FF算法时的分配情况。FF算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存空间,分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则表明系统中已没有足够大的内存分配给该进程,内存分配失败,返回。
② 循环首次适应(Next Fit,NF)算法
算法思想:首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。
如何实现:空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲。
为避免低址部分留下许多很小的空闲分区,以及减少查找可用空闲分区的开销,循环首次适应算法在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
循环首次适应算法每次都要从头查找,每次都需要检索低地址的小分区。但是这种规则也决定了当低地址部分有更小的分区可以满足需求时,会更有可能用到低地址部分的小分区,也会更有可能把高地址部分的大分区保留下来(最佳适应算法的优点)
邻近适应算法的规则可能会导致无论低地址、高地址部分的空闲分区都有相同的概率被使用,也就导致了高地址部分的大分区更可能被使用,划分为小分区,最后导致无大分区可用(最大适应算法的缺点)。
综合来看,四种算法中,首次适应算法的效果反而更好。
③ 最佳适应(Best Fit,BF)算法
算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区。
如何实现:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
所谓“最佳”是指,每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。为了加速寻找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
缺点:每次都选最小的分区进行分配,会留下越来越多的、很小的、难以利用的内存块。因此这种方法会产生很多的外部碎片。
④ 最坏适应(Worst Fit,WF)算法: 又称最大适应(Largest Fit)算法,空闲分区以容量递减的次序链接。
算法思想:为了解决最佳适应算法的问题——即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
由于最坏适应分配算法选择空闲分区的策略正好与最佳适应算法相反:它在扫描整个空闲分区表或链表时,总是挑选一个最大的空闲区,从中分割一部分存储空间给作业使用,以至于存储器中缺乏大的空闲分区,故把它称为是最坏适应算法。
缺点:每次都选最大的分区进行分配,虽然可以让分配后留下的空闲区更大,更可用,但是这种方式会导致较大的连续空闲区被迅速用完。如果之后有“大进程”到达,就没有内存分区可用了。
分页存储管理方式
(1) 分页存储管理方式:将用户程序的地址空间分为若干个固定大小的区域,称之为“页”或“页面”;也将内存空间分为若干个物理块或页框(frame),也和块的大小相同,然后可以放入,离散分配。
(2) 分段存储管理方式:把用户程序的地址空间分为若干个大小不同的段,每段可以定义一组完整的信息。存储器分配时,以段为单位,离散分配。
(3) 段页式存储管理方式:分页和分段两种存储管理方式相结合,具有两者优点,应用较广泛。
页面和物理块:
- (1) 页面:进程的地址空间—>页;内存空间相应分为若干个块。为进程分配内存时以块为单位。最后一页装不满一块,形成不可利用的碎片称之为“页内碎片”或“内碎片”。
- (2) 页面大小:若选择过小的页面,虽可减小内部碎片,有利于内存利用率提高,但每个进程占较多页面,导致页表过长,占用大量内存,降低页面换入/换出效率;如选择过大,虽可减少页面长度,提高页面换入/换出效率,但会是页内碎片增大。 页面大小选择应适中,应是2的幂,通常为1KB、2KB、4KB、8KB。
页面和物理块:将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”(页框=页帧=内存块=物理块=物理页面)。每个页框有一个编号,即“页框号”(页框号=页帧号=内存块号=物理块号=物理页号),页框号从0开始。
进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个“页”或“页面” 。每个页面也有一个编号,即“页号”,页号也是从0开始。
操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应的关系。各个页面不必连续存放,可以放到不相邻的各个页框中。
地址结构:分页地址中的逻辑地址结构如下:
地址结构包含两个部分:前一部分为页号,后一部分为页内偏移量 W。在上图所示的例子中,地址长度为 32 位,其中 0~11位 为“页内偏移量”,或称“页内地址”;12~31 位为“页号”。
如果有 K 位表示“页内偏移量”,则说明该系统中一个页面的大小是 2K个内存单元;如果有 M 位表示“页号”,则说明在该系统中,一个进程最多允许有 2M 个页面。
页表:在分页系统中,允许将进程的各个页离散地存储在内存的任一物理块中,为保证进程仍然能够正确地运行,即能在内存中找到每个页面所对应的物理块,系统又为每个进程建立了一张页面映像表,简称页表。
1) 一个进程对应一张页表
2) 进程的每个页面对应一个页表项
3) 每个页表项由“页号”和“块号”组成
4) 页表记录进程页面和实际存放的内存块之间的映射关系
5) 每个页表项的长度是相同的。
每个页表项多大?占几个字节?
Eg:假设某系统物理内存大小为 4GB,页面大小为 4KB,则每个页表项至少应该为多少字节?
内存块大小=页面大小=4KB= 212 B
4GB 的内存总共会被分为 232/ 212= 220个内存块
内存块号的范围应该是 0 ~ 220 -1
内存块号至少要用 20 bit 来表示
至少要用3B来表示块号(3*8=24bit)
由于页号是隐含的(即页号不占用存储空间),因此每个页表项占3B,存储整个页表至少需要 3*(n+1)B
基本的地址变换机构
进程在运行期间,需要对程序和数据的地址进行变换,即将用户地址空间中的逻辑地址变换为内存空间中的物理地址,由于它执行的频率非常高,每条指令的地址都需要进行变换,因此需要采用硬件来实现。页表功能是由一组专门的寄存器来实现的。一个页表项用一个寄存器。
基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F 和页表长度M。
进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。
注意:页面大小是2的整数幂,设页面大小为L,逻辑地址A到物理地址E的变换过程如下:
①计算页号 P 和页内偏移量W( 如果用十进制数手算,则 P=A/L,W=A%L;但是在计算机实际运行时,逻辑地址结构是固定不变的,因此计算机硬件可以更快地得到二进制表示的页号、页内偏移量)
②比较页号P 和页表长度M,若 P≥M,则产生越界中断,否则继续执行。(注意:页号是从0开始的,而页表长度至少是1,因此 P=M 时也会越界)
③页表中页号P对应的页表项地址 = 页表起始地址F + 页号P * 页表项长度,取出该页表项内容b,即为内存块号。(注意区分页表项长度、页表长度、页面大小的区别。页表长度指的是这个页表中总共有几个页表项,即总共有几个页;页表项长度指的是每个页表项占多大的存储空间;页面大小指的是一个页面占多大的存储空间)
④计算 E = b * L + W,用得到的物理地址E 去访存。(如果内存块号、页面偏移量是用二进制表示的,那么把二者拼接起来就是最终的物理地址了)
例:若页面大小L 为 1K 字节,页号2对应的内存块号 b = 8,将逻辑地址 A=2500 转换为物理地址E。等价描述:某系统按字节寻址,逻辑地址结构中,页内偏移量占10位,页号2对应的内存块号 b = 8,将逻辑地址 A=2500 转换为物理地址E。 (页面大小是多少?)
①计算页号、页内偏移量 页号P = A/L = 2500/1024 = 2; 页内偏移量 W = A%L = 2500%1024 = 452
②根据题中条件可知,页号2没有越界,其存放的内存块号 b = 8
③物理地址 E = b * L + W = 8 * 1024 + 425 = 8644
在分页存储管理(页式管理)的系统中,只要确定了每个页面的大小,逻辑地址结构就确定了。因此,页式管理中地址是一维的。即,只要给出一个逻辑地址,系统就可以自动地算出页号、页内偏移量 两个部分,并不需要显式地告诉系统这个逻辑地址中,页内偏移量占多少位。
具有快表的地址变换机构
由于页表是存放在内存中的,这使CPU在每存取一个数据时,都要两次访问内存。第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,以形成物理地址。第二次访问内存时,才是从第一次所得地址中获得所需数据(或向此地址中写入数据)。因此,采用这种方式将使计算机的处理速度降低近1/2。可见,以此高昂代价来换取存储器空间利用率的提高,是得不偿失的。
快表:又称联想寄存器(TLB, translation lookaside buffer ),是一种访问速度比内存快很多的高速缓存(TLB不是内存!),用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。
① CPU给出逻辑地址,由某个硬件算得页号、页内偏移量,将页号与快表中的所有页号进行比较。
② 如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接从中取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表命中,则访问某个逻辑地址仅需一次访存即可。
③ 如果没有找到匹配的页号,则需要访问内存中的页表,找到对应页表项,得到页面存放的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表未命中,则访问某个逻辑地址需要两次访存(注意:在找到页表项后,应同时将其存入快表,以便后面可能的再次访问。但若快表已满,则必须按照一定的算法对旧的页表项进行替换)
访问内存的有效时间
从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需要花费的总时间,称为内存的有效访问时间(Effective Access Time,EAT)。假设访问一次内存的时间为t,在基本分页存储管理方式中,有效访问时间分为第一次访问内存时间(即查找页表对应的页表项所耗费的时间t)与第二次访问内存时间(即将页表项中的物理块号与页内地址拼接成实际物理地址所耗费的时间t)之和: EAT = t + t = 2t
在引入快表的分页存储管理方式中,通过快表查询,可以直接得到逻辑页所对应的物理块号,由此拼接形成实际物理地址,减少了一次内存访问,缩短了进程访问内存的有效时间。但是,由于快表的容量限制,不可能将一个进程的整个页表全部装入快表,所以在快表中查找到所需表项存在着命中率的问题。所谓命中率,是指使用快表并在其中成功查找到所需页面的表项的比率。这样,在引入快表的分页存储管理方式中,有效访问时间的计算公式即为:
EAT=а×λ+(t+λ)(1—а)+t=2t+λ-t×а
上式中,λ表示查找快表所需要的时间,а表示命中率,t表示访问一次内存所需要的时间。
习题
1、在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是( B)。
A. 编辑 B. 编译 C. 链接 D. 装载
覆盖与交换技术的目的是(节省主存空间)。{覆盖和交换的提出就是为了解决主存空间不足的问题,但不是在物理上扩充主存,只是将暂时不用的部分换出主存,以节省空间,从而在逻辑上扩冲主页。}
段页式存储管理中,地址引射表是(每个进程一张段表,每个段一个页表)(进程首先划分为段,再进一步划分为页)
内存保护需要由(操作系统和硬件)完成,以保证进程地址空间不被非法访问。
2、分区分配内存管理方式的主要保护措施是( A )。
A. 界地址保护 B.程序代码保护 C. 数据保护 D. 栈保护
每个进程都拥有自己独立的进程空间,若一个进程在运行时所产生的地址在其地址空间之外,则发生地址越界,因此需要进行界地址保护,即当程序要访问某个内存单元时,由硬件检查是否允许,若允许则执行,否则产生地址越界中断。
3、某基于动态分区存储管理的计算机,其主存容量为55MB(初始为空),采用最佳适配(Best Fit)算法,分配和释放的顺序为:分配15MB,分配30MB,释放15MB,分配8MB,分配6MB,此时主存中最大空闲分区的大小是(B )。
A. 7MB B. 9MB C. 10MB D. 15MB
4、动态重定位是在作业的( D )中进行的。
A. 编译过程 B.装入过程 C.链接过程 D.执行过程
动态重定位是指在执行时再决定装入的地址并装入,装入后有可能会换出,所以同一个模块在内存中的物理地址是可能改变的。
动态重定位是指在作业运行过程中执行到一条访存指令时,再把逻辑地址转换为主存中的物理地址,实际中是通过硬件地址转换机制实现的。
动态分区又称为可变式分区,它是系统运行过程中(作业装入时)动态建立的。
采用页式存储管理,所划分的页面大小(必须相同)
对主存储器的访问,(以字节或字为单位)
在分页存储管理中,主存的分配(以物理块为单位进行)
段页式取一次数据需要访存3次,段式2次。
分页存储中,每个进程拥有一张页表,且进程的页表驻留在内存中。执行哪个进程才会把它的数据装入页表寄存器。
不会产生内部碎片的存储管理是(分段式存储管理)。{ 固定分区、段页式存储、分页存储有内部碎片,分段管理有外部碎片}
装载时逻辑地址换为物理地址。
下面的存储管理方案中,(固定分区)可以采用静态重定位。
1.在存储管理方案中,(A)可采用覆盖技术。
A.单一连续存储管理 B.可变分区存储管理
C.段式存储管理 D.段页式存储管理
2.把作业空间中使用的逻辑地址变为内存中物理地址称为(B)。
A.加载 B.重定位 C.物理化 D.逻辑化
1.某个操作系统对内存的管理采用页式存储管理方法,所划分的页面大小( B )。
A.要根据内存大小而定 B.必须相同 C.要根据CPU的地址结构 D.要依据外存和内存的大小
2.在分页存储管理中,主存的分配是( A )。
A.以物理块为单位进行 B.以作业的大小分配
C.以物理段为进行分配 D.以逻辑记录大小进行分配
1.分页系统中的页面是为( B )。
A.用户所感知的 B.操作系统所感知的
C.编译系统所感知的 D.连接装配程序所感知的
2.首次适应算法的空闲分区是(C )。
A.按大小递减顺序连在一起 B.按大小递增顺序连在一起
C.按地址由小到大排列 D.按地址由大到小排列
快表局部性原理【考点】
什么时候快表中有内容,为什么有快表【考点】
由于查询快表的速度比查询页表的速度快很多,因此只要快表命中,就可以节省很多时间。因为局部性原理,一般来说快表的命中率可以达到 90% 以上。
例:某系统使用基本分页存储管理,并采用了具有快表的地址变换机构。访问一次快表耗时 1us,访问一次内存耗时100us。若快表的命中率为 90%,那么访问一个逻辑地址的平均耗时是多少?
(1+100) * 0.9 + (1+100+100) * 0.1 = 111 us
有的系统支持快表和慢表同时查找,如果是这样,平均耗时应该是 (1+100) * 0.9 + (100+100) * 0.1 =110.9 us
若未采用快表机制,则访问一个逻辑地址需要 100+100 = 200us
显然,引入快表机制后,访问一个逻辑地址按地址由小到大排列的速度快多了。
时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)
基本地址变换机构中,每次要访问一个逻辑地址,都需要查询内存中的页表。由于局部性原理,可能连续很多次查到的都是同一个页表项。
在有快表的的段页式存储管理中,如何实现逻辑地址到物理地址的变化【考点】
快表放在哪里【考点】
具有快表的地址变换机构:由于页表是存放在内存中的,这使CPU在每存取一个数据时,都要两次访问内存。第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,以形成物理地址。第二次访问内存时,才是从第一次所得地址中获得所需数据(或向此地址中写入数据)。因此,采用这种方式将使计算机的处理速度降低近1/2。可见,以此高昂代价来换取存储器空间利用率的提高,是得不偿失的。
快表用于(地址变换)。
快表:又称联想寄存器(TLB, translation lookaside buffer ),是一种访问速度比内存快很多的高速缓存存储器(TLB不是内存!),用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。
① CPU给出逻辑地址,由某个硬件算得页号、页内偏移量,将页号与快表中的所有页号进行比较。
② 如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接从中取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表命中,则访问某个逻辑地址仅需一次访存即可。
③ 如果没有找到匹配的页号,则需要访问内存中的页表,找到对应页表项,得到页面存放的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表未命中,则访问某个逻辑地址需要两次访存(注意:在找到页表项后,应同时将其存入快表,以便后面可能的再次访问。但若快表已满,则必须按照一定的算法对旧的页表项进行替换)
在引入快表的分页存储管理方式中,通过快表查询,可以直接得到逻辑页所对应的物理块号,由此拼接形成实际物理地址,减少了一次内存访问,缩短了进程访问内存的有效时间。但是,由于快表的容量限制,不可能将一个进程的整个页表全部装入快表,所以在快表中查找到所需表项存在着命中率的问题。所谓命中率,是指使用快表并在其中成功查找到所需页面的表项的比率。这样,在引入快表的分页存储管理方式中,有效访问时间的计算公式即为:
EAT=а×λ+(t+λ)(1—а)+t=2t+λ—t×а
上式中,λ表示查找快表所需要的时间,а表示命中率,t表示访问一次内存所需要的时间。
第六章 虚拟存储器
虚拟存储器的三个主要特征是什么【考点】
-
多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
-
对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
-
虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。
虚拟存储器局部性原理【考点】
时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的,并且程序的指令也是顺序地在内存中存放的)
页面置换算法【考点】
- 最佳置换算法(OPT,Optimal):每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。
最佳置换算法可以保证最低的缺页率,但实际上,只有在进程执行的过程中才能知道接下来会访问到的是哪个页面。操作系统无法提前预判页面访问序列。因此,最佳置换算法是无法实现的。
- 先进先出置换算法(FIFO):每次选择淘汰的页面是最早进入内存的页面
实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可。
队列的最大长度取决于系统为进程分配了多少个内存块。
- 最近最久未使用置换算法(LRU,least recently used):每次淘汰的页面是最近最久未使用的页面
实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t。
当需要淘汰一个页面时,选择现有页面中 t 值最大的,即最近最久未使用的页面。
-
时钟置换算法(CLOCK):为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需检查页的访问位。 如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK 算法选择一个淘汰页面最多会经过两轮扫描)
-
改进型的时钟置换算法
简单的时钟置换算法仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过, 就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。
因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。这就是改进型的时钟置换算法的思想。 修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。
为方便讨论,用(访问位,修改位)的形式表示各页面状态。如(1,1)表示一个页面近期被访问过, 且被修改过。
抖动”与工作集
刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)。为进程分配的物理块太少,会使进程发生抖动现象。为进程分配的物理块太多,又会降低系统整体的并发度,降低某些资源的利用率。
驻留集:指请求分页存储管理中给进程分配的内存块的集合。
工作集:指在某段时间间隔里,进程实际访问页面的集合。
操作系统会根据“窗口尺寸”来算出工作集。
例: 某进程的页面访问序列如下,窗口尺寸为 4,各时刻的工作集为?
(24,15,18,23,)24,17,18,24,18,17,17,15
工作集大小可能小于窗口尺寸,实际应用中,操作系统可以统计进程的工作集大小,根据工作集大小给进程分配若干内存块。如:窗口尺寸为5,经过一段时间的监测发现某进程的工作集最大为3,那么说明该进程有很好的局部性,可以给这个进程分配3个以上的内存块即可满足进程的运行需要。
一般来说,驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页。
1.下列关于虚拟存储器的叙述中,正确的是(B )。
A. 虚拟存储只能基于连续分配技术 B.虚拟存储只能基于非连续分配技术
C. 虚拟存储容量只受外存容量的限制 D.虚拟存储容量只受内存容量的限制
解析
采用连续分配方式时,会使相当一部分内存空间都处于暂时或”永久“的空闲状态,造成内存资源的严重浪费,也无法从逻辑上扩大内存容量,因此虚拟内存的实现只能建立在离散分配的内存管理的基础上。有以下三种实现方式:请求分页;请求分段;请求段页式。
虚存的实际容量受外存和内存容量之和限制,虚存的最大容量是由计算机的地址位数决定的。
2.在缺页处理过程中,操作系统执行的操作可能是( D)。
(1)修改页表 (2)磁盘I/O (3)分配页框
A. 仅(1)、(2) B.仅(2)
C. 仅(3) D.(1)、(2)、(3)
虚拟存储技术是(补充内存逻辑空间的技术)
以下不属于虚拟内存特征的是(A)
A.一次性(传统存储系统的特征) B.多次性 C.对换性 D.离散性
请求分页存储方式和基本分页存储方式的区别:前者不必将作业全部装入内存
虚拟存储管理系统的基础是程序(局部性理论)
请求分页存储管理的主要特点是(扩充了内存)
只有先进先出算法会产生Belady异常。
第七章 文件管理(选择+判断)
文件目录文件系统(选择+判断)
文件——就是一组有意义的信息/数据集合
文件的属性:
文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件。
标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。(不向用户展示)
类型:指明文件的类型
位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
大小:指明文件大小
创建时间、上次修改时间
文件所有者信息
保护信息:对文件进行保护的访问控制信息
文件应如何存放在外存?
与内存一样,外存也是由一个个存储单元组成的,每个存储单元可以存储一定量的数据(如1B)。每个存储单元对应一个物理地址。
类似于内存分为一个个“内存块”,外存会分为一个个“块/磁盘块/物理块”。每个磁盘块的大小是相等的,每块一般包含2的整数幂个地址。
操作系统以“块”为单位为文件分配存储空间,因此即使一个文件大小只有10B,但它依然需要占用1KB的磁盘块。外存中的数据读入内存时同样以块为单位。
数据项、记录和文件
数据项:在文件系统中,数据项是最低级的数据组织形式,可把它分成以下两种类型:(1) 基本数据项。 (2) 组合数据项。
记录:是一组相关数据项的集合,用于描述一个对象在某方面的属性。一个记录应包含哪些数据项,取决于需要描述对象的哪个方面。由于对象所处的环境不同可把他作为不同的对象。
文件:文件是指由创建者所定义的、具有文件名的一组相关元素的集合,可分为有结构文件和无结构文件两种。
文件类型
按用途分类,根据文件的性质和用途的不同,可将文件分为三类:
(1) 系统文件,这是指由系统软件构成的文件。大多数的系统文件只允许用户调用,但不允许用户去读,更不允许修改;有的系统文件不直接对用户开放。
(2) 用户文件,指由用户的源代码、目标文件、可执行文件或数据等所构成的文件。用户将这些文件委托给系统保管。
(3) 库文件,这是由标准子例程及常用的例程等所构成的文件。这类文件允许用户调用,但不允许修改。
按文件中数据的形式分类,按这种方式分类,也可把文件分为三类:
(1) 源文件,这是指由源程序和数据构成的文件。通常,由终端或输入设备输入的源程序和数据所形成的文件都属于源文件。它通常是由ASCII码或汉字所组成的。
(2) 目标文件,这是指把源程序经过编译程序编译过,但尚未经过链接程序链接的目标代码所构成的文件。目标文件所使用的后缀名是“.obj”。
(3) 可执行文件,这是指把编译后所产生的目标代码经过链接程序链接后所形成的文件。其后缀名是 .exe。
按存取控制属性分类。根据系统管理员或用户所规定的存取控制属性,可将文件分为三类:
(1) 只执行文件,该类文件只允许被核准的用户调用执行,不允许读和写。
(2) 只读文件,该类文件只允许文件主及被核准的用户去读,不允许写。
(3) 读写文件,这是指允许文件主和被核准的用户去读或写的文件。
按组织形式和处理方式分类。根据文件的组织形式和系统对其处理方式的不同,可将文件分为三类: (1) 普通文件。 (2) 目录文件。 (3) 特殊文件。
文件系统的层次结构
文件系统的模型可分为三个层次:最底层是对象及其属性,中间层是对对象进行操纵和管理的软件集合,最高层是文件系统提供给用户的接口。
对象及其属性:
文件管理系统管理的对象如下: (1) 文件。 (2) 目录。 (3) 磁盘(磁带)存储空间。
对对象操纵和管理的软件集合:
该层是文件管理系统的核心部分。文件系统的功能大多是在这一层实现的,其中包括有:① 对文件存储空间的管理;② 对文件目录的管理;③ 用于将文件的逻辑地址转换为物理地址的机制;④ 对文件读和写的管理;⑤ 对文件的共享与保护等功能。在实现这些功能时,OS通常都采取了层次组织结构,即在每一层中都包含了一定的功能,处于某个层次的软件,只能调用同层或更低层次中的功能模块。
文件系统的接口:
为方便用户的使用,文件系统以接口的形式提供了一组对文件和记录操作的方法和手段。通常是下面两种类型的接口:(1) 命令接口,是指作为用户与文件系统直接交互的接口,用户可通过键盘终端键入命令取得文件系统的服务。(2) 程序接口,是指作为用户程序与文件系统的接口,用户程序可通过系统调用取得文件系统的服务,例如,用于创建文件的系统调用Creat,用于打开一个文件的系统调用Open等。
文件的逻辑结构
系统中的所有文件都存在着以下两种形式的文件结构:
(1) 文件的逻辑结构(File Logical Structure):从用户角度出发所观察到的文件组织形式。
(2) 文件的物理结构,又称为文件的存储结构:是指系统将文件存储在外存上所形成的一种存储组织形式,是用户看不见的。
按文件是否有结构分类,可以分为无结构文件、有结构文件两种。
- 按文件是否有结构分类
(1) 无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如:Windows操作系统中的.txt文件。如果说在大量的信息管理系统和数据库系统中,广泛采用了有结构的文件形式的话(即文件是由定长或变长记录构成的),那么在系统中运行的大量的源程序、可执行文件、库函数等,所采用的就是无结构的文件形式,即流式文件。其文件的长度是以字节为单位的。对流式文件的访问,则是利用读、写指针来指出下一个要访问的字符。可以把流式文件看做是记录式文件的一个特例:一个记录仅有一个字节。
2) 有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。如:数据库表文件。一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的ID)根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种。
2. 按文件的组织方式分类
根据有结构文件中的各条记录在逻辑上如何组织,可把有结构文件分为三类:(1) 顺序文件。(2) 索引文件。(3) 索引顺序文件。
文件目录
这种目录结构对于用户来说的好处: (1) 实现“按名存取”。 (2) 提高对目录的检索速度。 (3) 文件共享。 (4) 允许文件重名。
文件控制块FCB(File Control Block):为了能对系统中的大量文件施以有效的管理,在文件控制块中,通常应含有三类信息,即基本信息、存取控制信息及使用信息。
FCB实现了文件名和文件之间的映射。使用户(用户程序)可以实现“按名存取”。
FCB 的有序集合称为“文件目录”,一个FCB就是一个文件目录项。FCB 中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)。最重要,最基本的还是 文件名、文件存放的物理地址。
设当前工作目录的主要目的是(C)
A.节省外存空间 B.节省内存空间 C.加快文件的检索速度 D.加快文件的读/写速度
文件系统中,文件访问控制信息存储的合理位置(A)
A.文件控制块 B.文件分配表 C.用户口令表 D.系统注册表
1.设当前工作目录的主要目的是( C )。
A. 节省外存空间 B. 节省内存空间
C. 加快文件的检索速度 D. 加快文件的读/写速度
2.文件系统中,文件访问控制信息存储的合理位置是( A )。
A. 文件控制块 B. 文件分配表
C. 用户口令表 D. 系统注册表
3.下列文件物理结构中,适合随机访问且易于文件扩展的是( B )。
A. 连续结构 B. 索引结构
C. 链式结构且磁盘块定长 D. 链式结构且磁盘块变长
UNIX OS中,输入输出设备被视为(特殊文件)
文件系统创建文件时,为它创建一个(文件目录项FCB)
打开文件的主要工作是(把指定文件的目录复制到内存的指定区域)
(链接分配)不利于直接存取的外存分配方式。
(连续结构)不利于文件长度动态增长。
(顺序存储)容易导致内存碎片(外部碎片)的产生。
链式方式不能实现随机访问,连续不易于扩展,因此随机访问且易于访问是(索引方式)的特性。
支持文件长度可变,随机访问磁盘存储空间的分配方式是(索引分配)
某文件系统为一级目录结构,文件的数据一次性写入磁盘,已写入的文件不可修改,但可多次创建新文件。请回答如下问题:
(1)在连续、链式、索引三种文件的数据块组织方式中,哪种更合适?请说明理由。为定位文件数据块,需要FCB中设计哪些相关描述字段?
(2)为快速找到文件,对于FCB,是集中存储好,还是与对应的文件数据块连续存储好?请说明理由。
(1)连续更合适,因为一次性写入不存在插入问题,连续的数据块组织方式完全可以满足一次性写入磁盘。同时连续文件组织方式减少了其他不必要的空间开销,而连续的组织方式顺序查找读取速度是最快的。
(2)FCB集中存储好。目录是存在磁盘上的。所以检索 目录的时候需要访问磁盘。速度很慢∶集中存储是将文件控制块的一一部分数据分解出夫,存在另一一个数据结构中,而在目录中仅留下文件的基本信息和指向该数据结构的指针, 这样来就有效地缩短减少了目录的体积,减少了目录在磁盘中的块数。检素目录时读取磁盘的次数也减小。就加快了检索目录的次数。
第八章 输入输出系统(选填)
I/O系统接口
在I/O系统与高层之间的接口中,根据设备类型的不同,又进一步分为若干个接口。
块设备接口:(1) 块设备。 (2) 隐藏了磁盘的二维结构。 (3) 将抽象命令映射为低层操作。
流设备接口:流设备接口是流设备管理程序与高层之间的接口。该接口又称为字符设备接口,它反映了大部分字符设备的本质特征,用于控制字符设备的输入或输出。 (1) 字符设备。 (2) get和put操作。 (3) in-control指令。
网络通信接口:在现代OS中,都提供了面向网络的功能。但首先还需要通过某种方式把计算机连接到网络上。同时操作系统也必须提供相应的网络软件和网络通信接口,使计算机能通过网络与网络上的其它计算机进行通信或上网浏览。
I/O设备一般是由执行I/O操作的机械部分和执行控制I/O的电子部件组成。
I/O设备的类型:1) 按使用特性分类 2) 按传输速率分类 3)按信息交换的单位分类
I/O系统的层次结构以及其作用【考点】
通常把I/O 软件组织成四个层次:
IO设备类型按信息交换的单位分类:【考点】
字符设备:打印机,交互式终端机
块设备:磁盘
磁盘调度算法【考点】
- 先来先服务(FCFS):根据进程请求访问磁盘的先后次序进行调度。
- 最短寻道时间优先(SSTF):其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种算法不能保证平均寻道时间最短。
- 扫描(SCAN)算法:SSTF算法的实质是基于优先级的调度算法,因此就可能导致优先级低的进程发生“饥饿”(Starvation)现象。因为只要不断有新进程的请求到达,且其所要访问的磁道与磁头当前所在磁道的距离较近,这种新进程的I/O请求必然优先满足。在对SSTF算法略加修改后,则可防止低优先级进程出现“饥饿”现象。
- 循环扫描(CSCAN)算法:SCAN算法既能获得较好的寻道性能,又能防止“饥饿”现象,故被广泛用于大、中、小型机器和网络中的磁盘调度。但也存在这样的问题:当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完处于外面的所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被大大地推迟。
对I/O设备进行控制【考点】
对I/O设备进行控制是驱动程序的功能。目前对I/O设备有四种控制方式:① 采用轮询的可编程I/O方式;② 采用中断的可编程I/O方式;③ 直接存储器访问方式;④ I/O通道方式。
进程之间的切换是通过中断来完成的。
当一个进程请求I/O 操作时,该进程将被挂起,直到I/O设备完成I/O操作后,设备控制器便向CPU发送一个中断请求,CPU响应后便转向中断处理程序,中断处理程序执行相应的处理,处理完后解除相应进程的阻塞状态。
设备驱动程序
常用的IO控制方式是中断驱动和DMA方式。【考点】
应用程序中所用的设备,不局限于使用某个具体的物理设备。为每个设备所配置的设备驱动程序是与硬件紧密相关的软件。【考点】
计算机上会有打印机扫描仪是否需要配备驱动程序?如果给出不同设备,驱动程序应该有还是没有,如果有需要几种驱动设备?
每类设备配置一个设备驱动程序。
在早期OS中,应用程序在使用I/O设备时,都使用设备的物理名称,这使应用程序与系统中的物理设备直接相关。
为了实现与设备的无关性而引入了逻辑设备和物理设备两个概念。逻辑设备是抽象的设备名。
在应用程序中,用逻辑设备名称使用设备虽然方便了用户,但系统却只识别物理设备名称,因此在实际执行时,还必须使用物理名称。为此,在系统中,必须具有将逻辑设备名称转换为某物理设备名称的功能。
设备分配的三种方式:独占设备、共享设备、虚拟设备。【考点】
分区分配不是设备分配的方式。
打印机、磁带机不属于共享设备。磁盘属于共享设备。
(可寻址)是块设备的基本特征。
虚拟设备是靠(SPOOLing)技术实现的。它可以将独占设备改为共享设备,目的是提高系统资源/独占设备的利用率。
共享设备是指一段时间内允许多个进程同时访问的设备。
分享共享设备是不会引起进程死锁的。
共享设备必须是可寻址和可随机访问的设备。
虚拟设备是指(把一个物理设备变换称多个对应的逻辑设备)。
DMA方式是磁盘设备IO控制的主要方式。
DMA方式是为(IO设备和主存)直接建立一条是直接数据通路。
第九章 磁盘存储器管理
外存的组织方式【考点】
文件的物理结构直接与外存的组织方式有关。对于不同的外存组织方式,将形成不同的文件物理结构。目前常用的外存组织方式有:
(1) 连续组织方式。(2) 链接组织方式。(3) 索引组织方式。
下列文件物理结构中,适合随机访问且易于文件扩展的是(B)
A. 连续结构 B.索引结构 c.链式结构且磁盘块定长 D.链式结构且磁盘块变长
磁盘和文件不同组织方式的优缺点(选填)【考点】
连续组织方式的主要优点有:(1) 顺序访问容易。 (2) 顺序访问速度快。
连续组织方式的主要缺点如下:(1) 要求为一个文件分配连续的存储空间。(2) 必须事先知道文件的长度。(3) 不能灵活地删除和插入记录。(4) 对于那些动态增长的文件。
链接组织方式的主要优点是:(1) 消除了磁盘的外部碎片,提高了外存的利用率。 (2) 对插入、删除和修改记录都非常容易。 (3) 能适应文件的动态增长,无需事先知道文件的大小。
【缓存技术】:缓冲池存在 主存当中【考点】(单向双向)
- 缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。
多级索引方式【可能考点】
在为一个大文件分配磁盘空间时,如果所分配出去的盘块的盘块号已经装满一个索引块时,OS须再为该文件分配另一个索引块,用于将以后继续为之分配的盘块号记录于其中。依此类推,再通过链指针将各索引块按序链接起来。
数据的一致性控制:事务
磁盘设备的 I/O 控制主要是采取( D )方式。【考点】
A、位
B、字节
C、帧
D、DMA
简答题
1、创建一个进程的时候操作系统需要做什么内容?(简答题)
进程是由创建而产生。创建一个进程是个很复杂的过程,一般要通过多个步骤才能完成:如首先由进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后,把该进程转入就绪状态并插入就绪队列之中。但如果进程所需的资源尚不能得到满足,比如系统尚无足够的内存使进程无法装入其中,此时创建工作尚未完成,进程不能被调度运行,于是把此时进程所处的状态称为创建状态。(ppt第二章23页)
在系统中每当出现了创建新进程的请求后,OS便调用进程创建原语Creat按下述步骤创建一个新进程:(ppt第二章52)
- 申请空白PCB,为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
- 为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等。
- 初始化进程控制块(PCB)。
- 如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。
2、操作系统内核以及内核的主要功能(简答题)【考点】
一个更好的类比是将内核视为汽车的引擎,将操作系统视为汽车。
我们不能驾驶发动机,但我们也不能在没有发动机的情况下驾驶汽车。我们需要有轮胎、转向系统和其他组件才能把它变成一辆可以驾驶的汽车。同样,我们不能直接使用内核。我们需要 shell,然后是其他工具和组件才能使用操作系统。
内核是计算机上配置的底层软件, 是操作系统最基本, 最核心的部分;
实现操作系统内核功能的那些程序就是内核程序
内核功能
- 接近硬件
- 时钟管理, 中断处理, 原语(设备驱动, CPU 切换)
- 原语最接近硬件的部分, 这种程序的运行具有原子性, 运行短, 调用频繁
- 时钟管理, 中断处理, 原语(设备驱动, CPU 切换)
- 接近上层
- 进程管理, 存储器管理, 设备管理等… (不同操作系统划分不同)
3、临界区实现同步机制依赖哪些准则 【考点】
为实现进程互斥地进入自己的临界区,可用软件方法,更多的是在系统中设置专门的同步机构来协调各进程间的运行。所有同步机制都应遵循下述四条准则:
- 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
- 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。
- 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
- 让权等待:当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
否则会怎么样
4、程序向内存装入时有哪几种方式装入内存【考点】
- 绝对装入(Absolute Loading Mode)
- 当计算机系统很小,且仅能运行单道程序时,完全有可能知道程序将驻留在内存的什么位置。此时可以采用绝对装入方式。用户程序经编译后,将产生绝对地址(即物理地址)的目标代码。
- 编译、链接后得到的装入模块的指令直接就使用了绝对地址。
- 可重定位装入(Relocation Loading Mode)
- 绝对装入方式只能将目标模块装入到内存中事先指定的位置,这只适用于单道程序环境。而在多道程序环境下,编译程序不可能预知经编译后所得到的目标模块应放在内存的何处。因此,对于用户程序编译所形成的若干个目标模块,它们的起始地址通常都是从0开始的,程序中的其它地址也都是相对于起始地址计算的。
- 又称静态重定位。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。
- 静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。
- 动态运行时的装入(Dynamic Run-time Loading)
- 可重定位装入方式可将装入模块装入到内存中任何允许的位置,故可用于多道程序环境。但该方式并不允许程序运行时在内存中移动位置。
- 动态重定位:又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
装入:装入程序将装入模块装入内存。此阶段将程序的逻辑地址变换为程序的物理地址。
程序的装入有三种方式:
(1)绝对装入
绝对装入方式只适用于单道程序环境。在编译时,若知道程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际内存地址完全相同,因此不需对程序和数据的地址进行修改。另外,程序中所用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中采用的是符号地址,编译或汇编时再转换为绝对地址。
(2)可重定位装入
在多道程序环境下,多个目标模块的起始地址通常都从0开始,程序中的其他地址都是相对于起始地址的,此时应采用可重定位装入方式。根据内存的当前情况,将装入模块装入内存的适当位置。在装入时对目标程序中指令和数据地址的修改过程称为重定位,又因为地址变换通常是在进程装入时一次完成的,故称为静态重定位,如图3.2(a)所示。当一个作业装入内存时,必须给它分配要求的全部内存空间,若没有足够的内存,则无法装入。此外,作业一旦进入内存,整个运行期间就不能在内存中移动,也不能再申请内存空间。
(3)动态运行时装入也称动态重定位。程序在内存中若发生移动,则需要采用动态的装入方式。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持,如图 3.2(b)所示。
动态重定位的优点:可以将程序分配到不连续的存储区;在程序运行之前可以只装入部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享。
这种地址转换推迟到程序真正要执行时才进行,需要重定位寄存器的支持
【注 1】整个系统只有一个重定位寄存器。
【注 2】程序中所使用的绝对地址(物理地址、实地址),可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中釆用的是符号地址(逻辑地址、虚拟地址),编译或汇编时再转换为绝对地址。(程序中使用符号名来访问存储单元,而符号名存储的是逻辑地址,而逻辑地址能够转化为物理地址)
计算题
调度算法 或 页面置换算法 与 常见linux命令的使用
相关文章:
期末速成复习资料——操作系统
体型:选择20判断10填空10*2简答4*5计算2*10 第一章 在一个计算机系统中,通常都含有多种硬件和软件资源。归纳起来可将这些资源分为四类:处理机、存储器、I/O设备以及文件(数据和程序)。相应地,OS的主要功能…...
Android之Service与IntentService区别
目录 Service特点使用场景示例 IntentService特点使用场景示例 区别总结线程管理:生命周期:使用场景:自动停止: 总结 在Android开发中,Service是一个可以在后台执行长时间运行操作的组件。主要有两种类型的Service&…...
【MySQL】表的设计
系列文章目录 第一章 数据库基础 第二章 数据库基本操作 第三章数据库约束 文章目录 系列文章目录前言一、表的设计二、表的关系总结 前言 在前文中,我们学会了基本的CRUD操作,对数据库中的数据进行约束以提高数据库的准确性。接下来介绍的表的设计就是…...
NC 用两个栈实现队列
系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 用两个栈来实…...
用后端实现一个简单的登录模块2 前端页面
该模块能做到的功能: 1阶:输入账号和密码,输入正确即可返回登录成功的信息,反之则登录失败 2阶:有简单的前端页面,有登录成功和失败的弹窗,还有登录成功的主页面 3阶:前端页面的注…...
MySQL慢查询的查找语法
一、引言 数据库查询快慢是影响项目性能的一大因素,对于数据库,我们除了要优化SQL,更重要的是得先找到需要优化的SQL语句。 性能优化的思路 首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句其次使用explain命令去查…...
SQL中的聚合方法与Pandas的对应关系
在SQL和Pandas中,聚合方法是用来对数据进行汇总统计的重要工具。下面是SQL中的各种聚合方法及其与Pandas中相应操作的对应关系: 1. COUNT SQL: COUNT(*) 返回表中的行数。COUNT(column) 返回指定列中非空值的数量。 Pandas: count() 方法用于计算非空值…...
计算机毕业设计选题推荐-计算中心高性能集群共享平台-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
仿RabbitMq实现简易消息队列基础篇(future操作实现异步线程池)
TOC 介绍 std::future 是C11标准库中的一个模板类,他表示一个异步操作的结果,当我们在多线程编程中使用异步任务时,std::future可以帮助我们在需要的时候,获取任务的执行结果,std::future 的一个重要特性是能…...
经典算法题总结:数组常用技巧(双指针,二分查找和位运算)篇
双指针 在处理数组和链表相关问题时,双指针技巧是经常用到的,双指针技巧主要分为两类:左右指针和快慢指针。所谓左右指针,就是两个指针相向而行或者相背而行;而所谓快慢指针,就是两个指针同向而行…...
版本控制基础理论
一、本地版本控制 在本地记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人使用,如RCS. 二、集中式版本控制(代表SVN) 所有的版本数据都保存在服务器上,协同开发者从…...
微分方程(Blanchard Differential Equations 4th)中文版Section1.4
1.4 NUMERICAL TECHNIQUE: EULER’S METHOD 上一节中讨论的斜率场的几何概念与近似微分方程解的基本数值方法密切相关。给定一个初值问题 d y d t = f ( t , y ) , y ( t 0 ) = y 0 , \frac{dy}{dt}=f(t,y), \quad y(t_0) = y_0, dtdy=f(t,y),y(t0)=y0, 我们可以通过首…...
求职Leetcode算法题(7)
1.搜索旋转排序数组 这道题要求时间复杂度为o(log n),那么第一时间想到的就是二分法,二分法有个前提条件是在有序数组下,我们发现在这个数组中存在两部分是有序的,所以我们只需要对前半部分和后半部分分别…...
ActiveMQ、RabbitMQ、Kafka、RocketMQ在事务性消息、性能、高可用和容错、定时消息、负载均衡、刷盘策略的区别
ActiveMQ、RabbitMQ、Kafka、RocketMQ这四种消息队列在事务性消息、性能、高可用和容错、定时消息、负载均衡、刷盘策略等方面各有其特点和差异。以下是对这些方面的详细比较: 1. 事务性消息 ActiveMQ:支持事务性消息。ActiveMQ可以基于JMS(…...
HanLP分词的使用与注意事项
1 概述 HanLP是一个自然语言处理工具包,它提供的主要功能如下: 分词转化为拼音繁转简、简转繁提取关键词提取短语提取词语自动摘要依存文法分析 下面将介绍其分词功能的使用。 2 依赖 下面是依赖的jar包。 <dependency><groupId>com.ha…...
Python 的进程、线程、协程的区别和联系是什么?
一、区别 1. 进程 • 定义:进程是操作系统分配资源的基本单位。 • 资源独立性:每个进程都有独立的内存空间,包括代码、数据和运行时的环境。 • 并发性:可以同时运行多个进程,操作系统通过时间片轮转等方式在不同…...
实时数据推送:Spring Boot 中两种 SSE 实战方案
在 Web 开发中,实时数据交互变得越来越普遍。无论是股票价格的波动、比赛比分的更新,还是聊天消息的传递,都需要服务器能够及时地将数据推送给客户端。传统的 HTTP 请求-响应模式在处理这类需求时显得力不从心,而服务器推送事件&a…...
数据守护者:SQL一致性检查的艺术与实践
标题:数据守护者:SQL一致性检查的艺术与实践 在数据驱动的商业世界中,数据的一致性是确保决策准确性和业务流程顺畅的关键。SQL作为数据查询和操作的基石,提供了多种工具来维护数据的一致性。本文将深入探讨如何使用SQL进行数据一…...
jenkins配置+vue打包多环境切换
jenkins配置流水线过程 1.新建item 加入相关的参数就行了。 流水线脚本设置 后端脚本 node {stage checkoutsh"""#每次打包清空工作空间目录rm -rf $workspace/*cd $workspace#到工作空间下从远端svn服务端拉取代码svn co svn://10.1.19.21/repo/技术中台/低…...
idea和jdk的安装教程
1.JDK的安装 下载 进入官网,找到你需要的JDK版本 Java Downloads | Oracle 中国 我这里是windows的jdk17,选择以下 安装 点击下一步,安装完成 配置环境变量 打开查看高级系统设置 在系统变量中添加两个配置 一个变量名是 JAVA_HOME …...
HTML静态网页成品作业(HTML+CSS)——电影网首页网页设计制作(1个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…...
大数据系列之:Flink Doris Connector,实时同步数据到Doris数据库
大数据系列之:Flink Doris Connector,实时同步数据到Doris数据库 一、版本兼容性二、使用三、Flink SQL四、DataStream五、Lookup Join六、配置通用配置项接收器配置项查找Join配置项 七、Doris 和 Flink 列类型映射八、使用Flink CDC访问Doris的示例九、…...
LabVIEW VI 多语言动态加载与运行的实现
在多语言应用程序开发中,确保用户界面能够根据用户的语言偏好动态切换是一个关键需求。本文通过分析一个LabVIEW程序框图,详细说明了如何使用LabVIEW中的属性节点和调用节点来实现VI(虚拟仪器)界面语言的动态加载与运行。此程序允…...
Unity引擎基础知识
目录 Unity基础知识概要 1. 创建工程 2. 工程目录介绍 3. Unity界面和五大面板 4. 游戏物体创建与操作 5. 场景和层管理 6. 组件系统 7. 脚本语言C# 8. 物理引擎和UI系统 学习资源推荐 Unity引擎中如何优化大型游戏项目的性能? Unity C#脚本语言的高级编…...
练习题- 探索正则表达式对象和对象匹配
正则表达式(Regular Expressions)是一种强大而灵活的文本处理工具,它允许我们通过模式匹配来处理字符串。这在数据清理、文本分析等领域有着广泛的应用。在Python中,正则表达式通过re模块提供支持,学习和掌握正则表达式对于处理复杂的文本数据至关重要。 本文将探索如何在…...
Java集合提升
1. 手写ArrayList 1.1. ArrayList底层原理细节 底层结构是一个长度可以动态增长的数组(顺序表)transient Object[] elementData; 特点:在内存中分配连续的空间,只存储数据,不存储地址信息。位置就隐含着地址。优点 节…...
uniapp 微信小程序生成水印图片
效果 源码 <template><view style"overflow: hidden;"><camera device-position"back" flash"auto" class"camera"><cover-view class"text-white padding water-mark"><cover-view class"…...
ElasticSearch相关知识点
ElasticSearch中的倒排索引是如何工作的? 倒排索引是ElasticSearch中用于全文检索的一种数据结构,与正排索引不同的是,正排索引将文档按照词汇顺序组织。而倒排索引是将词汇映射到包含该词汇的文档中。 在ElasticSearch中,倒排索…...
css 文字图片居中及网格布局
以下内容纯自已个人理解,直接上代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...
解决ImportError: DLL load failed while importing _rust: 找不到指定的程序
解决ImportError: DLL load failed while importing _rust: 找不到指定的程序 python使用库cryptography 当 from cryptography.hazmat.bindings._rust import exceptions as rust_exceptions 时,会报错: ImportError: DLL load failed while importin…...
集合-List去重
1.利用Set去重 @Test public void distinctList() {List<String> oldList = new ArrayList<>();oldList.add("a");oldList.add("a");oldList.add("b");oldList.add("c");oldList.add("d");List<String> …...
ST-LINK USB communication error 非常有效的解决方法
文章目录 一、检查确定是ST-LINK USB communication error的问题二、关闭文件,打开keil软件所在文件夹,找到STLink文件夹,找到该应用程序双击 一、检查确定是ST-LINK USB communication error的问题 二、关闭文件,打开keil软件所在…...
探索CSS的:future-link伪类:选择指向未来文档的链接
CSS(层叠样式表)是Web设计中用于描述网页元素样式的语言。随着CSS4的提案,引入了许多新的选择器,其中之一是:future-link伪类。然而,需要注意的是,:future-link伪类目前还处于提议阶段,并没有在…...
【C++】序列与关联容器(三)map与multimap容器
【C】序列与关联容器(三)map与multimap容器 一、map二、multiset / multimap 一、map 树中的每个结点的类型是一个std::pair //pair的类型是<const key,value> pair是一个包含两个指针的结构体,第一个指针指向该节点的key,…...
ActiveMQ、RabbitMQ、Kafka、RocketMQ在优先级队列、延迟队列、死信队列、重试队列、消费模式、广播模式的区别
ActiveMQ、RabbitMQ、Kafka、RocketMQ这四款消息队列在优先级队列、延迟队列、死信队列、重试队列、消费模式、广播模式等方面各有其特点和差异。以下是对这些方面的详细比较: 1. 优先级队列 ActiveMQ:支持优先级队列,可以在发送消息时指定…...
首款会员制区块链 Geist 介绍
今天,Pixelcraft Studios 很高兴地宣布即将推出 Geist,这是一个由 Base、Arbitrum、Alchemy 以及 Aavegotchi 支持的全新 L3。 Geist 之前的代号为 “Gotchichain”,是首个专为游戏打造的会员专用区块链。 为什么选择 Geist? …...
CANoe软件中Trace窗口的筛选栏标题不显示(空白)的解决方法
文章目录 问题描述原因分析解决方案扩展知识总结问题描述 不知道什么情况,CANoe软件中Trace窗口的筛选栏标题突然不显示了,一片空白。现象如下: 虽然不影响CANoe软件的使用,但是观感上非常难受,对于强迫症患者非常不友好。 原因分析 按照常规思路,尝试了: 1、重启CAN…...
日期类代码实现-C++
一、目标 通过前面对类和对象的介绍我们可以自己通过C代码初步实现一个简单的日期类。 实现的主要操作有: 1.日期类的构造函数 2.日期类的拷贝构造函数(在头文件中实现) 3.日期类的比较运算符重载 4.日期类的计算运算符重载 5.流插入运…...
【问题记录+总结】VS Code Tex Live 2024 Latex Workshop Springer模板----更新ing
目录 Summary 道阻且长 少即是多 兵马未动粮草先行 没有万能 和一劳永逸 具体问题具体分析 心态 Detail 1、关于模板[官网] 2、settings.json 3、虫和杀虫剂 4、擦 换成Tex Studio都好了。。。 Summary 道阻且长 某中意期刊,只有Latex。之前只简单用过…...
Linux运维_Bash脚本_源码安装Go-1.21.11
Linux运维_Bash脚本_源码安装Go-1.21.11 Bash (Bourne Again Shell) 是一个解释器,负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件,并于 1989 年发布的免费软件,作为 Sh (Bourne Shell) 的替代品。 您可以在 Linux 和…...
ShareSDK Twitter
创建应用 1.登录Twitter控制台并通过认证 2.点击Developer Portal进入Twitter后台 3.点击Sign up for Free Account创建应用 4.配置应用信息 以下为创建过程示例,图中信息仅为示例,创建时请按照真实信息填写,否则无法正常使用。 权限申请…...
word2vec 如何用多个词表示一个句子
word2vec 模型通常用于将单词映射为固定大小的向量。为了使用多个词表示一个句子,我们可以采用以下几种方法: 词袋模型 (Bag of Words, BoW): 将句子中所有词的向量加起来,不考虑词的顺序。这种方法简单,但会丢失词序信息。 计算…...
IDEA中查看接口的所有实现类和具体实现类
1.IDEA中接口的所有实现类查看 1.CTRLH(hierarchy 结构) 我们选中要查看的接口 按住快捷键ctrlh 在界面右侧可以看到该接口的所有可能实现类 2.右击diagrams->show diagram 选中要查看的接口 右击选择diagrams->show diagram 即可以以图表的方式查看接口和所有实现类…...
DLL的导出和调用
动态链接库在C中非常重要,写了一个简单的例子用于DLL的导出和调用。 DLL的生成 头文件 #include<iostream> #include<stdexcept> using namespace std;#define TESTAPI __declspec(dllexport)// 函数定义 extern "C" {TESTAPI int add(in…...
vscode中调试cuda kernel
关于vscode中调试cpp可参考之前的博客:ubuntu vscode 基本设置 和 调试设置_ubuntu vscode 调试-CSDN博客 这篇我们来讲如何调试.cu的kernel,主要参考的是:https://www.zhihu.com/question/431782036/answer/2468791220 1、基本准备不多说&am…...
SQL的连接查询与pandas的对应关系
在SQL和Pandas中,连接查询(join)是处理数据集之间关系的重要工具。下面是SQL中的各种连接查询类型及其与Pandas中相应操作的对应关系: 1. INNER JOIN SQL: INNER JOIN 返回两个表中具有匹配值的行。 Pandas: merge() 方法的 how…...
【JS】中断和恢复任务序列
前言 封装processTasks函数,实现以下需求 /*** 依次顺序执行一系列任务* 所有任务全部完成后可以得到每个任务的执行结果* 需要返回两个方法,start用于启动任务,pause用于暂停任务* 每个任务具有原子性,即不可中断,只…...
CentOS系统下安装NVIDIA显卡驱动
一、安装显卡驱动 1.安装依赖项 yum -y install gcc pciutils yum -y install gcc yum -y install gcc-c yum -y install make2.查看内核版本 uname -a3.查看显卡版本 lspci | grep -i nvidia4.屏蔽系统自带的nouveau (1)查看nouveau lsmod | grep nouveau (2)打开blackl…...
Linux 与 Windows 服务器操作系统 | 全面对比
在服务器操作系统的领域,Linux 和 Windows 一直是两个备受关注的选择。 首先来看 Windows 操作系统。它由 Microsoft Corporation 开发,在桌面领域占据显著份额,其中 Windows 10 是使用最广泛的版本,广泛应用于个人计算机和企业桌…...
给既有exe程序添加一机一码验证
原文地址:李浩的博客 lihaohello.top 本科期间开发过一款混凝土基本构件设计程序,该程序是一个独立的exe可执行文件,采用VC静态链接MFC库编制而成。近期,需要为该程序添加用户注册验证的功能,从而避免任何用户获取该程…...