操作系统八股
操作系统
用户态和内核态
内核态(Kernel Mode):CPU可以执行所有的指令和访问所有的硬件资源。有更高的权限
用户态(User Mode):CPU只能执行部分指令集,无法直接访问硬件资源
安全性,稳定性,隔离性
线程和进程
进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
线程组之间只能共享资源
每个进程都有独立的代码和数据空间(程序上下文),每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
协程是一种用户态的轻量级线程,其调度完全由用户程序控制,而不需要内核的参与
进程隔离性独立性,崩溃不会对其他进程产生很大影响
为什么进程之下还要设计线程
多进程的这种方式:进程之间如何通信,共享数据?维护进程的系统开销较大,如创建进程时,分配资源、建立 PCB;终止进程时,回收资源、撤销 PCB;进程切换时,保存当前进程的状态信息;
进程切换和线程切换的区别?
进程切换:进程切换涉及到更多的内容,包括整个进程的地址空间、全局变量、文件描述符等。因此,进程切换的开销通常比线程切换大。
线程切换:线程切换只涉及到线程的堆栈、寄存器和程序计数器等,不涉及进程级别的资源,因此线程切换的开销较小。
线程切换为什么比进程切换快,节省了什么资源
线程切换比进程切换快是因为线程共享同一进程的地址空间和资源,线程切换时只需切换堆栈和程序计数器等少量信息,而不需要切换地址空间
进程的状态(五种状态)
进程上下文
cpu上下文:CPU 寄存器和程序计数器
进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源,会把交换的信息保存在进程的 PCB
进程间通讯
匿名管道,命名管道,消息队列,共享内存,信号量,socket
共享内存怎么实现的
共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中
线程间通讯有什么方式
互斥锁、读写锁、条件变量、自旋锁和信号量
进程调度算法
先来先服务调度算法,最短作业优先调度算法,高响应比优先调度算法,时间片轮转调度算法,最高优先级调度算法,多级反馈队列调度算法
死锁发生条件
资源互斥,持有并等待,不可剥夺,环路等待
操作系统内存管理
虚拟内存可以使得进程对运行内存超过物理内存大小
由于每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的。这就解决了多进程之间地址冲突的问题。
页表里的页表项中除了物理地址之外,还有一些标记属性的比特,比如控制一个页的读写权限,标记该页是否存在等。在内存访问方面,操作系统提供了更好的安全性。
虚拟内存:是操作系统提供给每个运行中程序的一种地址空间,每个程序在运行时认为自己拥有的内存空间就是虚拟内存,其大小可以远远大于物理内存的大小
内存分页由于内存空间都是预先划分好的,所以不会有外部碎片。
但是,因为内存分页机制分配内存的最小单位是一页,所以针对内存分页机制会有内部内存碎片的现象。
内存地址转换
把虚拟内存地址,切分成页号和偏移量;
根据页号,从页表里面,查询对应的物理页号;
直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。
程序的内存布局
代码段,二进制可执行代码;
数据段,已初始化的静态常量和全局变量;
BSS 段,未初始化的静态变量和全局变量;
堆段,动态分配的内存
文件映射段,动态库、共享内存等
栈段,局部变量和函数调用的上下文栈
堆和栈的区别
分配方式:堆又程序员动态分配,栈由系统自动分配
内存管理:堆要程序员手动管理释放
大小;
fork 阶段会复制父进程的页表
copy on write
在修改共享资源时,不直接修改原始数据,而是在新的副本上进行操作,并最终将修改结果写回原始数据,可以容忍读操作并发,但写操作需要互斥执行
操作系统会把主进程的「页表」复制一份给子进程,页表对应的页表项的属性会标记该物理内存的权限为只读。
在发生写操作的时候,操作系统才会去复制物理内存,这样是为了防止 fork 创建子进程时,由于物理内存数据的复制时间过长而导致父进程长时间阻塞的问题
介绍一下brk,mmap
malloc 申请内存的时候,会有两种方式向操作系统申请堆内存。
方式一:通过 brk() 系统调用从堆分配内存(小于 128 KB)
方式二:通过 mmap() 系统调用在文件映射区域分配内存;(大于 128 KB)
操作系统内存不足的时候会发生什么
CPU 就会产生缺页中断
如果没有空闲的物理内存,那么内核就会开始进行回收内存的工作,后台内存回收(异步),直接内存回收(同步),OOM直接兜底杀掉内存最高的进程
回收内收
基于LRU
文件页
回收干净页的方式是直接释放内存,回收脏页的方式是先写回磁盘后再释放内存
匿名页
它们回收的方式是通过 Linux 的 Swap 机制,Swap 会把不常访问的内存先写到磁盘中,然后释放这些内存
页面置换有哪些算法
最佳页面置换算法(OPT)
先进先出置换算法(FIFO)
最近最久未使用的置换算法(LRU)
时钟页面置换算法(Lock)
最不常用置换算法(LFU)
什么是中断?
CPU停下当前的工作任务,去处理其他事情,处理完后回来继续执行刚才的任务
外部中断分为可屏蔽中断和不可屏蔽中断
内部中断分为陷阱、故障、终止
中断的流程
发生中断
中断响应
中断处理
中断作用
处理突发事件,提高工作效率
网络IO模型
阻塞I/O模型
非阻塞I/O模型
I/O复用模型
信号驱动I/O模型
异步I/O模型
服务器处理并发请求有哪几种方式?
单线程web服务器方式
多线程web服务器方式
I/O多路复用web服务器
多路复用多线程web服务器