diff --git a/Operating Systems.md b/Operating Systems.md
index 06f3c9c..a060752 100644
--- a/Operating Systems.md
+++ b/Operating Systems.md
@@ -19,6 +19,7 @@
* [分页和分段有什么区别?](#分页和分段有什么区别)
* [什么是虚拟内存?](#什么是虚拟内存)
* [有哪些页面置换算法?](#有哪些页面置换算法)
+ * [缓冲区溢出问题](#缓冲区溢出问题)
* [磁盘调度](#磁盘调度)
* [参考](#参考)
@@ -532,6 +533,25 @@ IO多路复用(IO Multiplexing)是指单个进程/线程就可以同时处
- 终止该进程或增加物理内存容量。
+### 缓冲区溢出问题
+
+
+什么是缓冲区溢出?
+C 语言使用运行时栈来存储过程信息。每个函数的信息存储在一个栈帧中,包括寄存器、局部变量、参数、返回地址等。C 对于数组引用不进行任何边界检查,因此**对越界的数组元素的写操作会破坏存储在栈中的状态信息**,这种现象称为缓冲区溢出。缓冲区溢出会破坏程序运行,也可以被用来进行攻击计算机,如使用一个指向攻击代码的指针覆盖返回地址。
+
+
+
+缓冲区溢出的防范方式
+
+防范缓冲区溢出攻击的机制有三种:随机化、栈保护和限制可执行代码区域。
+- 随机化:包括栈随机化(程序开始时在栈上分配一段随机大小的空间)和地址空间布局随机化(Address-Space Layout Randomization,ASLR,即每次运行时程序的不同部分,包括代码段、数据段、栈、堆等都会被加载到内存空间的不同区域),但只能增加攻击一个系统的难度,不能完全保证安全。
+- 栈保护:在每个函数的栈帧的局部变量和栈状态之间存储一个**随机产生的**特殊的值,称为金丝雀值(canary)。在恢复寄存器状态和函数返回之前,程序检测这个金丝雀值是否被改变了,如果是,那么程序异常终止。
+- 限制可执行代码区域:内存页的访问形式有三种:可读、可写、可执行,只有编译器产生的那部分代码所处的内存才是可执行的,其他页限制为只允许读和写。
+
+
+
+更详细的可以参考:https://imageslr.github.io/2020/07/08/tech-interview.html#stackoverflow
+
### 磁盘调度
过程:磁头(找到对应的盘面);磁道(一个盘面上的同心圆环,寻道时间);扇区(旋转时间)。为减小寻道时间的调度算法: