「操作系统」内存/编译/并发控制

  • 编译

    1. 编译器: 将源码转成二进制的机器码. 比如gcc, javac

      1. 预处理: 替换宏定义和头文件地址

      2. 编译: 转为汇编

      3. 汇编: 转为二进制机器码, 此步将产生目标文件

      4. 链接: 分为静态链接与动态连接

        1. 静态连接: 载入代码时就会确定代码地址, 将库一起打包入可执行文件, 因此可执行文件很大, 不方便库升级, 不共享库, 耗内存.

        2. 动态链接: 调用时才确定代码地址, 共享库, 内存占用低, 初始化快, 执行慢.

    2. 复杂项目的编译分成三部分:

      1. configure: 由autoconf产生, 包含配置信息, 会产生makefile, 即编译顺序文件

      2. make: 编译

      3. make install: 安装

  • 内存

    1. 相关问题

      1. 内存碎片: 不能供进程使用的内存里的小分区

        1. 内部碎片: 已分配且未使用

        2. 外部碎片: 未分配且不宜使用

      2. 内存溢出: 程序要求分配的内存超出系统能给的

      3. 内存泄露: 程序在申请内存后未释放已申请的内存, 一次没问题, 但是多了会造成内存泄露堆积, 最终导致内存溢出.

    2. 分页

      1. 一个进程被分为若干固定大小的区域, 被称为页. 内存分为若干个物理块, 称为"块"或"页框"

      2. 页和页框大小相等, 由操作系统控制分割

      3. 分页是为了实现存储的非连续, 避免内存碎片(外部碎片)

      4. 页是信息的物理单位, 页大小固定

      5. 页表: 每个进程会有一个页表, 指明该进程中某页对应在内存中的页框. 页表第一列为页号, 第二列为页框号. 处理器会将程序的逻辑地址(页号+偏移量), 转为内存的物理地址(页框号+偏移量)

    3. 分段

      1. 一个进程被分为若干大小不等的区域, 被称为段.

      2. 每段存储一组在逻辑上相对完整的信息, 由编译器控制分割.

      3. 分段是为了更好的共享, 多个进程可以共享一个段, 相比分页有较高的内存利用率

      4. 段是信息的逻辑单位, 段大小随机

      5. 段表: 类似于页表

    4. 虚拟内存

      1. 具有置换功能, 能在逻辑上对内存扩充的一种存储系统

      2. 内存置换算法:

        1. 先进先出

        2. 最近最久未使用 (LRU)

        3. clock算法

  • 并发控制

    1. 并发执行下, 为保证隔离性, 多事务间不互相影响.

    2. 一般并发控制指的就是数据库的并发控制, 实现并发控制主要分为乐观锁与悲观锁.

    3. 悲观锁

      1. 使用读锁/写锁, 最好需要依靠数据库提供的锁机制, 也只有数据库提供了锁机制, 才能保证其不被外部系统所修改, 因为即使本系统实现了锁, 外部系统仍可修改.

      2. 适合数据争用激烈的情况

      3. 悲观锁可能会导致死锁

    4. 乐观锁

      1. 在数据提交更新时, 才对数据检测是否冲突, 一般通过数据版本或CAS实现.

      2. 适合数据争用少的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值