【面试复习】操作系统
1、进程、线程含义,各种的同步方法
进程:最小的资源分配单元,每个进程系统都会给它一个4G大小的虚拟内存,内部可以有多个线程,不同进程之间内存隔离,通信方式:socket,管道,共享内存,信号等
线程:最小的执行单元,共享内存空间,有各自的寄存器空间,指令计数器和处理器状态,通信方式:临界区(公共变量)、锁、条件变量、信号量等
2、虚拟地址空间
每个进程启动时,系统会为它分配一个4G大小的虚拟内存,所有进程共享物理内存,实际上分配虚拟内存时,不会立即分配物理内存,只是建立一个内存映射,等到真正使用时,才会通过缺页中断进行物理内存的分配。
缺页中断:malloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常。
3、锁机制
互斥锁,读写锁,自旋锁,read-copy-update
4、进程状态图
5、静态变量初始化问题
代码块内外的静态变量初始化在代码执行前就初始化;类内的静态成员,在对象第一次使用时初始化
6、用户态、内核态
两种不同的系统运行级别,拥有的权限不同,一般程序都运行在用户态,只有涉及到系统函数调用,中断和异常,才会涉及用户态切换至内核态。
7、内存溢出、内存泄漏
内存溢出:指程序申请内存时,没有足够的内存供申请者使用。
内存泄漏:内存泄漏是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。
8、多线程模型
(1)Future模型 :结果放在将来获取
(2)fork & join 模型:把一个大任务逐级拆分为多个子任务,然后分别在子线程中执行,当每个子线程执行结束之后逐级回溯,返回结果进行汇总合并,最终得出想要的结果。
(3)actor模型:线程间通信通过消息通信,避免了全局变量的使用,actor在接受到消息之后可以自己进行处理,也可以继续传递(分发)给其它actor进行处理。
(4)生产者消费者模型:生产者消费者中间有一块缓存,存放多个线程的生产者的生产消息,多个线程的消费者来消费
(5)master-worker模型:master用来接收消息,分发给worker来消费消息
9、协程
更加轻量级的线程,与线程的不同在于:协程切换的时机,可以自己掌握,可以在代码块的任意位置,协程切换时不存在cpu的控制权的移位,所以开销更小;
10、孤儿进程、僵尸进程
孤儿进程:父进程挂了,子进程就被称为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。
如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。
11、怎么实现线程池
(1)使用生产者消费者模型,也可以使用matser-worker模型,新建一个临界区的任务队列
(2)新建n个消费者(或者woker)取任务队列的任务来消费,如果任务队列为空,所有的消费者(或woker)阻塞等待
(3)生产者生产任务,或者master监听消息,分发任务
(4)新的任务加到任务队列中,通过条件变量唤醒 消费者(或woker)来消费