操作系统相关--面试和笔试高频

操作系统

计算题

页面置换算法

先进先出(FIFO)更新算法:总是淘汰最先进入内存的页面。即目前出现次数最多的页面

最近最久未使用(LRU)更新算法:当需要更新一页时,选择在最近一段时间内最久没有被使用的页面予以淘汰,往前看

**最优(OPT)更新算法:**被淘汰页面,将是以后永久不被访问,或者是在未来最长时间内不再被访问的页面,往后看,最后一个出现的就是被置换的。(实际是无法实现的,因为系统无法预判哪一个页面是未来长久不会使用的)

最近未使用算法(NUR)-时钟置换算法:为每一页设置访问位,将内存中所有页面通过连接指针接成循环队列,当页面被访问时访问位置1;每次淘汰时,从指针当前位置开始循环遍历,将访问位为1的置为0,找到第一个访问位为0的将其淘汰。

OS-页面置换算法-CLOCK模拟_哔哩哔哩_bilibili

缺页率=缺页次数/总页数; 置换率=置换次数/总页数 ;置换次数=缺页次数-物理块数

操作系统相关--面试和笔试高频_第1张图片

计算逻辑地址和物理地址

逻辑地址:指向内存中的一个地址。,如指针里面存储的地址

物理地址:内存单元真正的地址,内存地址寄存器
在16进制的前提下,逻辑地址=页号+页内地址 物理地址=块号+页内地址

例:设某用户的编程空间共32个页面,每页为1KB,内存容量为16KB。假定用户程序的页表如下所示。请计算逻辑地址0A5CH所对应的物理地址

操作系统相关--面试和笔试高频_第2张图片

每页1kB 1kB=2的10次方 所以业内资质位数为10位;

0A5CH(16进制)转成二级制为:0000 10 / 10 0101 1100 页号占前6位,业内1地址后10位

所以页号=2,对应的块号为4,

所以物理地址 0001 00 /10 0101 1100 即125CH

另一种

物理地址=(页面大小块号)+位移量*

对于逻辑地址[0,100],查页表第0页在第3块,所以物理地址为: 1024*3+100=3172

操作系统相关--面试和笔试高频_第3张图片

另一种

操作系统相关--面试和笔试高频_第4张图片

提取出来的信息:【页面数32个→2^5】:逻辑地址页号数为5位 【页面大小1KB→2^10】:页内地址数为 10位 【主存大小16KB→2^4】

物理地址求取步骤:
(1)十六进制转二进制 0A5CH为 0000 1010 0101 1100

(2)找页号和页内地址 右10位为页内地址,再往左的5位数为页号 0000 10|10 0101 1100

(3)页号变块号,页内地址不变

0010转十进制为2,即页号为2,对照表格可得物理块号为4 转二进制位为0100

0001 00|10 0101 1100 二进制转十六进制:125CH(此例中只有前两位数会变动)

操作系统相关--面试和笔试高频_第5张图片

内存容量

内存按照字节编址,从80000H到BFFFFH的存储容量是多少kB

BFFFF+1-80000=40000h=218=210.*2^8=*256kB

每一位十六进制数转换成四位二进制数 10000h= 2^18 64kB

地址线和数据线的总和

一个32k*32位的存储器,地址线和数据线的总和为47.

32k是容量大小,32*1024=2^15 因此至少需要15根地址线

数据线需要32根

问答题

系统将数据从磁盘读到内存的过程

在开始DMA传输时,主机向内存写入DA命令块,向DMA控制器写入该命令块的地址,启动I/O设备。然后,CPU继续其他工作,DMA控制器则继续下去直接操作内存总线,将地址放到总线上开始传输。当整个传输完成后,DMA控制器中断CPU。因此正确的执行顺序应该是
1、初始化DMA控制器并启动磁盘
2、从磁盘传输一块数据到内存缓冲区
3、DMA控制器发出中断请求
4、执行“DMA结束”中断y

DMA请求的检测点设置在每个机器周期也即总线周期结束时执行,这样使得总线利用率最高。
Direct Memory Access(存储器直接访问),指一种高速的数据传输操作,在专门的硬件( DMA)控制下,实现高速外设(I/O设备)主存储器之间自动成批交换数据尽量减少CPU干预的输入/输出操作方式。
DMA技术的弊端:因为DMA允许外设直接访问内存,从而形成对总线的独占。这在实时性强的硬实时系统的嵌入式开发中将会造成中断延时过长。这在军事等系统中是不允许的。

进程与线程

为什么有了进程还要有线程

.在一个进程中会存在多种活动任务,如果只有一个调度来执行这些任务,那么当某个任务被阻塞时,其他任务将得不到执行,因此需要有多个独立调度的单元来使这些任务可以并行的执行,这些单元就是线程。
.线程比进程更轻量,它们比进程更快的创建,也更容易撤销。线程间切换的开销也比进程小,由于进程拥有大量的资源,当切换到另一个进程的时候,需要保存当前进程的所有资源,而线程间的切换只需要保存当前堆栈和少了寄存器的内容。

单线程和多线程的区别

线程是操作系统进行运算调度的基本单位。有三大状态(就绪、运行、阻塞)。

单线程:在单个的程序中可以运行一个线程

           **优点**:系统稳定、扩展性强、不会对服务器造成压力

           **缺点**:程序在运行时窗口是不能拖动的,必须等到程序运行结束。

