加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱资讯网 (https://www.52junxun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

面试背诵版—操作系统

发布时间:2022-10-12 11:26:26 所属栏目:Unix 来源:
导读:  命令:ps -aux

  windows下main通过任务管理器查看进程PID

  PID == 0的进程:守护进程

  PID == 1的进程:

  初始化,也被称为init进程

  托管孤儿进程: 对孤儿进程进行善后。
  命令:ps -aux
 
  windows下main通过任务管理器查看进程PID
 
  PID == 0的进程:守护进程
 
  PID == 1的进程:
 
  初始化,也被称为init进程
 
  托管孤儿进程: 对孤儿进程进行善后。
 
  原始父进程:
 
  PID == 2的进程:守护进程,专门负责虚拟内存的请页操作
 
  什么是换页操作?
 
  OS支持虚拟内存机制的时候,加载应用程序到内存,并不会进行完整代码的拷贝,只会拷贝当前进程要运行的部分代码。当这部分代码运行完毕之后,会再去拷贝另一部分需要运行的代码到内存中,拷贝的时候是按照一页一页来进行操作的,每一页是4096字节。
 
  19. 临界资源和临界区 二、 死锁 1. 什么是死锁?
 
  死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。
 
  例如,在某个计算机系统中只有一台打印机和一台输入 设备,进程A正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程B 所占用,而B在未释放打印机之前,又提出请求使用正被A占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。
 
  多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
 
  如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。
 
  2. 形成死锁的四个必要条件是什么? 互斥: 某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。占有且等待: 一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。不可抢占: 别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。循环等待: 存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
 
  当以上四个条件均满足,必然会造成死锁,相反,而只要上述条件之一不满足,就不会发生死锁。
 
  发生死锁的进程无法进行下去,它们所持有的资源也无法释放。这样会导致CPU的吞吐量下降。所以死锁情况是会浪费系统资源和影响计算机的使用性能的。
 
  3. 如何处理死锁问题
 
  常用的处理死锁的方法有:死锁预防、死锁避免、死锁检测、死锁解除、鸵鸟策略。
 
  4. 我们该如何避免死锁?
 
  死锁避免的基本思想:系统对进程发出的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进入死锁状态的动态策略。银行家算法就是经典的死锁避免的算法。
 
  5. 死锁的预防
 
  理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。只要打破四个必要条件之一就能有效预防死锁的发生:
 
  打破互斥条件:改造独占性资源为虚拟资源,大部分资源已无法改造。打破不可抢占条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足,则退出原占有的资源。打破占有且等待条件:采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待unix线程切换,这样就不会占有且申请。打破循环等待条件:实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源。 6. 死锁避免和死锁预防有啥不同?
 
  死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现;而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。死锁避免是在系统运行过程中注意避免死锁的最终发生。
 
  7 . 利用工具排查死锁问题?
 
  如果你想排查你的 Java 程序是否死锁,则可以使用 jstack 工具,它是 jdk 自带的线程堆栈分析工具。
 
  在 Linux 下,我们可以使用 pstack + gdb 工具来定位死锁问题。
 
  pstack 命令可以显示每个线程的栈跟踪信息(函数调用过程),那么,在定位死锁问题时,我们可以多次执行 pstack 命令查看线程的函数调用过程,多次对比结果,确认哪几个线程一直没有变化,且是因为在等待锁,那么大概率是由于死锁问题导致的。
 
  三、内存管理 1. 内存管理的功能
 
  内存管理主要是为了提高内存利用率,可以通过虚拟技术从逻辑上扩充存储器。
 
  内存管理的功能有:
 
  1. 什么是分页?
 
  答:把内存空间划分为大小相等且固定的块,作为主存的基本单位。因为程序数据存储在不同的页面中,而页面又离散的分布在内存中,因此需要一个页表来记录映射关系,以实现从页号到物理块号的映射。
 
  访问分页系统中内存数据需要两次的内存访问 (一次是从内存中访问页表,从中找到指定的物理块号,加上页内偏移得到实际物理地址;第二次就是根据第一次得到的物理地址访问内存取出数据)。
 
  在这里插入图片描述
 
  2. 什么是分段?
 
  答:分页是为了提高内存利用率,而分段是为了满足程序员在编写代码的时候的一些逻辑需求(比如数据共享,数据保护,动态链接等)。
 
  分段内存管理当中,地址是二维的,一维是段号,二维是段内地址;其中每个段的长度是不一样的,而且每个段内部都是从0开始编址的。由于分段管理中,每个段内部是连续内存分配,但是段和段之间是离散分配的,因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。
 
  3. 分页和分段有什区别? 4. 什么是交换空间?
 
  操作系统把物理内存(physical RAM)分成-块一块的小内存, 每-块内存被称为页(page)。 当内存资源不足时,Linux把某些页的内容转移至硬盘上的一块空间上,以释放内存空间。硬盘上的那块空间叫做交换空间(swap space),而这一过程被称为交换(swapping)。 物理内存和交换空间的总容量就是虚拟内存的可用容量。
 
  用途:
 
  5. 虚拟内存技术
 
  虚拟内存就是说,让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。虚拟内存使用部分加载的技术,让一个进程或者资源的某些页面加载进内存,从而能够加载更多的进程,甚至能加载比内存大的进程,这样看起来好像内存变大了,这部分内存其实包含了磁盘或者硬盘,并且就叫做虚拟内存。
 
  6. 虚拟内存的实现方式有哪些?
 
  虚拟内存中,允许将一个作业分 多次调入内存。采用连续分配方式时,会使相当一部分内存空间都处于暂时或永久的空闲状态,造成内存资源的严重浪费,而且也无法从逻辑上扩大内存容量。因此,虛拟内存的实需要建立在离散分配的内存管理方式的基础上。虚拟内存的实现有以下三种方式:
 
  7. 页面置换算法 8.讲一讲IO多路复用?
 
  IO多路复用是指内核- - 旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。
 
  IO多路复用适用如下场合:
 
  9. 硬链接和软链接有什么区别? 10. 中断的处理过程? 保护现场:将当前执行程序的相关数据保存在寄存器中,然后入栈。开中断:以便执行中断时能响应较高级别的中断请求。中断处理关中断:保证恢复现场时不被新中断打扰恢复现场:从堆栈中按序取出程序数据,恢复中断前的执行状态。 11. 什么是用户态和内核态?
 
  用户态和系统态是操作系统的两种运行状态:
 
  将操作系统的运行状态分为用户态和内核态,主要是为了对访问能力进行限制,防止随意进行些比较危险的操作导致系统的崩溃, 比如设置时钟、内存清理,这些都需要在内核态 下完成。
 
  12. 用户态和内核态是如何切换的?
 
  所有的用户进程都是运行在用户态的,但是我们上面也说了,用户程序的访问能力有限,一些比较重要的比如从硬盘读取数据,从键盘获取数据的操作则是内核态才能做的事情,而这些数据却又对用户程序来说非常重要。所以就涉及到两种模式下的转换,即用户态->内核态->用户态,而唯一能够做这些操作的只有系统调用,而能够执行系统调用的就只有操作系统。
 
  -般用户态->内核态的转换我们都称之为trap进内核,也被称之为陷阱指令(trap instruction)。
 
  13. select、poll 和epoll之间的区别?
 
  (1) select: 时间复杂度O(m)
 
  elect 的核心功能是调用tcp文件系统的poll函数,不停的查询,如果没有想要的数据,主动执行一次调度(防止一直占用cpu),直到有一个连接有想要的消息为止。从这里可以看出select的执行方式基本就是不同的调用poll,直到有需要的消息为止。
 
  (2) poll: 时间复杂度O(n)
 
  poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,但是它没有最大连接数的限制,原因是它是基于链表来存储的。
 
  (3) epoll: 时间复杂度0(1)
 
  epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll 会把哪个流发生了怎样的I/O事件通知我们。所以说epoll实际上是事件驱动(每个事件关联上fd)的。
 
  select, poll, epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪) ,就通知程序进行相应的读写操作。但select, poll, epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
 
  14. 缺页中断会发生什么
 
  进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(即存在位为0),那么停止该指令的执行,并产生一个页不存在的异常,对应的故障处理程序可通过从外存加载该页的方法来排除故障,之后,原先引起的异常的指令就可以继续执行,而不再产生异常。
 
  却也中断的处理:
 
  1、当前执行流程在内核态时:_do_kernel_fault
 
  2、用户进程的缺页中断:_do_page_fault
 

(编辑:我爱资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章