操作系统:面试整理一

进程相关

进程的状态有哪些?状态间怎么相互转换?
  • 就绪:进程已处于准备好运行的状态,即进程已分配到除CPU外的所有必要资源后,只要再获得CPU,便可立即执行
  • 执行:进程已经获得CPU,程序正在执行状态
  • 阻塞:正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态
  • 状态转换:
    在这里插入图片描述
进程和线程的概念
  • 进程:
    1. 是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位
    2. 是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有5种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态
  • 线程:
    1. 是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位
    2. 可与同属一个进程的其他的线程共享进程所拥有的全部资源
进程和线程的关系
		1. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位
		2. 资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量
		3. 处理机分给线程,即真正在处理机上运行的是线程
		4. 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步
		5. 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源
		6. 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行
进程与线程的区别
		1. 进程有自己的独立地址空间,线程没有:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
		2. 进程是操作系统资源分配的基本单位,与其他进程资源相互独立;线程是CPU(操作系统)调度的基本单位(任务调度和执行的基本单位),共用进程内的资源
		3. 进程和线程通信方式不同(线程之间的通信比较方便。同一进程下的线程共享数据(比如全局变量,静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行。)
		4. 进程上下文切换开销大,线程开销小:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
		5. 一个进程挂掉了不会影响其他进程,而线程挂掉了会影响其他线程
		6. 对进程操作一般开销都比较大,对线程开销就小了
		7. 进程内只能串行处理,无法很好地分工合作;线程能够使进程内的子任务共享进程内的资源,并行工作,提高操作系统的性能
		8. 在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
进程和线程的高级区别
	1. 空间层面。因为进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高,但是正由于进程之间独立的特点,使得进程安全性比较高,也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。一个线程死掉就等于整个进程死掉
	2. 通信机制层面。正因为进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便
	3. CPU系统层面。线程使得CPU系统更加有效,因为操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上
	4. 程序结构层面。举例:当我们使用进程的时候,我们不自主的使用if else嵌套来判断pid,使得程序结构繁琐,但是当我们使用线程的时候,基本上可以甩掉它,当然程序内部执行功能单元需要使用的时候还是要使用,所以线程对程序结构的改善有很大帮助
什么时候使用进程?什么时候使用线程?
	1. 需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的
	2. 线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应
	3. 因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程
	4. 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求
	5. 需要更稳定安全时,适合选择进程;需要速度时,选择线程更好
设置线程为执行与调度的基本单位,有什么好处?
	* 计算机操作系统里面有两个重要概念:并发和隔离
		1. 并发:为了尽量让硬件利用率高,线程是为了在系统层面做到并发。线程上下文切换效率比进程上下文切换会高很多,这样可以提高并发效率
		2. 隔离:是并发之后要解决的重要问题,计算机的资源一般是共享的,隔离要能保障崩溃了这些资源能够被回收,不影响其他代码的使用。所以说一个操作系统只有线程没有进程也是可以的,只是这样的系统会经常崩溃而已,操作系统刚开始发展的时候和这种情形很像
	* 原因:线程和并发有关系,进程和隔离有关系。线程基本是为了代码并发执行引入的概念,因为要分配cpu时间片,暂停后再恢复要能够继续和没暂停一样继续执行;进程相当于一堆线程加上线程执行过程中申请的资源,一旦挂了,这些资源都要能回收,不影响其他程序
进程同步
	* 进程同步的主要任务:对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性
	* 进程同步机制遵循的原则
		1. 空闲让进
		2. 忙则等待(保证对临界区的互斥访问)
		3. 有限等待(有限代表有限的时间,避免死等)
		4. 让权等待(当进程不能进入自己的临界区时,应该释放处理机,以免陷入忙等状态)
进程的通信方式有哪些?
	1. 概念:每个进程都各自拥有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信
		* 低级进程通信:用信号量进行的进程间的互斥和同步,换的信息量少
		* 高级进程通信:用户利用操作系统所提供的一组通信命令传送大量数据的一种通信方式。操作系统隐藏了进程通信的实现细节。或者说,通信过程对用户是透明的
	2. 高级进程通信机制分类
		1. 共享存储器系统
			* 实际操作中对应的是“剪贴板”(剪贴板实际上是系统维护管理的一块内存区域)的通信方式,比如举例如下:word进程按下ctrl+c,在ppt进程按下ctrl+v,即完成了word进程和ppt进程之间的通信,复制时将数据放入到剪贴板,粘贴时从剪贴板中取出数据,然后显示在ppt窗口上
		2. 消息传递系统
			* 进程间的数据交换以消息(message)为单位。应用举例:邮槽(MailSlot)是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户机进程写入数据
		3. 管道通信系统
			* 管道即:连接读写进程以实现他们之间通信的共享文件(pipe文件,类似先进先出的队列,由一个进程写,另一进程读)。实际操作中,管道分为:匿名管道、命名管道。匿名管道是一个未命名的、单向管道,通过父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程之间的通信,而不能实现跨网络的通信。命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信
几种进程通信机制
	1. 管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样地,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞
	2. 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段
	3. 消息队列:消息队列是由消息组成的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。是用于两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据。需要注意的是,消息队列是用创建文件的方式建立的,如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据
	4. 共享内存:共享内存允许两个或多个进程访问同一个逻辑内存。这一段内存可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取读出,从而实现了进程间的通信。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。共享内存是最快的IPC方式,它是针对其它进程间通信方式运行效率低而专门设计的。它往往与其它通信机制(如信号量)配合使用,来实现进程间的同步和通信
	5. 套接字:套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信
	6. 信号:用于通知接收进程某个事件已经发生
多线程的优缺点?
	* 优点:
		1. 使用线程可以把占据时间长的程序中的任务放到后台去处理
		2. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
		3. 程序的运行速度可能加快
		4. 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等
		5. 多个线程交替执行,减少或避免因程序阻塞或意外情况造成的响应过慢现象,降低了用户等待的概率
	* 缺点:
		1. 如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换
		2. 更多的线程需要更多的内存空间
		3. 多线程可能会给程序带来更多“bug”
		4. 线程的中止需要考虑其对程序运行的影响
		5. 通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生
为什么进程上下文切换比线程上下文切换代价高?
	* 进程上下文切换的过程:
		* 切换页目录以使用新的地址空间
		* 切换内核栈和硬件上下文
	* 线程上下文切换的过程:
		* 切换内核栈和硬件上下文
对线程池的理解
	* java.util.concurrent.ThreadPoolExecutor 类就是一个线程池。客户端调用 ThreadPoolExecutor.submit(Runnable task) 提交任务,线程池内部维护的工作者线程的数量就是该线程池的线程池大小,有3种形态:
		1. 当前线程池大小:表示线程池中实际工作者线程的数量
		2. 最大线程池大小(maxinumPoolSize):表示线程池中允许存在的工作者线程的数量上限
		3. 核心线程大小(corePoolSize ):表示一个不大于最大线程池大小的工作者线程数量上限
	* 注意:
		1. 如果运行的线程少于corePoolSize,则Executor始终首选添加新的线程,而不进行排队
		2. 如果运行的线程等于或者多于corePoolSize,则 Executor始终首选将请求加入队列,而不是添加新线程
		3. 如果无法将请求加入队列,即队列已经满了,则创建新的线程,除非创建此线程超出maxinumPoolSize, 在这种情况下,任务将被拒绝
缓冲区溢出的概念、原因及其危害?
	1. 概念:缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上
	2. 原因:程序中没有仔细检查用户输入的参数
	3. 危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的

死锁相关

死锁的概念、形成条件和预防?
	* 概念:在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态
	* 产生的原因:
		1. 竞争资源
		2. 进程推进顺序不当
	* 形成条件(必要条件,缺一不可)
		1. 互斥:一个资源每次只能被一个进程使用
		2. 不可抢占:进程已获得的资源,在未使用完之前,不能强行剥夺
		3. 占有并等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放
		4. 环形等待:若干进程之间形成一种首尾相接的循环等待资源关系
	* 预防和解除
		* 预防:破坏四个必要条件之一
			1. 破坏请求条件:一次性分配所有资源,这样就不会再有请求了;
			2. 破坏请保持条件:只要有一个资源得不到分配,也不给这个进程分配其他的资源:
			3.  破坏环路等待条件:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反。
			4. 破坏不可剥夺条件:当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源;

		* 解除
			1. 方法一:强制性地从系统中撤消一个或多个死锁的进程以断开循环等待链,并收回分配给终止进程的全部资源供剩下的进程使用
			2. 方法二:使用一个有效的挂起和解除机构来挂起一些死锁的进程,其实质是从被挂起的进程那里抢占资源以解除死锁
	* 银行家算法:<https://blog.csdn.net/qq_33414271/article/details/80245715>
什么是临界资源和临界区?如何解决冲突?
	* 临界区:每个进程中访问临界资源的那段程序称为临界区,每次只准许一个进程进入临界区,进入后不允许其他进程进入
	* 临界资源:指一次仅允许一个线程使用的资源
	* 解决:
		1. 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入
		2. 任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待
		3. 进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区
		4. 如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象

其他

操作系统三种内存管理的比较
  • 操作系统的三种内存管理方式为:

    • 段式、页式、段页式
  • 为什么需要三种管理方式?

    • 由于连续内存分配方式会导致内存利用率偏低以及内存碎片的问题,因此需要对这些离散的内存进行管理。引出了三种内存管理方式
  • 分页存储管理

    1. 基本分页存储管理中不具备页面置换功能,因此需要整个程序的所有页面都装入内存之后才可以运行。

    2. 需要一个页表来记录逻辑地址和实际存储地址之间的映射关系,以实现从页号到物理块号的映射。

    3. 由于页表也是存储在内存中的,因此内存数据需要两次的内存访问(一次是从内存中访问页表,从中找到指定的物理块号,加上页内偏移得到实际物理地址;第二次就是根据第一次得到的物理地址访问内存取出数据)。

    4. 为了减少两次访问内存导致的效率影响,分页管理中引入了快表,当要访问内存数据的时候,首先将页号在快表中查询,如果在快表中,直接读取相应的物理块号;如果没有找到,那么访问内存中的页表,从页表中得到物理地址,同时将页表中的该映射表项添加到快表中。

    5. 在某些计算机中如果内存的逻辑地址很大,将会导致程序的页表项会很多,而页表在内存中是连续存放的,所以相应的就需要较大的连续内存空间。为了解决这个问题,可以采用两级页表或者多级页表的方法,其中外层页表一次性调入内存且连续存放,内层页表离散存放。相应的访问内存页表的时候需要一次地址变换,访问逻辑地址对应的物理地址的时候也需要一次地址变换,而且一共需要访问内存3次才可以读取一次数据。

  • 分段存储管理

    1. 分页是为了提高内存利用率,而分段是为了满足程序员在编写代码的时候的一些逻辑需求(比如数据共享,数据保护,动态链接等)
    2. 分段内存管理当中,地址是二维的,一维是段号,一维是段内地址
    3. 其中每个段的长度是不一样的,而且每个段内部都是从0开始编址的。由于分段管理中,每个段内部是连续内存分配,但是段和段之间是离散分配的,因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。段表中的每一个表项记录了该段在内存中的起始地址和该段的长度。段表可以放在内存中也可以放在寄存器中
    4. 访问内存的时候根据段号和段表项的长度计算当前访问段在段表中的位置,然后访问段表,得到该段的物理地址,根据该物理地址以及段内偏移量就可以得到需要访问的内存。由于也是两次内存访问,所以分段管理中同样引入了联想寄存器
  • 段页存储方式

    1. 先将用户程序分为若干个段,然后再把每个段分成若干个页,并且为每一个段赋予一个段名称。这样在段页式管理中,一个内存地址就由段号,段内页号以及页内地址三个部分组成
    2. 段页式内存访问:系统中设置了一个段表寄存器,存放段表的起始地址和段表的长度。地址变换时,根据给定的段号(还需要将段号和寄存器中的段表长度进行比较防止越界)以及寄存器中的段表起始地址,就可以得到该段对应的段表项,从段表项中得到该段对应的页表的起始地址,然后利用逻辑地址中的段内页号从页表中找到页表项,从该页表项中的物理块地址以及逻辑地址中的页内地址拼接出物理地址,最后用这个物理地址访问得到所需数据。由于访问一个数据需要三次内存访问,所以段页式管理中也引入了高速缓冲寄存器
  • 分段和分页的对比

    1. 页是信息的物理单位,是出于系统内存利用率的角度提出的离散分配机制;段是信息的逻辑单位,每个段含有一组意义完整的信息,是出于用户角度提出的内存管理机制
    2. 页的大小是固定的,由系统决定;段的大小是不确定的,由用户决定
    3. 页地址空间是一维的,段地址空间是二维的
内存分配
	* 内存分配分为连续分配和非连续分配管理两种
		* 内存连续分配
			1. 单一连续分配:分为系统区和用户区,系统区供给操作系统使用,用户区供给用户使用,内存中永远只有一道程序
			2. 固定分区分配:最简单的一种多道程序管理方式,它将用户内存空间划分为若干个固定大小的区域,每个分区只装入一道作业。【方法一:分区大小相等;方法二:分区大小不等,划分为含有多个较小的分区,适量的中等分区及少量的大分区】
			3. 动态分区分配:又称为可变分区分配,是一种动态划分内存的方法。这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态的建立分区,并使分区的大小正好适合进程的需要。因此系统中分区的大小和数目是可变的
		* 非连续分配
			1. 页式存储管理:分页存储管理是将一个进程的地址(逻辑地址空间)空间划分成若干个大小相等的区域,称为页,相应地,将内存空间划分成与页相同大小(为了保证页内偏移一致)的若干个物理块,称为块或页框(页架)。在为进程分配内存时,将进程中的若干页分别装入多个不相邻接的块中。【只需给出一个地址,所以是一维】
			2. 分段式存储管理:在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段是一组完整的逻辑信息,如有主程序段、子程序段、数据段及堆栈段等,每个段都有自己的名字,都是从零开始编址的一段连续的地址空间,各段长度是不等的。【因为每段的长度是不确定的,所以不能只给一个逻辑地址通过整数除法得到段号,求余得出段内偏移,所以一定要显式给出(段号,段内偏移),因此分段管理的地址空间是二维的】
	* 两种的区别
		1. 分页式管理方式是从计算机的角度考虑设计的,以提高内存的利用率,提升计算机性能,且分页通过硬件机制实现,对用户完全透明
		2. 分段式管理方式的提出则是考虑了用户和程序员,以满足方便编程、信息保护和共享、动态增长及动态链接等多方面的需要
		3. 分页式存储管理的作业地址空间是一维的,分段式的存储管理的作业管理地址空间是二维的。【页式系统中,逻辑地址的页号和页内偏移量对用户是透明的【用户提供一个逻辑地址即可】,但在段氏系统中,段号和段内偏移量必须由用户显式提供(在高级程序设计语言中,这个工作由编译程序完成)】
虚拟内存的作用
  1. 既然每个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处
  2. 当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存
  3. 在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片
进程(作业)的调度算法有哪些?
	1. 先来先服务(FCFS):此算法的原则是按照作业到达后备作业队列(或进程进入就绪队列)的先后次序来选择作业
	2. 短作业优先(SJF):这种调度算法主要用于作业调度,它从作业后备队列中挑选所需运行时间(估计值)最短的作业进入主存运行
	3. 时间片轮转调度算法(RR):当某个进程执行的时间片用完时,调度程序便停止该进程的执行,并将它送就绪队列的末尾,等待分配下一时间片再执行。然后把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片处理机执行时间
	4. 高响应比优先(HRRN):按照高响应比((已等待时间+要求运行时间)/ 要求运行时间)优先的原则,在每次选择作业投入运行时,先计算此时后备作业队列中每个作业的响应比RP然后选择其值最大的作业投入运行
	5. 优先权调度算法:按照进程的优先权大小来调度,使高优先权进程得到优先处理的调度策略称为优先权调度算法。注意:优先数越多,优先权越小
	6. 多级队列调度算法:多队列调度是根据作业的性质和类型的不同,将就绪队列再分为若干个子队列,所有的作业(或进程)按其性质排入相应的队列中,而不同的就绪队列采用不同的调度算法
页面置换算法有哪些?
	1. 最佳置换算法:即选择那些永不使用的,或者是在最长时间内不再被访问的页面置换出去。(它是一种理想化的算法,性能最好,但在实际上难于实现)
	2. 先进先出置换算法 FIFO:总是淘汰最先进入内存的页面
	3. 最近最久未使用置换算法 LRU(Least Recently Used):即选择最近最久未使用的页面予以淘汰。【系统在每个页面设置一个访问字段,用以记录这个页面自上次被访问以来所经历的时间 T,当要淘汰一个页面时,选择 T 最大的页面。】
	4. 时钟(Clock)置换算法:也叫最近未用算法 NRU(Not RecentlyUsed)。该算法为每个页面设置一位访问位,将内存中的所有页面都通过链接指针链成一个循环队列。当某页被访问时,其访问位置“1”。在选择一页淘汰时,就检查其访问位,如果是“0”,就选择该页换出;若为“1”,则重新置为“0”,暂不换出该页,在循环队列中检查下一个页面,直到访问位为“0”的页面为止。由于该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时是将未使用过的页面换出去,所以把该算法称为最近未用算法
	5. 最少使用置换算法LFU:该算法选择最近时期使用最少的页面作为淘汰页
逻辑地址、物理地址、虚拟内存、操作系统的内容?
	1. 物理地址:它是地址转换的最终地址,进程在运行时执行指令和访问数据最后都要通过物理地址从主存中存取,是内存单元真正的地址
	2. 逻辑地址:是指从应用程序角度看到的内存地址,又叫相对地址。编译后,每个目标模块都是从0号单元开始编址,称为该目标模块的相对地址或逻辑地址。不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置。用户和程序员只需要知道逻辑地址
	3. 虚拟内存:虚拟内存是一些系统页文件,存放在磁盘上,每个系统页文件大小为4K,物理内存也被分页,每个页大小也为4K,这样虚拟页文件和物理内存页就可以对应,实际上虚拟内存就是用于物理内存的临时存放的磁盘空间。页文件就是内存页,物理内存中每页叫物理页,磁盘上的页文件叫虚拟页,物理页+虚拟页就是系统所有使用的页文件的总和
		* 虚拟内存技术:允许将一个作业分多次调入内存。可以用分页式、分段式、段页式存储管理来实现
		* 虚拟存储器:基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而其余部分留在外存,就可以启动程序执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间放入将要调入内存的信息。这样,系统就好像为用户提供了一个比实际内存大得多的存储器,称为虚拟存储器
	4. 操作系统:主要包括进程和线程的管理、存储管理、设备管理、文件管理
同步,异步,堵塞,非堵塞的区别

同步:当一个同步调用发出后,调用者需要等待返回结果,才能进行后续的执行。
异步:当一个异步过程调用发出后,调用者不能立刻得到返回结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
阻塞 :是指调用结果返回前,当前线程会被挂起,即阻塞。
非阻塞 :是指即使调用结果没返回,也不会阻塞当前线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值