目录

操作系统 知识点总结

目录

简介:OS 知识点总结

操作系统基础

什么是操作系统?

操作系统本质上是一个运行在计算机上的软件程序 ,主要用于管理计算机硬件和软件资源。

操作系统的功能?

进程管理 存储管理 文件管理 设备管理 网络管理 安全管理

用户态和内核态

什么是用户态和内核态?

用户态进程只能访问用户程序的数据,内核态进程可以访问所有系统资源。

  • 用户态(User Mode) : 用户态运行的进程可以直接读取用户程序的数据,拥有较低的权限。
  • 内核态(Kernel Mode) :内核态运行的进程几乎可以访问计算机的任何系统资源,拥有非常高的权限。

为什么要有用户态和内核态?只有一个内核态不行么?

为了保证系统的安全性、稳定性和性能。

  • 如果只有用户态,应用程序无法访问到受保护的系统资源。
  • 如果只有内核态,所有进程共享系统资源,会造成系统资源冲突,影响系统的性能和安全性。

用户态和内核态是如何切换的?

三种方式:系统调用 中断 异常

  • 系统调用:用户程序主动阻塞
  • 中断:来自于处理器外部
  • 异常:来自于当前指令

系统调用

什么是系统调用?

系统调用是应用程序与操作系统之间进行交互的一种方式,通过系统调用,应用程序可以访问操作系统底层资源例如文件、设备、网络等。

当用户程序需要操作系统级别的资源时,必须通过系统调用的方式向操作系统提出服务请求,并由操作系统代为完成。

系统调用和普通库函数调用非常相似,只是系统调用由操作系统内核提供,运行于内核态,而普通的库函数调用由函数库或用户自己提供,运行于用户态。

分类:设备管理 文件管理 进程管理 内存管理

系统调用的过程了解吗?

  1. 用户程序发起系统调用,并主动进入阻塞态。
  2. CPU收到中断信号,进入内核态,查询中断向量表,执行相应的中断服务程序。
  3. 中断服务程序完成后,返回到用户态,唤醒用户程序。
  4. 用户程序继续执行。

进程和线程

什么是进程和线程?

  • 进程是计算机中正在运行的一个程序实例。是资源分配的基本单位。

  • 线程和进程类似,但是更加轻量。是处理机调度的基本单位。

进程和线程的区别是什么?

  1. 一个进程中可以有多个线程。多个线程共享进程的堆和方法区,但是每个线程有自己的栈空间和程序计数器。
  2. 进程切换开销大,但是有利于资源的管理和保护。线程正相反。

有了进程为什么还需要线程?

  1. 进程切换开销大,线程更加轻量级。
  2. 多线程可以更加充分的利用到多核处理器。
  3. 线程间通讯更加方便,不需要经过内核。

为什么要使用多线程?

  • 硬件层面:现在的CPU核数越来越多,多线程可以更加充分的利用到多核处理器。
  • 软件层面:现在的大型软件并发量越来越大,多线程并发编程正是开发高并发系统的基础。

线程间的同步的方式有哪些?

五种方式:互斥锁(Mutex) 读写锁(Read-Write Lock) 信号量(Semaphore) 屏障(Barrier) 事件(Event)

PCB 是什么?包含哪些信息?

进程控制块:是操作系统中用来管理和跟踪进程的数据结构,每个进程都对应着一个独立的 PCB。

包含:进程的描述信息、调度信息、对资源的需求信息、打开文件表、保存的处理机现场。。。

进程有哪几种状态?

创建 就绪 运行 阻塞 结束

进程间的通信方式有哪些?

匿名管道 命名管道 信号 信号量 消息队列 共享内存 套接字

  • 匿名管道:父子进程或者兄弟进程之间通信。
  • 命名管道:以磁盘文件的方式存在,可以实现任意两个进程通信。
  • 信号:只是一种通知信号。
  • 信号量:Semaphore,用户进程同步和互斥。
  • 消息队列:消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。消息队列存放在内核中,只有在内核重启或者显式地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺点
  • 共享内存:多个进程可以访问同一块内存空间。需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
  • 套接字:用于不同主机的进程间通讯。

进程的调度算法有哪些?

先到先服务算法 短作业优先算法 时间片轮转算法 优先级调度算法 多级反馈队列算法

什么是僵尸进程和孤儿进程?

僵尸进程:进程已经终止,但是PCB和占用的资源没有得到释放。

孤儿进程:子进程仍在运行,但是父进程已经终止或不存在。

僵尸进程 :子进程已经终止,但是其父进程仍在运行,且父进程没有调用 wait()或 waitpid()等系统调用来获取子进程的状态信息,释放子进程占用的资源,导致子进程的 PCB 依然存在于系统中,但无法被进一步使用。这种情况下,子进程被称为“僵尸进程”。避免僵尸进程的产生,父进程需要及时调用 wait()或 waitpid()系统调用来回收子进程。

孤儿进程 :一个进程的父进程已经终止或者不存在,但是该进程仍在运行。这种情况下,该进程就是孤儿进程。孤儿进程通常是由于父进程意外终止或未及时调用 wait()或 waitpid()等系统调用来回收子进程导致的。为了避免孤儿进程占用系统资源,操作系统会将孤儿进程的父进程设置为 init 进程(进程号为 1),由 init 进程来回收孤儿进程的资源。

如何查看是否有僵尸进程?

使用top命令,进程状态为Z

死锁

什么是死锁?

