缓冲区溢出攻击

C语言对于数组引用不进行任何边界检查,而且局部变量和状态信息都放在栈中。这两种情况结合到一起就能导致严重的程序错误,比如对越界的数组元素的写操作。

操作系统

结构体的内存对齐

元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每个元素放置到内存中时,它都会认为内存是按照自己的大小(通常它为4或8)来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始,这就是所谓的内存对齐。

操作系统

原子操作的实现原理

原子(atomic)指的是“不能被进一步分割的最小粒子”,原子操作指的是“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就会变得很复杂。 处理器如何实现原子操作32位IA32处理器使用的是基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。首先处理器会自动保证基本的内存操作的原子性。处理器保证从系统内存中读取或者写入一个字节是原子的,意思是当一个处理器读取一个原子时,其...

操作系统

进程通信之信号量

信号量(Semaphore)的概念最早由荷兰计算机科学家 Dijkstra(迪杰斯特拉)提出,有时又称“信号灯”。

操作系统

进程通信之共享内存

共享内存是一种用于实现进程间通信(IPC)的方法,不同进程通过访问同一块内存区域实现数据共享和交互。每个进程可以将自身的虚拟地址映射到物理内存中的特定区域,当不同进程将相同的物理内存区域与各自的虚拟地址空间关联时,这些进程就能实现通过共享内存来完成IPC。若某进程更改了共享内存区的内容,其它进程都会觉察到该区域的更改。

操作系统

进程通信之信号

在 Linux 中,理解信号的概念是非常重要的。这是因为,信号被用于通过 Linux 命令行所做的一些常见活动中。例如,每当你按 Ctrl+C 组合键来从命令行终结一个命令的执行,你就使用了信号。知道信号的基本原理是非常有用的。

操作系统

计算机中整数的表示

整数表示无符号数的编码 C/C++支持有符号(默认)和无符号数,Java只支持有符号数 一个$\omega$位的整数看作$\vec{x}$表示整个向量,或者写成$[x_{\omega -1}, x_{\omega -2}, …, x_0]$ ,表示向量中的每一位,可得出无符号数编码的定义 $B2U_\omega$(Binary to Unsighed),对于向量$\vec{x...

操作系统

操作系统的启动

操作系统组成 CPU Memory I/O Disk:存放OS BIOS:基本I/O系统(检测外设,加载软件) Bootloader:加载OS 操作系统启动 通电之后,从指定地址开始执行 x86开机时,设置 CS:IP = 0xf000:fff0 CS:段寄存器 IP:指令寄存器 POST(加电自检),寻找显卡和执行BIOS 寻址0xffff0:...

操作系统

用户线程和守护线程

java线程分类在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用户线程和守护线程的区别 二者其实基本上是一样的。唯一的区别在于JVM何时离开。 用户线程:当存在任何一个用户线程未离开,JVM是不会离开的。 守护线程:如果只剩下守护线程未离开,JVM是可以离开的。 在Java中,制作守护线程非常简单,直接利用setDaemo...

操作系统