互联网面试知识点总结(二)- 操作系统篇
- ******************************* 进程调度 *****************************
- 一. 进程的状态
- 二. 进程和线程的区别
- 三. 线程共享哪些变量
- ******************************* 内存管理 *****************************
- ******************************* 文件系统 *****************************
- ****************************** Linux命令 ****************************
- 什么是操作系统
- 并发和并行
- 用户态和内核态
- 系统调用
- 操作系统创建一个新进程的过程?
- 操作系统终止进程的过程?
- 为什么有了进程还要引入线程
- 进程间通信方式
- 常用线程模型
- Linux四种锁机制
- 线程间同步的方式
- CPU调度评价指标
- CPU调度算法
- 实现临界区互斥方法
- 死锁概念
- 死锁的必要条件
- 解决死锁的办法
- 内存管理机制
- 内存管理方式
- 连续内存分配算法
- 分页存储的几个基本概念
- 快表
- 多级页表
- 页式管理与段式管理的异同点
- 内存碎片
- 基本逻辑地址到物理地址的变换过程如下
- 快表中逻辑地址到物理地址的变换过程如下
- 局部性原理表现在以下两个方面
- 为什么要有虚拟地址空间呢?
- 说一说Linux虚拟地址空间
- 虚拟存储器
- 虚拟内存技术的实现
- 缺页中断
- 缺页中断与其他中断区别
- 局部页面置换算法
- Belady现象
- 全局页面置换算法?
******************************* 进程调度 *****************************
一. 进程的状态
进程在其生命周期内,由于系统中个进程之间的相互制约关系以及系统的运行环境的变化,使的进程的状态也在不断地发生着变化。通常进程有以下五种状态。前三种是进程的基本状态
- 运行状态:进程正在处理器上运行。在单处理器的环境下,每一时刻最多只有一个进程处于运行状态
- 就绪状态:进程已处于准备运行的状态,即进程获得了除CPU之外的一切所需资源,一旦得到处理器即可运行。
- 阻塞状态:又称为等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理器),或等待输入输出的完成,即使处理器空闲,该进程也不能运行
- 创建状态:进程正在被创建,尚未转到就绪状态
- 结束状态:进程正在从系统中消失,这可能是进程正常结束或其他原因中断退出运行
二. 进程和线程的区别
- 进程是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发,线程是进程的子任务,是CPU调度和分派的基本单位,用于实现进程内的并发
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程,线程依赖进程而存在
- 进程在执行过程中拥有独立的内存空间,而多个线程共享同一个内存空间(进程的内存空间)
- 在系统开销上,进程创建、撤销和切换的开销远大于线程的开销
三. 线程共享哪些变量
******************************* 内存管理 *****************************
******************************* 文件系统 *****************************
****************************** Linux命令 ****************************
什么是操作系统
- 操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石
- 操作系统本质上是运行在计算机上的软件程序
- 操作系统为用户提供一个与系统交互的操作界面
- 操作系统分内核与外壳(我们可以把外壳理解成围绕着内核的应用程序,而内核可以理解为能直接操作硬件的程序)
PS:内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,决定着系统的性能和稳定性。是连接应用程序和硬件的桥梁。内核就是操作系统背后黑盒的核心
并发和并行
- 并发(concurrency):指宏观上看起来两个程序在同时运行,比如说在单核 cpu 上的多任务。但是从微观上看两个程序的指令是交织着运行的,你的指令之间穿插着我的指令,我的指令之间穿插着你的,在单个周期内只运行了一个指令。这种并发并不能提高计算机的性能,只能提高效率。
- 并行(parallelism):指严格物理意义上的同时运行,比如多核 cpu,两个程序分别运行在两个核上,两者之间互不影响,单个周期内每个程序都运行了自己的指令,也就是运行了两条指令。这样说来并行的确提高了计算机的效率。所以现在的 cpu 都是往多核方面发展。
用户态和内核态
用户态和内核态是操作系统的两种运行级别,两者最大的区别就是特权级不同。用户态拥有最低的特权级,内核态拥有较高的特权级。运行在用户态的程序不能直接访问操作系统内核数据结构和程序。内核态和用户态之间的转换方式主要包括:系统调用,异常和中断
系统调用
操作系统创建一个新进程的过程?
- 为新进程分配唯一一个进程标识符,并申请一个空白的PCB。
- 为进程分配资源,为新进程的程序和数据,以及用户占分配必要的空间。
- 初始化PCB,主要包括初始化标识信息、初始化处理器状态信息和初始化处理器控制信息,以及设置进程的空闲及
- 如果进程就绪队列能够接纳新进程,就将新进程插入到就绪队列,等待被调度运行
操作系统终止进程的过程?
- 根据被终止进程的标示符,检索PCB,从中读出该进程的状态
- 若被终止进程处于执行状态,立即终止该进程的执行,将处理器资源分配给其他进程
- 若该进程还有子进程,则应将其所有子进程终止
- 将该进程所拥有的资源、或归还给父进程或归还给操作系统
- 将该PCB从所在队列(链表)中删除
为什么有了进程还要引入线程
- 从资源上来讲,线程是一种非常"节俭"的多任务操作方式。在 linux 系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式
- 从切换效率上来讲,运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需时间也远远小于进程间切换所需要的时间。据统计,一个进程的开销大约是一个线程开销的 30 倍左右
- 从通信机制上来讲,线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进城下的线程之间贡献数据空间,所以一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便。
进程间通信方式
- 消息队列
消息队列独立于发送与接收数据,进程终止时,消息队列及其内容并不会被删除,消息队列可以实现消息的随机查询,也可以按照消息类型读取 - 信号量
信号量是一个计数器,可以用来控制多个进程对共享资源的访问,用于实现进程间的互斥和同步,而不是存储进程间的通信数据,若要进程间传递数据需要信号量结合共享内存 - 信号
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生 - 共享内存
使得多个进程可以访问同一块内存,但需要依赖互斥锁和信号量 - 套接字
用于不同主机之间进程间的通信 - 匿名管道
匿名管道是半双工的,数据只能在一个方向上传输,只能用于具有亲缘关系的进程之间通信(父子进程或者兄弟进程) - 有名管道
有名管道可以再无关的进程之间传递信息,FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中
详解点击传送门
常用线程模型
- Future 模型
该模型通常在使用的时候需要结合 Callable 接口配合使用。Future 是把结果放在将来获取,当前主线程并