基础知识 之 操作系统

本文探讨了操作系统的关键模块,包括进程线程的区别、进程通信方式、僵尸进程处理、PV信号量、死锁及其避免策略,以及内存管理的页存储、段存储和段页存储。此外,还讲解了页面置换算法(如LRU、OPT和CLOCK)、I/O种类与控制方式,以及select和epoll的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# **概述**
操作系统概述: 操作系统用来协调软件与底层硬件,相当于彼此的接口 操作系统有**进程管理,内存管理,文件管理,输入输出管理**。 
内存管理的功能有: 

 - 内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高 编程效率。 
 - 地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供 地址变换功能,把逻辑地址转换成相应的物理地址。 
 - 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。 
 - 存储保护:保证各道作业在各自的存储空间内运行,.互不干扰。

----------
# **1 进程线程**

----------


## **1.1.进程线程区别**
**进程是系统进行资源分配和调度的一个独立单位,最小的资源管理单位。**
**线程**是进程的一个实体, 是 **CPU 调度和分派的基本单位**,它是比进程更小的能独立运行的基本单位,**最小的 CPU 执行单元**。 
线程拥有的资源:程序计数器 寄存器 栈 状态字

----------
## **1.2 进程通信方式**

 

> 共享内存:共享内存可以说是最有用的进程间通信方式,也是最快的 IPC 形式。两个不同进程 A、B 共享内存
> 的意思是,同一块物理内存被映射到进程 A、B 各自的进程地址空间。进程 A 可以即时看到进程 B 对共享内存中数据的
> 更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。

----------
## **1.3 僵尸进程**
1 什么是僵尸进程:
当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为 一个僵尸进程。 
  
**2 怎样来清除僵尸进程:**
1.改写父进程,在子进程死后要为它收尸。具体做法是接管 SIGCHLD 信号。子进程死后,会发送 SI GCHLD 信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原 理:就算父进程没有调用 wait,内核也会向它发送 SIGCHLD 消息,尽管对的默认处理是忽略,如果 想响应这个消息,可以设置一个处理函数。 
  
2.把父进程杀掉。父进程死后,僵尸进程成为”孤儿进程”,过继给 1 号进程 init,init 始终会负责清理 僵尸进程.它产生的所有僵尸进程也跟着消失。

----------

## **[1.4 进程同步 PV 信号量](https://blog.csdn.net/leves1989/article/details/3305609)**

首先应弄清 PV 操作的含义:PV 操作由 P 操作原语和 V 操作 原语组成(原语是不可中断的过程),对信号量进行操作,具体
定义如下: 
P(S):
①将信号量 S 的值减 1,即 S=S-1; 
②如果 S≥0,则该进程继续执行;否则该进程置为等待状 态,排入等待队列。 
V(S):
①将信号量 S 的值加 1,即 S=S+1; 
②如果 S>0,则该进程继续执行;否则释放队列中第一个 等待信号量的进程。 
  

**PV 操作的意义:**
我们用信号量及 PV 操作来实现进程的同步和 互斥。PV 操作属于进程的低级通信。
  
**什么是信号量?**
信号量(semaphore)的数据结构为一个值 和一个指针,指针指向等待该信号量的下一个进程。信号量的值 与相应资源的使用情况有关。当它的值大于 0 时,表示当前可用 资源的数量;当它的值小于 0 时,其绝对值表示等待使用该资源 的进程个数。注意,信号量的值仅能由 PV 操作来改变。
一般来说,信号量 S≥0 时,S 表示可用资源的数量。执行一 次 P 操作意味着请求分配一个单位资源,因此 S 的值减 1;当 S <0 时,表示已经没有可用资源,请求者必须等待别的进程释放 该类资源,它才能运行下去。而执行一个 V 操作意味着释放一个 单位资源,因此 S 的值加 1;若 S≤0,表示有某些进程正在等待 该资源,因此要唤醒一个等待状态的进程,使之运行下去。

----------
# **2 死锁**

 

 

 

 

 

