OS面试常问
编码问题
ASCII码规定了128个字符的编码
Unicode 是⼀个很⼤的集合,将世界上所有的符号都纳⼊其中,每⼀个符号都给予⼀个独⼀⽆⼆的编
码。可以容纳100多万个符号;但是存储⽅式不确定,还可能浪费字节空间
Unicode 是⼀个很⼤的集合,将世界上所有的符号都纳⼊其中,每⼀个符号都给予⼀个独⼀⽆⼆的编
码。可以容纳100多万个符号;但是存储⽅式不确定,还可能浪费字节空间
utf-8中中文占几个字节
- 对于单字节,字节的第一位设为0,后面7位位Unicode码,英语字母,UTF-8与ASCII是一样的
- 对于n字节的符号,第一个字节前n位全是1,第n+1位为0,后面字节的前两位为10,剩下的为Unicode码。中文占用三个字节的存储空间。
进程与线程
不同进程的线程间要进行通信需要使用消息通信的方法来实现同步。
线程同步机制
- 互斥锁Mutex:保证同意时间只能有一个线程可以访问共享资源。
- 信号量Semaphore:一种计数器,控制同时访问某个共享资源的线程数量。
- 条件变量Confition Variable:一个线程可以等待某个条件的发生,另一个进程可以在满足条件时,通知等待的线程继续执行。
- 读写Read-Write Lock:允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。
- 原子操作:
- 屏障Barrier:让一组下称在某个点上等待,直到所有进程都到达这个点之后再继续执行。
死锁
四个条件:互斥、请求和保持、不剥夺、环路等待
死锁预防:破坏任一条件
死锁避免:银行家算法、一次封锁法、顺序封锁法
一次封锁法是一种简单的锁定策略,事务在开始时一次性获取所有需要的锁,并在事务结束时一次性释放所有锁。这种方法可以避免死锁,但可能会导致锁的持有时间过长,从而降低系统的并发性能。
顺序封锁法是一种更复杂但更有效的锁定策略,分为两个阶段:扩展阶段和收缩阶段。
- 扩展阶段(Growing Phase):事务可以获取锁,但不能释放锁。
- 收缩阶段(Shrinking Phase):事务可以释放锁,但不能获取新的锁。
这种方法可以确保事务的可串行化,从而保证数据的一致性。
原子操作
如何实现
基于缓存加锁和总线加锁。
总线锁是使用处理器提供的一个lock#信号,当一个处理器在总线上输出这个信号,其他处理器的请求被阻塞。总线吧cpu贺内存之间的通信锁住了,其他处理器不能操作其他内存地址的数据,所以开销很大
缓存锁:频繁使用的内存会在L1、L2、L3高速缓存中,所以原子操作只需要对内部缓存中进行,允许使用MESI缓存一致性机制来保证原子性。
但是以下情况不能使用缓存锁:
- 操作的数据不能被缓存在处理器内部或者操作的数据跨多个缓存行
- 有些处理器不支持缓存锁定
锁的区别和使用场景
互斥锁mutex
特点是任何时刻都只有一个线程可以访问某个资源或者临界区
使用场景:共享资源不能被多个线程同时修改,更新全局变量、修改数据库记录
信号量 Semaphore
控制特定资源的访问线程数
场景:限制链接池大小,控制同时访问文件的线程数
临界区 Critical Section
代码中访问共享资源的部分,保证同时只有一个线程可以执行这段代码
场景:执行多步骤的事务
循环锁 Spinlock
一种忙等待锁,反复检查锁的状态,不会让出CPU资源
场景:时间很短,持有锁时间很短。
读写锁
- 读者优先:读线程可以一直,所有的读线程都释放锁后,写线程才能获得写锁。
- 写着优先:第一个读线程获得锁之后,当写线程到达会被阻塞,但是阻塞过程中新的读线程要排在写线程之后。
- 公平策略:使用队列,读写按照先进先出原则加锁。
内存管理
- 栈:由操作系统自动分配释放,存放函数的参数值,局部变量等
- 堆:一般由程序员分配释放,程序员不释放,程序结束时可能由OS回收,分配方式类似链表
虚拟内存 Virt
抽象层,允许操作系统将硬件内存抽象化,使得每个程序都认为自己有一个连续的、私有的内存区域。内存满了也可以通过swap文件或者分页将部分数据暂存到硬盘上,从而使得程序可以运行在超过物理内存大小的内存空间中。大小 = 程序正在使用的物理内存 + 交换空间 + 未使用但已预留的内存。
常驻内存RES
实际被加载到物理内存中的部分
共享内存 SHR
多个进程共同使用的内存部分,允许不同进程访问同一块物理地址,从而节省内存小号并提高数据交换效率。共享内存常用于进程间通信IPC
Free 内存
系统中完全未使用的内存数量,是系统中真正可用的,没有被其他进程使用的内存。
Available内存
系统中立刻可以分配给进程的内存数量,包括free内存和一部分被缓存的内存。available = free + buff/chche
Buffer
缓冲区适用于存储文件系统元数据的内存。读取/写入文件时,数据首先暂存在Buffers中,来提高读取和写入的效率。
Cached
缓存:用于存储已经从磁盘读取的文件的副本,这些文件可能是系统频繁使用的文件。由Linux内核自动管理,用于提高系统性能。系统有足够的空闲内存时,会将一些文件的副本保留在Cached中。
内存回收
当内存大于pages_high是,系统内存充足不会进行内存回收
当内存小于pages_low时,标识内存存在压力,会触发kswapd0,进行后台内存回收。直到pages_high位置
当内存⼩于 pages_min 时,表⽰此时⽤⼾内存耗尽,会触发直接内存回收,进程被阻塞
OOM⸺Out of Memory 如果直接内存回收之后,系统的剩余空闲内存还不⾜以进⾏内存分配,则会
进⼀步触发OOM机制。 OOM Killer 机制会根据算法选择并kill掉⼀个占⽤物理内存较⾼的进程,以便
释放内存资源,如果物理内存依然不⾜,OOM Killer 会继续杀死占⽤物理内存较⾼的进程,直到释放
⾜够的内存位置。
MMU和TLB
MMU (Memory Management Unit,内存管理单元)
用于在CPU和内存之间实现虚拟内存管理。将虚拟地址转换为物理地址,同时提供访问权限的控制和缓存管理等功能。
TLB 是高所缓存,哟关于缓存页表转换的结果。存在TLB时,虚拟地址到物理地址的转换过程发生了变化,虚拟地址首先发往TLB确认是否命中Cache
Drop Cache
“Drop Cache” 是一种清理系统缓存的方法。系统缓存包括页面缓存、目录项缓存(dentry cache)和inode缓存。
• dirty pages不能回收;
• 共享内存和tmpfs(临时⽂件系统,指位于内存和/或交换分区中的⽂件系统)不能回收(注意观察
free命令显⽰的shared值);
Buddy分配器 & Slab分配器
Buddy系统是⼀种⾼效的内存分配技术,因为它避免了内存空间的碎⽚。伙伴系统确保所有分配的块
具有相同的⼤⼩,以便它们可以轻松地与其伙伴块合并在⼀起。伙伴系统的另⼀个主要优点是它允许
快速分配和释放内存块,这是实时系统中提供增强性能的重要要求。Linux内核中使⽤伙伴系统
(buddy system)算法以⻚为单位管理内存,进⾏内存分配。旨在减少外部碎⽚
Slab 系统 是另⼀种⽤于分配内核内存的技术。 slab内存分配系统的主要优点是它消除了由于内存分配
和释放⽽产⽣的碎⽚。换句话说,slab分配系统是操作系统中⽤来管理内核内存的⼀种内存分配策
略。基本原理是从伙伴系统中申请⼀整⻚内存,然后划分成多个⼤⼩相等的⼩块内存被 slab 所管理。
旨在减少内部碎⽚
内存碎⽚ & 内存整理
内存碎⽚(Memory Fragmentation)是指内存的使⽤效率降低的现象,它分为两种形式:内部碎⽚
(Internal Fragmentation)和外部碎⽚(External Fragmentation)。内部碎⽚发⽣在内存块被分配
出去后,剩余的未使⽤空间⽆法被其他请求利⽤。外部碎⽚则是指多次内存分配和释放后,内存中留
下许多⼩的、不连续的空闲区域,这些区域太⼩,⽆法满⾜新的内存请求,尽管总的空闲内存量可能
⾜够。
Linux内存对碎⽚化的整理算法主要应⽤了内核的⻚⾯迁移机制,是⼀种将可移动⻚⾯进⾏迁移后腾出
连续物理内存的⽅法。在内存碎⽚整理开始前,会在内存区的头和尾各设置⼀个指针,头指针从头向
尾扫描可移动的⻚,⽽尾指针从尾向头扫描空闲的⻚,当他们相遇时终⽌整理。
核心概念
OOM OOM Killer 机制会根据算法选择一个占用物理内存较高的进程,然后将其杀死,以便释放内存资源,如果物理内存依然不足,OOM Killer 会继续杀死占用物理内存较高的进程,直到释放足够的内存位置。
带宽:又叫频宽,是指在固定的的时间可传输的资料数量,亦即在传输管道中可以传递数据的能力。
内存管理单元(MMU)
位宽 :位宽就是内存或显存一次能传输的数据量。简单地讲就是一次能传递的数据宽度,就像公路的车道宽度,双向四车道、双向六车道,当然车道越多一次能通过的汽车就越大,所以位宽越大,一次性能舆的数据就越多,对显卡来说对性能的提高很明显。
PSW:**包含中断是否开放,处理机执行态等状态的寄存器,叫做处理机状态字 PSW**
PCB: 进程控制块
TCB: 线程控制模块
寄存器分类:CS 代码段寄存器, IP 指令指针寄存器,
PC 程序计数器寄存器, PS描述CPU执行状态,主要包含理机当前运行态,处理及优先级,屏蔽外中断等状态
shell不是操作系统的一部分,而是终端与操作系统的接口
硬件驱动:是一个软件,用于驱动硬件
磁道:每个磁头可以读取一段唤醒区域,就是磁道
柱面: 所有的磁道合并就是一个柱面
上下文切换:由一个程序切换到另一个程序
I/O设备:包括设备控制器和设备本身,
文件:抽象磁盘空间
文件描述符:如果访问文件权限许可,则返回一个小整数,若禁止访问,系统将返回一个错误码
管道:一种需文件,可以链接两个进程,进程A要给进程B 发送数据时,要先把它写在管道上,相当于一个输出文件,之后进程B从上面读入并处理
PID 进程识别符
线程切换要切换栈,否则会弹栈错误
切换栈实质就是切换寄存器
基本输入输出系统 BIOS(Basic Input Output System)
每台计算机上有一块双亲板,上面有一个叫做 基本输入输出系统 BIOS(Basic Input Output System),在BIOS里面有底层I/O软件
设备启动,BIOS启动,检测RAM 的数量和基本硬件的是否已经安装并且响应,
之后通过储存在CMOS存储器中的设备清单决定启动设备
之后操作系统来询问BIOS ,以获得配置信息
多路复用:实现时间和空间的复用
面试
什么是操作系统
操作系统是一种系统软件,是软、硬件资源的控制中心,
操作系统提供一个资源集的抽象,并管理这些硬件资源
主要任务是隐藏硬件,呈现给程序的抽象
记录哪个程序在使用什么资源,对资源请求进行评估代价,并且为不同的程序和用户调解互相冲突的资源冲突
功能 :
- 进程和线程的创建以及管理:创建,撤销,阻塞,唤醒,通信
- 存储管理:内存和外存的分配管理
- 文件管理:读写,创建删除
- 设备管理:完成设备请求和释放,还有启动
- 网络管理:
- 安全管理:用户认证,控制访问,文件加密等
。。
线程:
jvm中线程崩溃不会导致进程崩溃,原因是什么
因为JVM自定义了自己的信号处理函数,拦截了SIGSEGV信号
- 用户态和内核态的转换:
- 系统调用
- 中断
- 异常
- 死锁的解除:
- 立刻结束所有进程
- 结束涉及死锁的所有进程
- 逐个撤销涉及死锁的进程
- 抢占资源
- 内存管理:
- 分配回收
- 地址转换
- 扩充
- 映射
- 优化
- 安全
- inode:索引节点,用于存储文件的元信息,包括文件被分为几块,权限,所有者等,每个文件拥有唯一的inode。inode的数量是固定的
- PCB通过列表的方式组织,相同状态的进程链接在一起
- 进程和线程的对比:
- 进程时资源分配的单位和CPU调度的单位
- 线程只享有部分资源,如寄存器和栈
- 线程可以享受进程的公共资源
- 线程切换开销少:
- 线程不涉及资源管理信息
- 线程释放的资源比进程少
- 同一个进程中的线程切换比进程快,因为线程共享想用的地址空间,在一个进程中的所以后线程都构想一个页表。切换时不需要切换表。
- TCP线程控制块
- 线程分类:
- 用户线程:在用户空间实现的线程,由用户态的线程库来管理
- 内核线程:在内核中实现的线程,由内核管理
- 轻量级线程:在内核中来支持用户线程
- 进程调度:
- 调度时机: 就绪态->运行态,运行态->阻塞态,运行态->结束态
- 调度算法:
- 非抢占式调度算法 : 进程阻塞或者结束时才会调用另一个进程
- 抢占式调度算法:对于一个进程,给予一段时间去运行,时间结束后仍然在运行时,将其挂起,会发生时钟中断
- FCFS 先来先服务
- SJF 最短作业优先
- 高响应比优先调度算法
- 时间片轮转
- 进程之间的通信方式:
- pipe linux中 | 会创建两个子进程共同使用一个pipe
- 消息队列:进程发送消息后就可以继续做工作,另一个进程读取到消息进行处理,消息队列是保存在内核中的消息链表,缺点是:通信不及时,附件大小有限制
- 共享内存:拿出一块虚拟地址空间,将其映射到相同的物理内存中,即可做到消除拷贝过程、
- 缺点:多个进程共同修改共享地址会出现冲突
- 信号量:P V 操作 初始量为1时,是互斥操作, 为0时是同步操作
- 信号: 信号 ≠ 信号量,用于处理异常状态下的工作状态
- 锁:
- 忙等待锁(自旋锁):当获取不到锁时,线程会一直等待,不做别的事情,直至得到锁。
- 互斥锁:加锁失败后会释放cpud
DMA
- 用户进程调用 read 方法,向操作系统发出 I/O 请求,请求读取数据到自己的内存缓冲区中,进程进入阻塞状态;
- 操作系统收到请求后,进一步将 I/O 请求发送 DMA,然后让 CPU 执行其他任务;
- DMA 进一步将 I/O 请求发送给磁盘;
- 磁盘收到 DMA 的 I/O 请求,把数据从磁盘读取到磁盘控制器的缓冲区中,当磁盘控制器的缓冲区被读满后,向 DMA 发起中断信号,告知自己缓冲区已满;
- DMA 收到磁盘的信号,将磁盘控制器缓冲区中的数据拷贝到内核缓冲区中,此时不占用 CPU,CPU 可以执行其他任务;
- 当 DMA 读取了足够多的数据,就会发送中断信号给 CPU;
- CPU 收到 DMA 的信号,知道数据已经准备好,于是将数据从内核拷贝到用户空间,系统调用返回;
- 一致哈希算法也用了取模运算,但与哈希算法不同的是,哈希算法是对节点的数量进行取模运算,而一致哈希算法是对 2^32 进行取模运算,是一个固定的值。
我们可以把一致哈希算法是对 2^32 进行取模运算的结果值组织成一个圆环,就像钟表一样,钟表的圆可以理解成由 60 个点组成的圆,而此处我们把这个圆想象成由 2^32 个点组成的圆,这个圆环被称为哈希环,如下图:
内核
现代操作系统,内核一般会提供 4 个基本能力:
- 管理进程、线程,决定哪个进程、线程使用 CPU,也就是进程调度的能力;
- 管理内存,决定内存的分配和回收,也就是内存管理的能力;
- 管理硬件设备,为进程与硬件设备之间提供通信能力,也就是硬件通信能力;
- 提供系统调用,如果应用程序要运行更高权限运行的服务,那么就需要有系统调用,它是用户程序与操作系统之间的接口。
宏内核 : 内核的所有模块都在内核态
微内核:内核只保留基本能力,进程调度,中断等,剩下的放在用户空间
混合内核,是宏内核和微内核的结合体,内核中抽象出了微内核的概念,也就是内核中会有一个小型的内核,其他模块就在这个基础上搭建,整个内核是个完整的程序;
CPU
寄存器:
- 通用寄存器:存放要运算的数据
- 程序寄存器: 来存储下一条要执行的指令所在的内存第
- 指令寄存器:存放指令本身
总线:
- 地址总线: 指定CPU要操作的内存地址
- 数据总线:读写内存的数据
- 控制总线 : 发送和接受信号,中断,设备复位等,CPU响应也需要控制总线
调度
存储
- 寄存器;
- CPU Cache:使用SRAM 静态存储器,断电丢失数据
- L1-Cache; L1 高速缓存通常分成指令缓存和数据缓存。速度几乎和寄存器一样快。每个核心都拥有一个
- L2-Cache;比L2离CPU远,大小更大,每一个核心都有
- L3-Cahce;多核心公用
- 写入策略:
- 写直达(_Write Through_)
- 写回(_Write Back_)只有当Cache 中的数据被替换时,写入内存
Cache一致性-
- 第一点,某个 CPU 核心里的 Cache 数据更新时,必须要传播到其他核心的 Cache,这个称为写传播(_Write Propagation_);使用锁
- 第二点,某个 CPU 核心里对数据的操作顺序,必须在其他核心看起来顺序是一样的,这个称为事务的串行化(_Transaction Serialization_)。
- 使用基于总线嗅探的MESI模型
-
-
- 伪共享: 多个线程同时读写同一个 Cache Line 的不同变量时,而导致 CPU Cache 失效的现象称为伪共享(_False Sharing_)
- 解决:尽量避免这些数据刚好在同一个Cache Line,将他们变成对齐的情况。
- 应用层面解决:
- 内存;DRAM 不断刷新,数据才能被存储起来。
- SSD/HDD 硬盘: SSD:固态硬盘,HDD机械硬盘
伙伴系统:
当可分配内存比所需要内存的二倍还大,那么就将其划分为两个大小为一半一半的空闲分区,重复划分,直到比二倍小就分配给他
分页,分段
分段(Segmentation): 不连续,不等长,相当于是一小段逻辑的程序
- 分段将内存划分为若干段(segments),每个段具有不同的大小和含义。
- 每个段都有自己的基地址和长度。段可以包含代码、数据、堆栈等不同类型的信息。
- 分段允许程序员以逻辑上独立的方式编写程序,并且使得程序的结构更清晰。
- 分段的缺点是会导致内存碎片化,难以管理。
分页(Paging): 连续等长
- 分页将内存划分为固定大小的页面(pages),通常为4KB或者更大。
- 操作系统将进程的虚拟地址空间划分为与页面大小相同的块,称为虚拟页面(virtual pages)。
- 虚拟页面和物理页面(physical pages)之间建立映射关系,操作系统负责管理这些映射。
- 分页的优点是可以更有效地利用内存空间,减少内存碎片化,并且实现了更好的内存保护和共享。
- 解决了外部碎片,但是仍然存在内部碎片
- 页帧:把**物理地址间_**划分为大小相同的基本分配单元
- 页面:把逻辑地址空间也划分为相同大小,基本分配单元
- 页面置换算法:
- 最佳页面置换算法(OPT,Optimal):优先选择淘汰的页面是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现,只是理论最优的页面置换算法,可以作为衡量其他置换算法优劣的标准。
- 先进先出页面置换算法(FIFO,First In First Out) : 最简单的一种页面置换算法,总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。该算法易于实现和理解,一般只需要通过一个 FIFO 队列即可需求。不过,它的性能并不是很好。
- 最近最久未使用页面置换算法(LRU ,Least Recently Used):LRU 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。LRU 算法是根据各页之前的访问情况来实现,因此是易于实现的。OPT 算法是根据各页未来的访问情况来实现,因此是不可实现的。
LRU算法的弊端:
使用链表:最近使用的数据如果存在,就将其放在头部,如果不存在,就读取数据并放入头部,并删除尾部数据。
预读机制:读入数据时,会把相邻的数据一起读入(空间局限性)
- 缓存失效:被预读的数据没有访问,而且把尾部的数据删除,降低了命中率。 解决:实现两个链表,分别存储热数据和冷数据,分别进行LRU算法。预读部分放入冷数据链表,当真正访问时,放入热数据链表
- 缓存污染:当批量读取数据时,大量数据被放入热数据LRU链表,会导致之前的热点数据失效。解决:提高进入活跃LRU链表的门槛
最少使用页面置换算法(LFU,Least Frequently Used) : 和 LRU 算法比较像,不过该置换算法选择的是之前一段时间内使用最少的页面作为淘汰页。
时钟页面置换算法(Clock):可以认为是一种最近未使用算法,即逐出的页面都是最近没有使用的那个。
局部性原理是指在程序执行过程中,数据和指令的访问存在一定的空间和时间上的局部性特点。其中,时间局部性是指一个数据项或指令在一段时间内被反复使用的特点,空间局部性是指一个数据项或指令在一段时间内与其相邻的数据项或指令被反复使用的特点。
虚拟内存的作用
- 使得进程对云翔内存超过物理内存大小,可以把不经常使用的内存换到物理内存之外
- 每一个进程有自己的页表,所以每个进程的虚拟内存空间时相互独立 的,解决了多进程之间的地址冲突
- 页表中还存在着一些标记属性的bit,如控制一个页的读写权限,为操作系统提供更好的安全性
如果没有空闲的物理内存,那么内核就会开始进行回收内存的工作,回收的方式主要是两种:直接内存回收和后台内存回收。
- 后台内存回收(kswapd):在物理内存紧张的时候,会唤醒 kswapd 内核线程来回收内存,这个回收内存的过程异步的,不会阻塞进程的执行。
- 直接内存回收(direct reclaim):如果后台异步回收跟不上进程内存申请的速度,就会开始直接回收,这个回收内存的过程是同步的,会阻塞进程的执行。
- OOM 选择一个占用物理内存高的进程,将其杀死,如果不够,重复杀死
- 文件页:脏页将其写回磁盘中,再释放, 干净页直接回收内存
- 匿名页:没有实际载体的文件,将其不常访问写回磁盘
进程
进程控制块 PCB Process Control Block
描述了进程的标识,空间运行状态,资源使用等信息
PCB是进程存在的唯一标志
每个进程都在操作系统中有一个对应的PCB
操作系统建立一个表格用于描述该进程的存在和状态,这个表格就叫做进程控制块
- PCB 使用链表和索引表
- 同一个状态的进程进入一个链表
- 索引表指向PCB
PCB的使用
进程创建:生成该进程的PCB
进程终止:回收它的PCB
进程的状态:
创建状态、运行态、就绪态、阻塞态、结束状态
需要一个新的状态,来描述进程没有占用实际的物理内存空间的情况,这个状态就是挂起状态。
- 阻塞挂起状态:进程在外存(硬盘)并等待某个事件的出现;
- 就绪挂起状态:进程在外存(硬盘),但只要进入内存,即刻立刻运行;
进程创建
主要的事件:系统初始化,正在运行的程序执行了创建进程的系统调用,用户请求创建一个进程,一个批处理作业的初始化
进程执行
进程等待
进程抢占
进程唤醒
进程结束
核心状态:运行状态,就绪状态,等待状态,创建状态,结束状态
进程挂起:
处于挂起状态的进程映射在磁盘上,目的是减少进程占用内存
等待挂起状态等待挂起状态
就绪挂起状态 进程在外存,但只要进入内存即可运行
线程
概念:线程是进程的一部分,描述指令流执行状态。是进程中指令执行流的最小单元,是CPU 调度的基本单位
线程 = 进程 - 共享资源
进程 = 资源+多组线程
- 优点: 1. 一个进程可以有多个线程2.各个线程之间 2.线程之间可以并发。3. 线程之间可以共享地址和文件资源
- 缺点:一个线程崩溃 会导致所属的进程的所有线程崩溃
中断
为了避免由于中断处理程序执行时间过长,而影响正常进程的调度,Linux 将中断处理程序分为上半部和下半部:
- 上半部,对应硬中断,由硬件触发中断,用来快速处理中断;
- 下半部,对应软中断,由内核触发中断,用来异步处理上半部未完成的工作;
优点:
- 提高CPU效率
- 实时处理
- 故障处理
- 实现分时擦欧总
中断的来源是外设,异常是应用程序请求的,属于系统调用
系统调用
每一个系统调用都需要切换堆栈,系统调用是操作系统提供给用户态程序的接口,用于调用内核。
自陷指令: 能够产生异常的指令
并发与并行:
并行:两个进程一起进行,单核处理器中不能够并行,多核才可以
并发:单核处理器合理的处理任务的操作,也就是多线程,并不能同时进行多个任务
进程之间的关系:相互独立和相互制约
制约: 同步和互斥