操作系统知识点整理(持续更新)

基础概念

  • 操作系统的四个特性
1. 并发: 同一时间间隔内支持执行多个任务, 对于一个核则是交替执行;
2. 共享: 硬件资源或数据资源支持多个进程共享;
3. 异步: 并发情况下, 一个程序会陆陆续续被执行,完成时间不可预知;
4. 虚拟: 物理实体转化为逻辑实体,如虚拟内存。
  • 操作系统的基本功能
1. CPU管理, 作业调度
2. 存储管理, 数据存取
3. 设备管理, 与外围设备交互
4. 接口管理, 向应用程序/用户提供交互接口
  • 软中断与硬中断
系统在执行某个任务程序时收到中断信号, 需要让出当前CPU来执行中断处理。中断处理完成后,CPU再继续执行之前的任务程序。
1. 软中断:
>当前运行的程序产生的中断信号,通常是I/O请求;
>不会直接中断CPU,需要内核去为当前进程完成一些类似I/O的请求;
>中断过程: 进程->内核设备驱动程序。
2. 硬中断:
>由硬件产生,比如磁盘,网卡,时钟,键盘等;
>直接中断CPU,通常一个中断只中断一个CPU;
>中断过程: 硬件->CPU->内核设备驱动程序。
3. 中断优先级:
硬件错误>时钟>磁盘>网络设备>其他终端设备>软件中断
  • 动态链接及静态链接
动态链接: 在程序运行期间, 所依赖的模块来自于程序外部,在内存中动态加载/卸载,按需加载可节省内存;
静态链接: 在程序运行期间, 所依赖的模块来自于程序内部,即编译时已打包好,程序启动时便会载入内存。

进程管理

  • 进程的状态类型与转换
    5个状态模型:
    process_state
  • 进程与线程的区别
概念区别:
1. 进程: 一个程序的动态执行过程, 分配资源的基本单位;
2. 线程: 一个进程内调度的基本单位,一个进程包含一个或多个线程。
执行区别:
1. 进程:拥有独立内存空间,支持内部多个线程共享;
2. 线程:必须依赖于进程来运行,每个线程有独立入口/执行序列/出口。
应用意义区别:
一个应用运行时对应一个或多个进程, 而线程在进程的基础上提供了可以执行不同调度逻辑的入口,易于实现任务的并发执行。
  • 进程间通信的几种方式
1. 管道pipe
管道是独立的文件系统,有自己的数据结构。实际上是只存在于内存中的文件,需要通过两个打开的文件句柄来进行操作,他们分别表示管道的两端。管道分为无名管道和有名管道。
2. 共享内存
共享内存由一个进程创建, 能被其他进程访问, 最快的IPC方式。
3. 消息队列
消息的链表, 存放于内核并由队列标识符标识;克服了缓冲区大小受限,信号信息有限,管道无格式字节流等缺点。
4. 信号
用于通知某个进程某个事件已经发生,可触发进程已注册的处理函数。
5. 信号量
一种计数器,用来控制多个进程对共享资源的访问, 通常作为一种锁机制, 常应用于进程间或进程内多个线程的同步。
6. Socket
通过套接字通信,也可用于不同host之间的进程见通信。
  • 进程同步,线程同步的几种方式
1. 临界区(CriticalSection)(进程内线程同步)
一次只能被一个进程所占用的资源为临界资源;进程内访问临界资源的代码就是临界区。
进入区/临界区/退出区/剩余区
2. 事件
基于事件机制, 一个进程/线程主动唤醒另一个进程/线程;比如监听通信端口A。
3. 互斥量(Mutex)
类似临界区,但是能在进程间使用。Futex由一块能被多个进程共享的内存空间(对齐后的整型变量)组成, 保存在用户空间的共享内存中,通过原子操作进行操作。操作基本在用户空间内进行(需要仲裁时使用系统内核调用), 减少了系统调用次数, 提供系统性能。
4. 信号量(Semphore)
信号量建立在原子操作上,使用信号量可以用来限制共享资源的线程数目。
  • 线程的实现方式
用户级线程(也可看作协程):进程内的线程切换不用切换到内核进行, 内核并没有感知进程内的线程存在, 所以即使多线程并不能利用多核来进行操作。一个线程如果调用了阻塞系统调用, 那整个进程都会被阻塞。
内核级线程(通常所说的线程):也即内核管理的所有线程, 内核头既包含进程表, 也包含线程表。多线程可以利用到多核,多核下微观和宏观下都能做到并行。
混合模式: 内核线程可以在用户空间完成创建,应用的多个用户级线程可以被映射到内核线程中,提高并发效率。
  • 用户态与内核态的区别
用户态:执行用户级别的代码,权限受限,由CPU标志flag来控制;
内核态:执行内核模块代码,比如执行磁盘IO,网络IO处理等。
应用进程可通过系统调用由用户态进入内核态,在缺页错误或中断发生时进入内核态。
  • 用户栈与内核栈的区别
用户栈: 进程在用户空间时创建的栈,比如函数调用时压栈出栈, 保存了函数互相调用的参数/返回值等;
内核栈: 中断进入内核态时,用内核栈来保存用户态进程的状态信息,返回用户钛再将这些信息出栈;内核栈位置在内核的一块固定区域,保存中断现场,进程调用数据等。
  • 内存池,进程池,线程池
