说明:
- 面试群,群号: 228447240
- 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
- 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
- 博主与大家一起学习,一起刷题,共同进步;
- 写文不易,麻烦给个三连!!!
- 操作系统篇
1.Linux内核的主要组成部分是什么
答案:
2.线程的同步和互斥的区别和联系
答案:
同步 是指按照一定顺序执行,同步里面包含了互斥;
互斥 是指一个资源只能出现一个进程进行访问,但是互斥没办法按照顺序执行,是无序的。
3.你知道Linux中的特殊进程吗
答案:
Linux下有3个特殊的进程:
idle进程(PID = 0), idle进程是由系统自动创建,运行在内核态。
init进程(PID = 1),init进程是由idle创建运行在用户空间,其父进程就是idle。
kthreadd(PID = 2),内核线程,负责内核线程的创建工作,其父进程就是idle。
4.软中断和硬中断的作用与区别
答案:
硬中断主要用于实时响应硬件设备的请求,而软中断则用于实现操作系统的功能和服务,并处理程序运行过程中的异常情况。
区别:
1.软中断是执行中断指令产生的,而硬中断是由外设引发的。
⒉硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
3.硬中断是可屏蔽的,软中断不可屏蔽。
4.硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。
5.软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。
5.fork和vfork的区别
答案:
- fork()的子进程拷贝父进程的数据段和代码段;vfork()的子进程与父进程共享数据段。
- fork()的父子进程的执行次序不确定;vfork()保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。
- vfork()保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前,子进程依赖于父进程的进一步动作,则会导致死锁。
- 当需要改变共享数据段中变量的值,fork()需要拷贝父进程。
- vfork()中子进程修改全局变量会影响父进程的全局变量。
6.什么是虚拟内存
答案:
虚拟内存是一种内存管理技术,之所以有这个虚拟内存,主要是为了扩张内存,因为我们的这个代码数据什么都是存在硬盘中的,而CPU是没办法直接去拿硬盘的数据,必须借助内存,但是这个内存是有限的,所以在内存不够的时候就会把一部分这个硬盘作为虚拟内存,这样cpu就可以读取虚拟内存的数据。
7.并发编程的三个概念
答案:
原子性问题,可见性问题,有序性问题
原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
可见性:是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
有序性:即程序执行的顺序按照代码的先后顺序执行。
8.说明什么是上下文切换?
答案:
你可以有很多角度,有进程上下文,有中断上下文。
进程上下文:一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
中断上下文:由于触发信号,导致CPU中断当前进程,转而去执行另外的程序。那么当前进程的所有资源要保存,比如堆栈和指针。保存过后转而去执行中断处理程序,快读执行完毕返回,返回后恢复上一个进程的资源,继续执行。这就是中断的上下文。
9.一个进程可以创建多少线程,和什么有关?
答案:
理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上最多只能创建2048个线程。如果要创建多于2048的话,必须修改编译器的设置。
因此,一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定,只要虚拟空间足够,那么新线程的建立就会成功。如果需要创建超过2K以上的线程,减小你线程栈的大小就可以实现了,虽然在一般情况下,你不需要那么多的线程。过多的线程将会导致大量的时间浪费在线程切换上,给程序运行效率带来负面影响。
10.外中断和异常有什么区别?
答案:
外中断 是指由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。
异常 是由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。
11.进程调度算法你了解多少?
答案:
-
先来先服务 first-come first-serverd(FCFS)
非抢占式的调度算法,按照请求的顺序进行调度。
有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。 -
短作业优先 shortest job first(SJF)
非抢占式的调度算法,按估计运行时间最短的顺序进行调度。
长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。 -
最短剩余时间优先 shortest remaining time next(SRTN)
最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。
如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。 -
时间片轮转
将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。
时间片轮转算法的效率和时间片的大小有很大关系:
因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。而如果时间片过长,那么实时性就不能得到保证。
-
优先级调度
为每个进程分配一个优先级,按优先级进行调度。
为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。 -
多级反馈队列
一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,…。进程在第一个队列没执行完,就会被移到下一个队列。
这种方式下,之前的进程只需要交换 7 次。每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。
12.内存交换和覆盖有什么区别?
答案:
交换技术主要是在不同进程(或作业)之间进行,而覆盖则用于同一程序或进程中。
13.动态分区分配算法有哪几种?可以分别说说吗?
答案: