分享面试总结,涉及C++、算法、数据结构、操作系统、计算机网络、Linux、数据库、设计模式 等,后面持续更新~
内容多为收集、整理总结,视频、书籍学习所得,如有错误请指出,万分感谢!!!
※代表高频问题(参考)
操作系统篇— √2
21. 什么时候用多进程?什么时候用多线程?
- 需要频繁创建销毁的优先用线程;
- 需要进行大量计算的优先使用线程;
- 强相关的处理用线程,弱相关的处理用进程;
- 可能要扩展到多机分布的用进程,多核分布的用线程。
22. ※线程比进程具有哪些优势?
- 线程在程序中是独立的,并发的执行流。但进程中的线程之间的隔离程度要小;
- 线程比进程更具有更高的性能,这是由于同一个进程中的线程都有共性:多个线程将共享同一个进程虚拟空间;
- 当操作系统创建一个进程时,必须为进程分配独立的内存空间,并分配大量相关资源。
请网上自行扩展!
23. ※协程是什么?
- 是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程;协程不是被操作系统内核管理,完全是由程序所控制。
- 协程的开销远远小于线程;
- 协程拥有自己寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回来的时候,恢复先前保存的寄存器上下文和栈。
- 每个协程表示一个执行单元,有自己的本地数据,与其他协程共享全局数据和其他资源。
- 跨平台、跨体系架构、无需线程上下文切换的开销、方便切换控制流,简化编程模型;
- 协程又称为微线程,协程的完成主要靠yeild关键字,协程执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行;
- 协程极高的执行效率,和多线程相比,线程数量越多,协程的性能优势就越明显;
- 不需要多线程的锁机制。
24. ※了解哪些锁?
-
互斥锁:线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。互斥锁为资源引入一个状态:锁定/非锁定。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
-
读写锁:读写锁从广义的逻辑上讲,也可以认为是一种共享版的互斥锁。如果对一个临界区大部分是读操作而只有少量的写操作,读写锁在一定程度上能够降低线程互斥产生的代价。
-
递归锁:Mutex可以分为递归锁(recursive mutex)和非递归锁(non-recursive mutex)。可递归锁也可称为可重入锁(reentrant mutex),非递归锁又叫不可重入锁(non-reentrant mutex)。二者唯一的区别是,同一个线程可以多次获取同一个递归锁,不会产生死锁。而如果一个线程多次获取同一个非递归锁,则会产生死锁。
这里总结的不好,后续会更新,包括代码实现。
25. 用户态到内核态的转化原理?
-
系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。 -
异常