操作系统常见面试问题
三年前学的东西差不多都忘了,复试临时准备一下,不看底层实现(最后还是老老实实滚去看电路板了)只看逻辑
1.进程(process)和线程(thread)
进程是系统中拥有资源和独立调度的基本单位,一个进程可以包括多个线程。
进程有自己的内存空间,其线程可以共享内存。进程间通信则需要IPC(进程间通信)。
此外同一进程内的线程切换比进程切换的开销小很多。
2.核心态(Kernel Mode 坚果仁态)和用户态(User Mode)
在CPU中运行的操作系统程序和用户程序对应的机器指令集是不同的。操作系统程序使用所有指令,但用户程序只能使用部分指令。
从资源管理和程序控制执行的角度出发,将指令系统分为两大部分:特权指令和非特权指令。在程序执行时,根据执行程序对资源和机器指令的使用权限,把机器设置为两个状态:核心态和用户态。
也就是说,当系统处于核心态时,就可以使用所有指令、资源,并具备改变CPU状态的能力;而当CPU在用户态时,只能使用非特权指令。
如果CPU执行用户程序时(用户态)出现了中断,系统将自行转到中断处理程序,CPU就由用户态转换到核心态;中断处理结束后,返回继续执行用户程序,此时CPU又由核心态转到用户态。
那么用户态和核心态之间的区别是什么呢?(以下区别摘至《UNIX操作系统设计》)
- 用户态的进程能存取它们自己的指令和数据,但不能存取内核指令和数据(或其他进程的指令和数据)。然而,核心态下的进程能够存取内核和用户地址
- 某些机器指令是特权指令,在用户态下执行特权指令会引起错误
此处牵引出另外一个概念:用户级线程和内核级线程
在传统的操作系统中,是不支持内核级线程的(只有内核进程,出于安全没有把线程这个新生事物放入到内核中),每次都是一个进程去到一个CPU核心(但是多核CPU仍然可以处理多个进程),因此用户级线程是对内核透明的,也做不到进程那样的时间片轮转调度(时间一到直接停你进程,线程都得一块停),此时的线程管理全部交给用户态做,且可以用jacket进行优化效率
在如今的多核CPU/多CPU支持内核级线程的情况下(实际上的意思是线程对于内核可见了,内核可以接手线程管理),那就可以多个内核级线程并行运行了。不会再出现同一个进程下的线程一损俱损的情况了。缺点是:让内核来调度线程的话会出现切换线程得经历用户态到核心态的切换,代价更大
然而在今天的操作系统中,常见的操作是 n个用户态线程----映射到---->1个内核态线程 算是一个折中方案
3.中断
①内部异常中断
计算机硬件异常或故障引起的中断
②软(件)中断(指令中断)
程序中执行了引起中断的指令而造成的中断,比如用户态到内核态的系统调用就是使用了访管指令
③外中断(强迫中断)
外设请求的中断