所谓池的概念, 一般是指应用提前向内核批量申请资源,用于接下来的使用和回收再利用, 减少资源的初始化和销毁次数等开销, 以达到提高系统性能的目标。
内存池:真正使用前申请一片内存区域,有新需求时取出其中一部分使用,不够用时再重新申请新内存。
进程池:
>应用预先创建一组子进程,所有子进程运行相同代码,拥有相同属性,比如PGID和优先级等;
>常见两种工作方式:
1. 主进程通过随机或round robin算法来选择子进程作为新任务的服务进程;
2. 通过一个共享队列来进行同步,所有子进程从该队列中获取任务,不过同时只能有一个子进程能成功获得新任务处理权。
线程池:
主要应用于任务小而多,处理时间短的场景,比如简单网页请求等。
  • 死锁的概念,产生条件及处理策略
死锁:一组竞争同一系统资源或通信的进程由于互相等待而造成的永久阻塞。
产生死锁的四个条件:
1. 互斥: 一次只能有一个进程使用一个资源。
2. 占有并等待: 一个进程等待另一个资源的同时占有一个已分配的资源。
3. 不可抢占: 一个已被某个进程占有的资源不可被其他进程抢夺。
4. 循环等待: 在一个封闭进程链中,每个进程至少占有下一个进程所等待的资源。
处理死锁几种方式:预防/避免/检测,比如一次性申请所需资源,银行家算法。
  • 进程调度算法
调度种类:
1. 高级调度: 作业调度,决定把后备作业调入内存运行;
2. 中级调度: 内存,外存交换区进行进程对换;
3. 低级调度: 进程调度,决定把就绪状态的进程获得CPU。
CPU任务种类: 交互式任务和批处理任务。
调度算法:
1. FIFO(FCFS): 公平简单,不利于交互式,不利于IO密集型作业;
2. SJF:短作业优先调度,可以保证整体的最小等待时间,但不利于长作业;
3. 优先权调度:拥有高优先权的作业优先处理, 有可能出现优先权低的任务“饥饿”情况;
4. Round-Robin:按时间片进行轮转调度,让每个任务定时有响应但是上下文切换次数可能会过多。
5. 多级优先级队列:按不同规则创建多个进程队列,不同队列拥有不同的优先级以及可以分配不同的时间片/调度策略。但是也存在”饥饿“可能性。
6. 多级反馈队列:在多级优先级队列基础上,长期得不到运行的队列优先级会被提高。

内存管理

  • 内存管理的技术发展
1. 固定分区:系统初始化阶段,内存被固定划分成多个静态分区,进程可以一次性被装载到大于或等于自身空间的分区;
2. 动态分区:动态创建分区,进程可以被装载到与自身相等大小的分区中;
3. 虚拟内存分页:系统初始化阶段,内存被划分为多个大小一致的页框;每个进程被划分成多个与页框相等的页;根据实时需要加载一定数量的页。
4. 虚拟内存分段:每个进程维护一个段表,系统维护一个空闲的块表,按需加载段。
5. 段页式: 单按页加载的调度粒度太细,单按段加载的调度粒度太粗, 结合使用可有效提高系统性能。应用地址空间可划分成多个段,每个段又划分为多个固定大小的页,段偏移量在系统角度可看作是指定段中的一个页好和页偏移。
  • 物理内存与虚拟内存
物理地址:实际物理内存中的存储地址;
虚拟地址: 编码时将代码或数据分成若干段,每条代码或数据对应的地址由段号加段内偏移地址构成。
MMU: 实现将虚拟地址映射到物理地址的CPU中的硬件电路。
  • 几种页面置换算法
FIFIO: 淘汰最早调入的页面;
OPT: 理想化的最佳置换算法,将标记为下次最迟才会被访问的页面淘汰;
LRU: 将最近一段时间内最久没有被使用的页置换出去。
  • DMA定义及工作流程
DMA指外部设备不经过CPU而直接与内存交换数据的技术。
主要通过DMA控制器来实现: 控制器向CPU请求系统总线并获得控制权后, 与存储器直接进行数据交换, 完成后向CPU发送结束信号并交还控制权。
  • 外存分配的几种方式
外存:CPU缓存及内存以外的存储器, 如硬盘/光盘等。
分配方式:
1. 连续分配:创建文件时,分配一组连续的块, FAT中每个文件只需要一项,用以说明起始块及文件大小。
2. 链式分配: 文件存放在若干不连续的物理块,各块之间通过指针连接。
3. 索引分配: 每个文件在FAT中有一个一级索引, 包含文件各个分区的入口;这个索引信息保存在单独个一个块当中, 作为文件的访问入口。
  • CPU中的缓存及OS中的缓存
CPU缓存: 介于CPU与内存之间的临时存储器, 有一级/二级/三级缓存之分;
系统缓存: 如块表,用于存放当前访问最频繁的少量活动页,提高数据存取速度。通过需要存取的数据所在逻辑地址,在块表中找到其对应的内存块地址, 结合其页偏移地址获得物理地址;如果块表中没有该逻辑页号,则通过查询空闲块来更新块空闲区信息;如果块表没有空闲区,则通过算法来淘汰块表中某一行,并填入新的空闲区。

猜你喜欢

转载自blog.csdn.net/moxiaomomo/article/details/78455556