多个进程占有着资源,并请求其他资源。相互等待,形成了循环等待链。导致所有进程无限期阻塞。

产生死锁的四个必要条件是什么?

互斥 请求和保持 非抢占式 循环等待

能写一个模拟产生死锁的代码吗?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class DeadLockDemo {
    private static Object resource1 = new Object();//资源 1
    private static Object resource2 = new Object();//资源 2

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (resource1) {
                System.out.println(Thread.currentThread() + "get resource1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource2");
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + "get resource2");
                }
            }
        }, "线程 1").start();

        new Thread(() -> {
            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
                try {
                    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource1");
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + "get resource1");
                }
            }
        }, "线程 2").start();
    }
}

精简版

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class DeadLockDemo {
    private static Object resource1 = new Object();//资源 1
    private static Object resource2 = new Object();//资源 2

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (resource1) {
                Thread.sleep(1000);
                synchronized (resource2) {
                    //无法进入到这里
                }
            }
        }, "线程 1").start();

        new Thread(() -> {
            synchronized (resource2) {
                Thread.sleep(1000);
                synchronized (resource1) {
                    //无法进入到这里
                }
            }
        }, "线程 2").start();
    }
}

解决死锁的方法

预防 避免 检测 解除

死锁的预防

资源静态分配(打破请求并保持条件):进程必须在执行前就必须申请到所需的全部资源。

资源按序申请(打破循环等待条件):资源只能按照约定好的顺序进行申请。

死锁的避免

银行家算法:在每次资源分配前都判断系统是否会进入到不安全状态

死锁的检测

定时地运行一个 “死锁检测” 的程序,利用资源分配图判断系统内是否出现死锁

死锁的解除

  • 结束所有进程,系统重启
  • 结束所有涉及死锁的进程
  • 逐个结束涉及死锁的进程,直到死锁解除
  • 抢占资源

内存管理

内存管理主要做了什么?

内存的分配与回收 地址转换 内存扩充 内存映射 内存优化 内存安全 …

什么是内存碎片?

内部碎片:已经分配给进程,但未使用的内存空间

外部碎片:未分配给进程,但又无法使用到的内存空间

  • 页式内存管理 会导致 内部碎片
  • 段式内存管理 会导致 外部碎片
  • 段页式内存管理 都会导致

常见的内存管理方式有哪些?

连续内存管理 非连续内存管理

虚拟内存

什么是虚拟内存?有什么用?

虚拟内存(Virtual Memory) 是计算机系统内存管理非常重要的一个技术,本质上来说它只是逻辑存在的,是一个假想出来的内存空间,主要作用是作为进程访问主存(物理内存)的桥梁并简化内存管理。

隔离进程,提高物理内存利用率,简化内存管理,多个进程共享物理内存,提高内存使用安全性,提供更大的可使用内存空间

什么是虚拟地址和物理地址?

程序访存时访问的是虚拟地址,经过内存管理单元转换成物理地址,再访存。

什么是虚拟地址空间和物理地址空间?

  • 虚拟地址空间是虚拟地址的集合,是虚拟内存的范围。每一个进程都有一个一致且私有的虚拟地址空间。
  • 物理地址空间是物理地址的集合,是物理内存的范围。

虚拟地址与物理内存地址是如何映射的?

虚拟地址 = 逻辑页号 + 页内地址

物理地址 = 物理页号 + 页内地址

通过查询页表,将逻辑页号转换成物理页号

分段机制为什么会导致内存外部碎片?

段的长度不固定

单级页表有什么问题?为什么需要多级页表?

使用单级页表会导致页表本身很大,浪费内存空间

TLB 有什么用?使用 TLB 之后的地址翻译流程是怎样的?

TLB是快表,缓存了部分页表。是为了加快地址转换速度

换页机制有什么用?

使得应用程序可以使用的内存空间大于物理内存大小,代价是页面调入调出消耗时间

常见的页面置换算法有哪些?

页面置换算法:用来选择淘汰哪一个物理页的规则

最佳页面置换算法(OPT),先进先出算法(FIFO),最近最久未使用算法(LRU),最不经常使用算法(LFU),时钟置换算法(Clock)

FIFO算法存在Belady异常:页面数增多但缺页率反而提高

分页机制和分段机制有哪些共同点和区别?

共同点:

  1. 都是非连续内存管理方式
  2. 都采用了地址映射的方法,将虚拟地址映射到物理地址,以实现对内存的管理和保护。

区别:

  1. 分页以页作为基本单位,长度固定;分段以段作为基本单位,长度不固定。
  2. 分页会产生内部碎片;分段会产生外部碎片。
  3. 分页机制对程序没有任何要求,程序只需要按照虚拟地址进行访问即可;而分段机制需要程序员将程序分为多个段,并且显式地使用段寄存器来访问不同的段。

局部性原理

时间局部性:当前访问的页,可能会被反复访问。

空间局部性:当前访问的页,附近的页可能也会被访问到。

文件系统

文件系统主要做了什么?

文件系统主要负责管理和组织计算机存储设备上的文件和目录

存储管理,文件管理,目录管理,文件访问控制

硬链接和软链接有什么区别?

硬链接:指向源文件的inode节点,共享同一个文件。

软链接:类似于快捷方式,只是保存了文件路径。

硬链接为什么不能跨文件系统?

因为不同文件系统的inode节点号可能冲突

常见的磁盘调度算法有哪些?

先来先服务算法(FCFS),最短寻道时间优先算法(SSTF),SCAN,C-SCAN,LOOK,C-LOOK