----------
## **2.1 死锁避免-银行家算法**
我们可以把[操作系统](https://baike.baidu.com/item/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/192)看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资 源相当于用户向银行家贷款。

为保证资金的安全,银行家规定: 
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; 
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量; 
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间 里得到贷款; 
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量, 如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请 资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前 的申请量分配资源,否则也要推迟分配。

----------
## **2.2 死锁避免-安全序列**
安全序列 安全序列是指对当前申请资源的进程排出一个序列,保证按照这个序列分配资源完成进程,不会发生“酱油和醋”的尴尬问题。 
我们假设有进程 P1,P2,.....Pn 则安全序列要求满足:
***Pi(1<=i<=n)需要资源<=剩余资源 + 分配给 Pj(1 <= j < i)资源***

> 为什么等号右边还有已经被分配出去的资源?
想想银行家那个问题,分配出去的资源就好比第二个开发商,人家能还回来钱,咱得把这个考虑在内。

----------
# **3 同步 异步 阻塞 非阻塞**

线程同步与阻塞的关系

 - 线程同步与阻塞没有一点关系
 - 同步和异步关注的是消息通信机制(synchronous communication/ asynchronous
   communication)。 所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得
   到返回值了。换句话说,就是由*调用者*主动等待这个*调用*的结果。而异步则是相反,*调用*在发出之
   后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻 得到结果。而是在*调用*发出后,
   用者*通过状态、通知来通知调用者,或通过回调函数处理这个调 用。
 - 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。阻塞调用是指调用结果返回之前,
   当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调 用不会阻塞当前线程

其实,这两者存在本质的区别,它们的修饰对象是不同的。阻塞和非阻塞是指进程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就 绪时是直接返回还是等待就绪。
而同步和异步是指消息通信机制,同步一般指主动请求并等待 I/O 操作完毕的方式,当数据就 绪后在读写的时候必须阻塞,异步则指主动请求数据后便可以继续处理其它任务,随后等待 I/O,操作完毕的通知,这可以使进程在数据读写时也不阻塞。

----------
# **4 操作系统 CPU 调度算法**
由于要执行的进程的数目是多于处理器的数目,所以需要处 理器去决定下一次运行哪个进程 
进程就是作业
1.**先来先服务调度算法(FCFS)**:就是按照各个作业进入系统的自然次序来调度作业。这种调度算法 的优点是实现简单,公平。其缺点是没有考虑到系统中各种资源的综合使用情况,往往使短作业的用户不 满意,因为短作业等待处理的时间可能比实际运行时间长得多。
2.**短作业优先调度算法 (SPF)**: 就是优先调度并处理短作业,所谓短是指作业的运行时间短。而 在作业未投入运行时,并不能知道它实际的运行时间的长短,因此需要用户在提交作业时同时提交作 业运行时间的估计值。
3.**最高响应比优先算法(HRN)**:FCFS可能造成短作业用户不满,SPF 可能使得长作业用户不满, 于是提出 HRN,选择响应比最高的作业运行。响应比=1+作业等待时间/作业处理时间。 
4. **基于优先数调度算法(HPF)**:每一个作业规定一个表示该作业优先级别的整数,当需要将新的作业由输入井调入内存处理时,优先选择优先数最高的作业。
5. **时间片轮转调度算法** 时间片轮转调度算法主要适用于分时系统。在这种算法中,系统将所有就绪进程按到达时间的先后次序排成一个 队列,进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片,如 100ms。 在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺 的进程返回到就绪队列的末尾重新排队,等候再次运行。

----------
# **5 内存管理方式(页存储 段存储 段页存储)**

----------


## **页存储**
为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,记录页 面在内存中对应的物理块号,页表一般存放在内存中。在配置了页表后,进程执行时,通过查找该表, 即可找到每页在内存中的物理块号。可见页表作用是实现从页号到物理块号的地址映射,这种是页存储管理方式。
如下图所示:

## **段存储**
将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分 配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配,这种是段存储管理方式。
如下图所示:

## **段页存储**
作业的地址空间首先被分成若干个逻辑分段,每段都有自己的段号,然后再将每段分成若干个大 小相等的页。对于主存空间也分成大小相等的页,主存的分配以页为单位,这种是段页存储管理方式。
如下图所示:

 

 

 

----------
# **6 页面置换算法**

----------


## **6.1 概念**
### **[缺页中断](https://baike.baidu.com/item/%E7%BC%BA%E9%A1%B5%E4%B8%AD%E6%96%AD/5029040)**
缺页中断就是要访问的页不在主存,需要操作系统将其调入主存 后再进行访问。
### **页面置换算法**
在地址映射过程中,若在页面中发现所要访问的页面不在内 存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面, 则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出 空间。而用来选择淘汰哪一页的规则叫做页面置换算法。
## **6.2 OPT 最优页面置换算法**
寻找在将来的时间段内,最晚被访问到的页面,然后将其置换到。(无法预 知未来,不现实) 
## **6.3 先进先出置换算法(FIFO)**
最简单的页面置换算法是先入先出(FIFO)法。这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。 
## **6.4 最近最久未使用(LRU)算法**
它的实质是,当需要置换一页时,选择在最近一段时间里最久没有使用过 的页面予以置换。这种算法就称为最久未使用算法(Least Recently Used,LRU) 
LRU 算法是经常采用的页面置换算法,并被认为是相当好的,但是存在如 何实现它的问题。LRU 算法需要实际硬件的支持。其问题是怎么确定最后使用 时间的顺序,对此有两种可行的办法:
1.计数器。最简单的情况是使每个页表项对应一个使用时间字段,并给 CPU 增加一个逻辑时钟或计数器。每次存储访问,该时钟都加 1。每当访问一个页面 时,时钟寄存器的内容就被复制到相应页表项的使用时间字段中。这样我们就可 以始终保留着每个页面最后访问的“时间”。在置换页面时,选择该时间值最小的 页面。这样做,不仅要查页表,而且当页表改变时(因 CPU 调度)要维护这个页表中的时间,还要考虑到时钟值溢出的问题。 
2.栈。用一个栈保留页号。每当访问一个页面时,就把它从栈中取出放在栈 顶上。这样一来,栈顶总是放有目前使用最多的页,而栈底放着目前最少使用的 页。由于要从栈的中间移走一项,所以要用具有头尾指针的双向链连起来。在最 坏的情况下,移走一页并把它放在栈顶上需要改动 6 个指针。每次修改都要有开 销,但需要置换哪个页面却可直接得到,用不着查找,因为尾指针指向栈底,其 中有被置换页。
## **6.5 时钟(CLOCK)置换算法**
简单的 CLOCK 算法是给每一帧关联一个附加位,称为使用位。当某一页首次装 入主存时,该帧的使用位设置为 1;当该页随后再被访问到时,它的使用位也被置 为 1。对于页替换算法,用于替换的候选帧集合看做一个循环缓冲区,并且有一 个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区中的下一帧。 当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为 0 的一帧。每当 遇到一个使用位为 1 的帧时,操作系统就将该位重新置为 0;如果在这个过程开 始时,缓冲区中所有帧的使用位均为 0,则选择遇到的第一个帧替换;如果所有 帧的使用位均为 1,则指针在缓冲区中完整地循环一周,把所有使用位都置为 0, 并且停留在最初的位置上,替换该帧中的页。由于该算法循环地检查各页面的情 况,故称为 CLOCK 算法,又称为最近未用(Not Recently Used, NRU)算法。
CLOCK 算法的性能比较接近 LRU,而通过增加使用的位数目,可以使得 CLOCK 算法更加高效。在使用位的基础上再增加一个修改位,则得到改进型的 CLOCK 置换算法。这样,每一帧都处于以下四种情况之一:
1. 最近未被访问,也未被修改(u=0, m=0)。 
2. 最近被访问,但未被修改(u=1, m=0)。 
3. 最近未被访问,但被修改(u=0, m=1)。 
4. 最近被访问,被修改(u=1, m=1)。
算法执行如下操作步骤: 
1. 从指针的当前位置开始,扫描帧缓冲区。在这次扫描过程中,对使用位不 做任何修改。选择遇到的第一个帧(u=0, m=0)用于替换。 
2. 如果第 1)步失败,则重新扫描,查找(u=0, m=1)的帧。选择遇到的第一个 这样的帧用于替换。在这个扫描过程中,对每个跳过的帧,把它的使用位设置成 0。 
3. 如果第 2)步失败,指针将回到它的最初位置,并且集合中所有帧的使用 位均为 0。重复第 1 步,并且如果有必要,重复第 2 步。这样将可以找到供替换 的帧。

