-
程序的生成过程:
预处理:#define,include
编译:生成汇编语言程序
汇编:生成机器代码
链接:动态链接(程序加载进内存的时候)、静态链接 -
为什么要内存对齐?
内存是以字节为单位,但是处理器并不会按照一个字节为单位去存取内存。它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度。对于现代计算机硬件来说,内存只能通过特定的对齐地址(比如按照机器字)进行访问。举个例子来说,比如在64位的机器上,不管我们是要读取第0个字节还是要读取第1个字节,在硬件上传输的信号都是一样的。因为它都会把地址0到地址7,这8个字节全部读到CPU,只是当我们是需要读取第0个字节时,丢掉后面7个字节,当我们是需要读取第1个字节,丢掉第1个和后面6个字节。
假如没有使用内存对齐:
一个整型变量(4 字节),他可以按照任意的起始地址存放,假设现在有一块内存单元:地址从 0~7. 这个整型变量从 地址为 1 的位置开始占据了 1,2,3,4 这 4 个字节. 现在处理器需要读取这个整型变量.由于处理器是 4 字节 4 字节的读取,所以从 0 开始读读取 0,1,2,3发现并没有读完整这个变量,那么需要再读一次,读取 4,5,6,7. 然后对两次读取的结果进行处理,提取出 1,2,3,4 地址的内容.
当我们要读取的字节刚好落在两个机器字内时,就出现两次访问内存的情况,同时通过一些逻辑计算才能得到最终的结果。因此,为了更好的提升性能,我们须尽量将结构体做到机器字(或倍数)对齐,而结构体中一些频繁访问的字段也尽量安排在机器字对齐的位置。 -
虚拟地址空间的内存结构
虚拟地址空间的内存结构
代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的。
数据区:存放已初始化的全局变量(非零)、静态变量(非零)(全局和局部)、常量数据。
BBS区:存放的是未初始化的全局变量和静态变量。
栈区:由编译器自动分配释放,存放函数的参数值、返回值和局部变量,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,无须程序员手动管理。
堆区:堆是由malloc()函数分配的内存块,使用free()函数来释放内存,堆的申请释放工作由程序员控制,容易产生内存泄漏。 -
进程间通信
消息
共享内存
管道
死锁的四个必要条件
互斥条件:一个资源每次只能被一个进程访问
请求与保持条件:一个进程因请求而阻塞时,对已有的资源保持不放
不可剥夺条件:进程已获得的资源在使用完之前不可强行的剥夺
循环等待条件:若干进程之间形成首尾相接的循环等待资源的关系
网友评论