修正时间:10-04
总结一下最近遇到操作系统相关面试题
文章目录
- 1 进程和线程的关系
- 2 线程的优缺点
- 3 为什么会有线程
- 4 外中断和异常的区别
- 5 常见的i+1操作
- 6 父子进程
- 7 线程中return exit pthread_exit 区别
- 8 虚拟地址空间和虚拟内存及其目的
- 9 上下文切换
- 10 进程调度算法了解多少
- 11 Linux进程间通信方式
- 12 内存的覆盖和交换
- 13 动态分区分配算法
- 14 进程状态的切换
- 15 预处理 编译 汇编 链接 (程序运行过程)
- 16 操作系统在对内存进行管理的时候需要做些什么
- 17 读写锁 互斥锁 条件变量 自旋锁
- 18 逻辑地址和物理地址
- 19 回收线程 结束线程 分离线程
- 20 如何让进程后台运行(貌似就用过第一种)
- 21 守护进程、僵尸进程和孤儿进程
- 22 ASCII、Unicode和UTF-8编码的区别
- 23 并发和并行
- 24 阻塞 非阻塞 同步 异步
- 25 同步和异步
- 26 死锁的概念
- 27 死锁的产生条件
- 28 产生死锁的原因
- 29 死锁解决方法
- 30 一个进程可以创建多少线程,和什么有关?
- 快表(待补充)
- 在执行malloc申请内存的时候,操作系统是怎么做(待补充)
- 局部性原理(待补充)
- 原子操作如何实现(待补充)
- 哲学家进餐问题(待补充)
1 进程和线程的关系
-
线程是轻量级进程,也有PCB,创建线程使用的底层函数和进程一样,都是clone(克隆)
-
线程共享本进程的地址空间,而进程之间是独立的地址空间。(如下图)
-
从内核中看进程和线程都一样,都有不同的PCB(如上图)
-
进程可以蜕变成线程
-
线程是最小的执行单位;进程是最小的资源分配单位
-
多进程要比多线程健壮,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。
-
进程切换时,消耗的资源大,效率不高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
-
同一线程共享的有堆、全局变量、静态变量、指针,引用、文件等,而
独自占有栈
-
线程就是寄存器和栈
2 线程的优缺点
优点:
- (1)提高程序的并发性,响应速度更快
- (2)开销小,不用重现分配内存
- (3)通信和共享数据方便
缺点:
- (1)线程不稳定(第三方库函数实现)
- (2)线程调试困难
- (3)等待使用共享资源时造成程序运行速度变慢,主要是一些独占性的资源
- (4)线程的死锁,较长时间的等待或者资源竞争造成死锁
3 为什么会有线程
- 每个进程都有自己的地址空间,即进程空间,在网络或多用户换机下,一个服务器通常需要接收大量不确定数量用户的并发请求,为每一个请求都创建一个进程显然行不通(系统开销大响应用户请求效率低),因此操作系统中线程概念被引进。
4 外中断和异常的区别
- 外中断是指由
CPU 执行指令以外的事件
引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。 - 而异常时由 CPU 执行指令的
内部事件引起
,如非法操作码、地址越界、算术溢出
等。
5 常见的i+1操作
三个指令完成
- 从内存读到寄存器 →寄存器的值加1 →将寄存器的值写会内存
- 非原子操作
6 父子进程
- 实际上在父进程创建子进程之后,父、子进程除了pid外,几乎所有的部分几乎一样。
- 父、子进程共享全部数据,但并不是说他们就是对同一块数据进行操作,子进程在读写数据时会通过写时复制机制将公共的数据重新拷贝一份,之后在拷贝出的数据上进行操作。(简单的说就是:
读时共享 写时复制
) - 如果子进程想要运行自己的代码段,还可以通过调用execv()函数重新加载新的代码段,之后就和父进程独立开了。
7 线程中return exit pthread_exit 区别
- 在网络编程系列博客写过了:[Linux系统编程]进程(二)
8 虚拟地址空间和虚拟内存及其目的
- 之前写过了
- 作用
- 简单的说:逻辑上扩充地址 相互独立 地址有序
9 上下文切换
-
内核管理所有进程控制块,而进程控制块记录了进程全部状态信息。每一次进程调度就是一次上下文切换,所谓的上下文本质上就是当前运行状态,主要包括通用寄存器、浮点寄存器、状态寄存器、程序计数器、用户栈和内核数据结构(页表、进程表、文件表)等。
-
进程执行时刻,内核可以决定抢占当前进程并开始新的进程,这个过程由内核调度器完成,当调度器选择了某个进程时称为该进程被调度,该过程通过上下文切换来改变当前状态。
</