----------
# **7 IO 种类 IO 的原理**
## **1.IO 种类** 
计算机系统中的 I/O 设备按使用特性可分为以下类型: 
1) 人机交互类外部设备:用于同计算机用户之间交互的设备,如打印机、显示器、鼠标、键盘等。这类设备数据交换 速度相对较慢,通常是以字节为单位进行数据交换。 
2) 存储设备:用于存储程序和数据的设备,如磁盘、磁带、光盘等。这类设备用于数据交换,速度较快,通常以多字 节组成的块为单位进行数据交换。 
3) 网络通信设备:用于与远程设备通信的设备,如各种网络接口、调制解调器等。其速度介于前两类设备之间。网络 通信设备在使用和管理上与前两类设备也有很大不同。
&nbsp;
除了上面最常见的分类方法,I/O 设备还可以按以下方法分类: 
1) 按传输速率分类: 

 - 低速设备:传输速率仅为每秒几个到数百个字节的一类设备,如键盘、鼠标等。 
 - 中速设备:传输速率在每秒数千个字节至数万个字节的一类设备,如行式打印机、 激光打印机等。 
 - 高速设备:传输速率在数百个千字节至千兆字节的一类设备,如磁带机、磁盘机、 光盘机等。

2) 按信息交换的单位分类:

 - 块设备:由于信息的存取总是以数据块为单位,所以存储信息的设备称为块设备。它属于有结构设备,如磁盘等。磁盘设备的基本特征是传输速率较高,以及可寻址,即对它可随机地读/写任一块。 
 - 字符设备:用于数据输入/输出的设备为字符设备,因为其传输的基本单位是字符。它属于无结构类型,如交 互式终端机、打印机等。它们的基本特征是传输速率低、不可寻址,并且在输入/输出时常釆用中断驱动方式。