多线程:在一个程序中可以同时运行多个不同的线程来执行不同的任务

          **优点**:提高程序的效率,比如在比较耗时的操作中(下载大文件、数据库读取),可以同时进行其他操作;

           **缺点**:多线程需要协调管理,需要占用更多的内存空间

比如说边刷牙边听歌是多线程;先刷牙再听歌是单线程

多进程和多线程的区别

进程:资源分配的基本单位,简言之运行的程序就是进程。包括可执行的代码、打开的文件描述符、挂起的信号、进程的状态、内存地址空间、存放全局变量的数据段,以及一个或多个执行线程等。

线程:处理器调度的基本单位,它被包含在进程之中,是进程中的实际运作单位。每个线程都拥有一个独立的程序计数器、线程堆栈和寄存器。

不同点:
    1、多进程占用系统资源较多,多线程占用系统资源较少;
    2、每个进程拥有独立且完整的用户空间,每个线程自己只占用少量的栈空间,同时依赖所处进程的资源空间;
    3、进程因为其独立性,所以进程间通信需要依赖-一个公共的媒介(文件/内存),同进程下的多个线程公用进程资源,不存在通信这一说,但是要防止线程之间相互竞争资源(互斥/同步)
4.创建销毁、切换: 多进程创建销毁、切换复杂,速度慢;多线程创建销毁、切换简单,速度快

         5.**编程调试、可靠性和分布式**:多进程编程简单,调试简单;进程之间不会互相影响;适合多核、多机分布。线程编程复杂,调试复杂;一个线程挂掉将导致整个进程挂掉;适合多核分布;

进程间的通信

管道:通常用在父子进程间通信。
命名管道:去除了父子进程间通信的机制,通常用来汇聚多个客户端进程与服务端进程的通信。
消息队列:独立于进程存在,进程间可以通过消息队列来传递数据,典型的模式是生产者-消费者模型。
信号:一个进程可以给另一个进程发送信号来触发某些操作,比如挂起一个进程。Linux 通过 kill 命令来发送信号。
信号量:信号量是一个计数器,用来保护临界资源。进程可以读取信号量的值,并对它进行加减操作,多个进程可以通过信号量实现进程同步。
共享内存:多个进程上不同的地址空间可以映射到同一块物理内存上,实现数据的共享,因为不涉及数据的拷贝,所以这是一种高效的通信方式。需要注意的是,多个进程并行时,需要通过同步机制保护共享内存的访问。
Socket 通信:通过网络实现不同机器上不同进程间的通信。

同一进程中线程共享的部分

进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。

不共享:栈空间

线程通信:多个线程共同操作共享的资源时,互相告知自己的状态以避免资源争夺。通过共享内存(共享程序的公共状态,volatile)、消息传递(没有共享内存,通过明确的发送信息来显示的进行通信,wait/notify)和管道流进行通信。

进程调度

先来先服务(FCFS):按照请求顺序进行调度。适合长作业,不适合短作业,因为短作业会很快执行完,长作业可以很快得到调度,但是长作业会阻塞后面的短作业。
短作业优先:让短作业更快的执行完可以保证整体等待的时间最短。
最短剩余时间优先:按剩余时间最短的作业优先调度。当一个新的作业到达时,把这个新的作业运行时间和当前作业的剩余时间做比较,如果小于当前作业的剩余运行时间,那么就挂起当前作业,运行新的作业。(理想的算法,因为大部分情况下无法知道一个进程还需要运行多长时间结束)

进程的状态

进程主要有三种状态:运行态、就绪态、阻塞态(等待、睡眠)。

运行态和就绪态可以相互转换,通常由系统的进程调度引起的。当一个处于运行态的进程遇到阻塞的代码,需要等待触发条件,或者没有足够的运行资源时,就会挂起当前进程,进入阻塞状态,而当满足了触发条件,或者系统资源又满足时,就是进入就绪状态,等待再次被调度。

操作系统相关--面试和笔试高频_第6张图片

进程的类型

交互进程:由shell启动的进程,既可在前台运行,也可在后台运行;
批处理进程:与终端没有联系,是一个进程序列;
守护进程:linux系统启动时启动的进程,并在后台运行;

并发与并行

并发是指一段时间内可以同时运行多道程序,因为时间较短,所以看起来像多个程序在同时执行,实际上是 CPU 在多个程序间进行快速的切换。

并行是同一时刻可以运行多个程序,是真正意义上的并发,需要多处理器的支持

用户与内核

  • 由用户态切换到内核态

异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。

系统调用:Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。

外部访问中断:当外设完成用户的请求时,会向CPU发送中断信号。

  • 用户态和内核态

内核:控制计算机的硬件资源,例如协调CPU资源,分配内存资源,并且提供稳定的环境供应用程序运行。

用户态:提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。 内核必须提供一组通用的访问接口,这些接口就叫系统调用

操作系统相关--面试和笔试高频_第7张图片

死锁

定义:多个线程同时阻塞,互相等待资源释放

死锁原因:

  • 系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。
  • 进程运行推进顺序不合适:请求和释放资源的顺序不当,会导致死锁

死锁的四个必要条件:

  • 互斥条件:一个资源每次只能被一个进程使用,此时若其他进程请求该资源,则只能等待。
  • 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
  • 不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
  • 循环等待条件: 若干进程间形成首尾相接循环等待资源的关系

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

死锁避免
1.预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件
2.避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁
3.检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉
4.解除死锁:该方法与检测死锁配合使用

你可能感兴趣的:(测试开发,面试,职场和发展)