----------


## **2.设备 I/0 输入输出控制方式**
**程序直接控制方式**:计算机从外部设备读取数据到存储器,每次读一个字的数据。对读入的每个字,CPU 需要对外设状态进行循环检 查,直到确定该字已经在 I/O 控制器的数据寄存器中。
**中断驱动方式**:允许 I/O 设备主动打断 CPU 的运行并请求服务,从而“解放”CPU,使得其向 I/O 控制 器发送读命令后可以继续做其他有用的工作。
**DMA 方式**:在中断驱动方式中,I/O 设备与内存之间的数据交换必须要经过 CPU 中的寄存器,所以速度还是受限,而 DMA (直接存储器存取)方式的基本思想是在 I/O 设备和内存之间开辟直接的数据交换通路,彻底“解放” CPU。

**通道控制方式**:
I/O 通道是指专门负责输入/输出的处理机。I/O 通道方式是 DMA 方式的发展,它可以进一步减少 CPU 的干预, 即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。 
I/O 通道与 DMA 方式的区别是:DMA 方式需要 CPU 来控制传输的数据块大小、传输的内存位置,而通道方式 中这些信息是由通道控制的。另外,每个 DMA 控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与 内存的数据交换。

----------


# **8 进程打开同一个文件 那么这两个进程得到的文件描述符(fd)相同**
整个系统表包含进程相关信息,如文件在磁盘的位置、访问日期和大小。一个进程打开一个文件,系统打开文件 表就会为打开的文件增加相应的条目。当另一个进程执行 open 时,只不过是在其进程打开表中增加一个条目,并指向 整个系统表的相应条目。通常,系统打开文件表的每个文件时,还用一个文件打开计数器(Open Count),以记录多少 进程打开了该文件。每个关闭操作 close 则使 count 递减,当打开计数器为 0 时,表示该文件不再被使用。系统将回收 分配给该文件的内存空间等资源,若文件被修改过,则将文件写回外存,并将系统打开文件表中相应条目删除,最后释 放文件的文件控制块(File Control Block, FCB)。 所以文件描述符不同,count++,不同的 count 不同

----------


# **9 select epoll**
## **select 原理概述**
调用 select 时,会发生以下事情: 
1. 从用户空间拷贝 fd_set 到内核空间; 
2. 注册回调函数__pollwait; 
3. 遍历所有 fd,对全部指定设备做一次 poll(这里的 poll 是一个文件操作,它有两个参数,一个是文件 fd 本身, 一个是当设备尚未就绪时调用的回调函数__pollwait,这个函数把设备自己特有的等待队列传给内核,让内核把 当前的进程挂载到其中); 
4. 当设备就绪时,设备就会唤醒在自己特有等待队列中的【所有】节点,于是当前进程就获取到了完成的信号。 poll 文件操作返回的是一组标准的掩码,其中的各个位指示当前的不同的就绪状态(全 0 为没有任何事件触发), 根据 mask 可对 fd_set 赋值; 
5. 如果所有设备返回的掩码都没有显示任何的事件触发,就去调回调函数的函数指针,进入有限时的睡眠状态, 再恢复和不断做 poll,再作有限时的睡眠,直到其中一个设备有事件触发为止。 
6. 只要有事件触发,系统调用返回,将 fd_set 从内核空间拷贝到用户空间,回到用户态,用户就可以对相关的 fd 作进一步的读或者写操作了。
## **epoll 原理概述**
调用 epoll_create 时,做了以下事情:
1. 内核帮我们在 epoll 文件系统里建了个 file 结点; 
2. 在内核 cache 里建了个红黑树用于存储以后 epoll_ctl 传来的 socket; 
3. 建立一个 list 链表,用于存储准备就绪的事件。 调用 epoll_ctl 时,做了以下事情: 
    1). 把 socket 放到 epoll 文件系统里 file 对象对应的红黑树上; 
    2). 给内核中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,就把它放到准备就绪 list 链表 里。 
&nbsp;
调用 epoll_wait 时,做了以下事情: 
观察 list 链表里有没有数据。有数据就返回,没有数据就 sleep,等到 timeout 时间到后即使链表没数 据也返回。而且,通常情况下即使我们要监控百万计的句柄,大多一次也只返回很少量的准备就绪句 柄而已,所以,epoll_wait 仅需要从内核态 copy 少量的句柄到用户态而已。
    

> 对比
select 缺点: 
1. 最大并发数限制:使用 32 个整数的 32 位,即 32*32=1024 来标识 fd,虽然可修改, 但是有以下第二点的瓶颈; 
2. 效率低:每次都会线性扫描整个 fd_set,集合越大速度越慢; 
3. 内核/用户空间内存拷贝问题。 
epoll 的提升: 
1. 本身没有最大并发连接的限制,仅受系统中进程能打开的最大文件数目限制; 
2. 效率提升:只有活跃的 socket 才会主动的去调用 callback 函数; 
3. 省去不必要的内存拷贝:epoll 通过内核与用户空间 mmap 同一块内存实现。

----------
# **10 物理地址 虚拟地址 逻辑地址**
**物理地址(空间)** 
用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚按发送到内存总线上的电信号相对应。物理地址由 32 位或 64 位无符号整数表示

**虚拟地址**:就是在分段 分页的 基础上,比如说将地址分为 32 位,

如图 虚拟地址就是页号加上偏移量这种的表示方法,页号与偏移量结合去找到页表中在物 理内存中对应的页。
**逻辑地址(Logical Address):**
包含在机器语言指令中用来指定一个操作数或一条指令的地址, 每个逻辑地址都由一个段和偏移量组成,偏移量指明了从段开始 的地方到实际地址之间的距离。

 

----------

> ①了解内存管理页面置换算法(LRU,Java 中如何实现(LinkedHashMap)) ④了解死锁与饥饿区别 ⑥了解如何预防死锁(银行家算法、破坏条件等等) ⑦实现阻塞队列 ⑧生产者消费者模型实现 32 位系统的最大寻址空间? 2 的 32 次方 4GB 不同进程打开了同一个文件,那么这两个进程得到的文件描述符(fd)相同吗? 操作系统如何实现输出 三级缓存原理 内存管理: 固定分区 动态分区 段 页 都讲讲
32 位系统的内存寻址空间多大, 具体分为哪几种形态?库函数和系统调用有什么区别? 操作系统内一个进程的内存分段以及对应的作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值