《2023年程序员的自我修养总结.pdf》由会员分享,可在线阅读,更多相关《2023年程序员的自我修养总结.pdf(75页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、目 录 第 一 章 温 故 而 知 新.6第 二 节 万 变 不 离 其 宗.6第 3 节 站 得 高 看 得 远.7第 4 节 操 作 系 统 的 功 能.71.4.1 不 要 让 C P U打 吨.71.4.2 设 备 驱 动.81.5 内 存 不 够 怎 么 办?.81.5.1 关 于 隔 离.91.5.2 分 段.91.5.3 分 页.91.6 众 人 拾 柴 火 焰 高.101.6.1 线 程 基 础.101.6.2 线 程 安 全.111.6.3 多 线 程 内 部 情 况.14第 二 章 编 译 和 链 接.152.1 被 隐 臧 了 的 过 程.152.1.1 预 编 译.15
2、2.1.2 编 译.152.1.3 汇 编.152.1.4 链 接.162.2 编 译 器 做 了 什 么.162.2.1 词 法 分 析.162.2.2 语 法 分 析.162.2.3 语 义 分 析.162.2.4 中 间 语 言 生 成.172.2.5 目 标 代 码 的 生 成 与 优 化.172.3 链 接 器 年 龄 比 编 译 器 长.182.4 模 块 拼 接 一 一 静 态 链 接.18第 三 章 目 标 文 件 里 有 什 么.183.1 目 标 文 件 的 格 式.193.2 目 标 文 件 是 什 么 样 的.193.3 挖 掘 SimpleSection.o.203.
3、3.3 BSS 段.203.3.4 其 他 段.203.4 ELF文 件 结 构 描 述.203.4.1 文 件 头.213.4.2 段 表.223.4.3 重 定 位 表.223.4.4 字 符 串 表.223.5 链 接 的 接 口 一 一 符 号.233.5.1 E LF符 号 表 结 构.233.5.2 特 殊 符 号.233.5.3符 号 修 饰 与 函 数 签 名.243.5.5弱 符 号 和 弓 虽 符 号.243.6调 试 信 息.25第 4 章 静 态 链 接.254.1 空 间 与 地 址 分 配.254.1.2 相 似 段 合 并.254.1.3 符 号 地 址 的 确
4、定.264.2 符 号 解 析 与 重 定 位.264.2.2 重 定 位 表.264.2.3 符 号 解 析.274.2.4 指 令 修 正 方 式.274.3 COMMON 块.274.4.1 重 复 代 码 消 除.284.4.2 全 局 构 造 与 析 构.294.4.3 C+与 A BI.294.5 静 态 库 链 接.304.6 链 接 过 程 控 制.304.6.1 链 接 过 程 脚 本.314.6.2 最“小”的 程 序.314.6.3 使 用 Id链 接 脚 本.314.6.4 Id链 接 脚 本 语 法 简 介.314.7 BFD 库.31第 5 章 WINDOWS PE
5、/COFF.325.1 W indows的 二 进 制 文 件 格 式 PE/COFF.325.2 PE 的 前 身 COFF.325.3 链 接 指 示 信 息.325.4 调 试 信 息.325.5 大 家 都 有 符 号 表.325.6 WINDOWS 下 的 ELF P E.33第 6 章 可 执 行 文 件 的 装 载 与 进 程.336.1 进 程 的 虚 拟 地 址 空 间.336.2 装 载 的 方 式.346.2.1 覆 盖 装 入.346.2.2 页 映 射.346.3 从 操 作 系 统 的 角 度 看 可 执 行 文 件 的 装 载.356.3.1 进 程 的 建 立.
6、356.4 进 程 虚 存 空 间 的 分 布.366.4.1 E LF文 件 链 接 视 图 和 执 行 视 图.366.4.2 堆 和 栈.366.4.3 堆 的 最 大 申 请 数 量.376.4.4 段 地 址 对 齐.376.4.5 进 程 栈 初 始 化.386.5 Linux内 核 装 载 ELF过 程 简 介.386.6 Windows PE 的 装 载.38第 7 章 动 态 链 接.397.1 为 什 么 要 动 态 链 接.397.2 简 单 的 动 态 链 接 例 子.407.3 地 址 无 关 代 码.407.3.1 固 定 装 载 地 址 的 困 扰.407.3.2
7、 装 载 时 重 定 位.407.3.3 地 址 无 关 代 码.417.3.4 共 享 模 块 的 全 局 变 量 问 题.437.3.5 代 码 段 地 址 无 关 性.437.4 延 迟 绑 定(PLT).447.5 动 态 链 接 相 关 结 构.457.5.1.interp”段.457.5.2 dynamic”段.457.5.3 动 态 符 号 表.457.5.4 动 态 链 接 重 定 位 表.467.5.5 动 态 链 接 时 进 程 堆 栈 初 始 化 信 息.467.6 动 态 链 接 的 步 骤 和 实 现.477.6.1 动 态 链 接 器 自 举.477.6.2 装 载
8、 共 享 对 象.477.6.3 重 定 位 和 初 始 化.487.6.4 Linux动 态 链 接 器 的 实 现.487.7 显 示 运 行 时 链 接.487.7.1 打 开 动 态 库.487.7.2 dlsym().497.7.3 dlerror().497.7.4 dlclose().49第 8 章 Linux共 享 库 的 组 织.498.1 共 享 库 版 本.498.1.1 共 享 库 兼 容 性.498.1.2 共 享 库 版 本 命 名.508.1.3 SO-NAME程 序 需 要 记 录 什 么.508.2 符 号 版 本.508.2.1 基 于 符 号 的 版 本
9、机 制.518.2.3 Linux中 的 符 号 版 本.518.3 共 享 库 系 统 路 径.518.4 共 享 库 的 查 找 过 程.528.5 环 境 变 量.528.6 共 享 库 的 创 建 与 安 装.538.6.1 共 享 库 的 创 建.538.6.3 共 享 库 的 安 装.538.6.4 共 享 库 构 造 和 析 构 函 数.538.6.5 共 享 库 脚 本.54第 9 章 Windows 下 的 动 态 链 接.549.1 dll 介 绍.549.1.2 基 地 址 和 RVA.549.1.3 d ll共 享 数 据 段.559.1.4 d ll的 简 单 例 子
10、.559.1.7 使 用 模 块 定 义 文 件.559.1.8 D LL显 示 运 行 时 链 接.569.2 符 号 导 出 导 入 表.569.2.1 导 出 表.569.2.2 EXP 文 件.569.2.4 导 入 表.579.2.5 导 入 函 数 的 调 用.579.3 DLL 优 化.579.3.1 重 定 基 地 址.589.3.2 序 号.589.3.3 导 入 函 数 绑 定.589.4 C+与 动 态 链 接.599.5 DLL HELL.60第 4 部 分 库 与 运 行 库.60第 1 0章 内 存.611 0.1 程 序 的 内 存 布 局.611 0.2 栈 与
11、 调 用 惯 例.611 0.2.1 什 么 是 栈.611 0.2.2 调 用 惯 例.621 0.2.3 函 数 返 回 值 传 递.631 0.3 堆 与 内 存 管 理.631 0.3.1 什 么 是 堆.6410.3.2 Linux进 程 堆 管 理.6410.3.3 Windows 进 程 堆 管 理.641 0.3.4 堆 分 配 算 法.65第 1 1章 运 行 库.651 1.1 入 口 函 数 和 程 序 初 始 化.651 1.1.1 程 序 从 m ain开 始 执 行 吗.651 1.1.2 入 口 函 数 是 如 何 实 现 的.651 1.1.3 运 行 库 与
12、I/O.6611.1.4 MSVC C R T的 入 口 函 数 初 始 化.6611.2 C/C+运 行 库.6711.2.1 C 语 言 运 行 库.6711.2.2 C 语 言 标 准 库.6711.2.3 glibc 和 MSVC C R T.681 1.3 运 行 库 与 多 线 程.6811.3.1 C R T的 多 线 程 困 扰.6811.3.2 CRT 改 进.691 1.3.3 线 程 局 部 存 储 实 现.6911.4 C+全 局 构 造 和 析 构.7011.4.1 glibc全 局 构 造 和 析 构.7011.4.2 M SVC的 全 局 构 造 和 析 构.71
13、11.5 fread 的 实 现.7111.5.1 缓 冲.7111.5.2 fread_s.7111.5.3 _fread_nolock_s.7211.5.4 _read.721 1.5.5 文 本 换 行.7211.5.6 fread 回 顾.72第 1 2章 系 统 调 用 与 A P I.721 2.1 系 统 调 用 介 绍.731 2.1.1 什 么 是 系 统 调 用.731 2.1.3 系 统 调 用 的 弊 端.731 2.2 系 统 调 用 原 理.731 2.2.2 基 于 IN T的 Linux的 经 典 系 统 调 用 实 现.7312.2.3 Linux的 新 型
14、系 统 调 用 机 制.7412.3 Windows A PI.7412.3.1 Windows API 概 览.7412.3.2 为 什 么 要 使 用 Windows API?.75第 1 3章 运 行 库 的 实 现.7513.1 C 语 言 运 行 库.75A.1字 节 序.75第 一 章 温 故 而 知 新 第 二 节 万 变 不 离 其 宗 凡 是 单 纯 讲 史 的 章 节 我 所 有 略 去。本 节 讲 的 重 要 是 由 CPU、内 存 和 I/O之 间 速 度 不 匹 配 而 设 计 的 硬 件 架 构 及 其 发 展。这 个 就 不 用 细 说 了 C PU最 快,内 存
15、 次 之,I/O更 慢。由 于 C PU和 内 存 速 度 还 算 接 近,所 以 把 C PU和 内 存 算 作 一 类,I/O单 独 算 作 一 类。当 然 这 里 说 的 I/O是 指 I/O设 备,并 不 是 操 作。随 着 发 展 C P U频 率 越 来 越 高,解 决 速 度 越 来 越 快,内 存 跟 不 上 节 奏 了,它 们 之 间 的 I/O也 出 现 了 速 度 不 匹 配 的 问 题。由 于 I/O设 备 可 分 为 高 速 设 备 和 低 速 设 备 两 种,所 认 为 高 速 搭 配 北 桥,低 速 搭 配 南 桥。它 们 之 间 的 关 系 可 用 下 图 表
16、达:C P U的 频 率 只 能 达 成 4G H z无 法 提 高,这 是 由 CPU制 造 工 艺 决 定 的,是 个 瓶 颈,目 前 还 无 法 突 破。一 个 C PU能 力 有 限,那 就 让 多 个 CPU共 同 工 作 提 高 效 率。但 是 这 样 的 CPU阵 列 各 部 件 运 用 率 不 高,于 是,发 展 出 了 多 核 心,其 他 部 件 共 享 的 多 核 C PU设 计。说 白 了,本 来 的 C PU里 面 每 个 C PU一 个 核 心,除 此 之 外 尚 有 围 绕 这 个 核 的其 他 部 件。但 是 现 在 多 核 CPU除 了 核 心 彼 此 独 立
17、外,其 他 的 部 件 是 共 享 的。这 一 节 就 这 么 点 内 容。第 3节 站 得 高 看 得 远 从 下 图 可 以 看 出 计 算 机 的 结 构 大 约 是 这 样 的:Applications:Web BrowserVideo PlayerWord ProcessorEmail ClientImage ViewerDevelopment Tools:C/C+CompilerAssemblerLibrary ToolsDebug ToolsDevelopment Libraries-Operating System A P I-Runtime Library System C
18、a H-一 一 Hardware Specification-Operating System KernelHardware最 底 层 是 硬 件,它 提 供 硬 件 规 格 描 述。再 往 上 是 操 作 系 统 内 核,它 提 供 系 统 调 用。再 往 上 是 运 营 库,它 提 供 各 种 系 统 API。再 往 上 就 是 各 种 系 统 软 件 了。这 种 设 计 具 有 上 层 屏 蔽 下 层,上 层 提 供 接 口 的 特 点。这 一 节 对 接 口 的 解 释 非 常 好。作 者 说 接 口 是 一 种 协 议,协 议 二 字 比 较 贴 切。当 然 这 个 协 议 不 是
19、计 算 机 网 络 中 的 protocol。第 4 节 操 作 系 统 的 功 能 有 二。1、提 供 抽 象 接 口。2、管 理 硬 件。1.4.1不 要 让 C PU打 盹 操 作 系 统 经 历 了 从 多 道 程 序 设 计、分 时 操 作 系 统、到 多 任 务 操 作 系 统 等 阶 段。多 道 程 序 设 计 是 指 C P U 空 闲 的 时 候 出 让 C P U 以 提 高 C P U 运 用 率 的 设 计;分 时 是 指 给 每 个 程 序 固 定 的 时 间 片 执 行,时 间 片 一 到 就 停 止 的 设 计,但 是 这 个 时 间 片 是 轮 转 着 用 的,
20、不 是 一 个 程 序 用 完 了 就 没 了;多 任 务 就 是 现 在 操 作 系 统 设 计 了,程 序 以 进 程 的 方 式 存 在。抢 占:O S 对 程 序 执 行 具 有 绝 对 的 控 制 权,O S 依 据 一 定 标 准 判 断 该 剥 夺 哪 个 程 序 的 执 行 就 剥 夺,想 让 哪 个 程 序 执 行 就 让 哪 个 程 序 执 行。1.4.2设 备 驱 动 GDI和 directX等 都 是 硬 件 的 抽 象,是 一 个 中 间 层,它 们 屏 蔽 了 硬 件 的 具 体 细 节,提 供 了 通 用 的 操 作 接 口。LBA(Logical Block A
21、ddress):由 于 硬 盘 结 构 复 杂,概 念 繁 多,寻 找 一 个 扇 区 要 通 过 很 多 环 节,这 个 比 较 麻 烦。与 其 如 此,不 如 干 脆 为 每 个 扇 区 配 置 一 个 逻 辑 编 号,这 样 找 扇 区 就 仿 佛 是 哈 希 算 法 同 样 快。1.5内 存 不 够 怎 么 办?程 序 在 内 存 中 的 地 址 空 间 是 需 要 互 相 隔 离 的。这 是 为 了 防 止 一 个 程 序 在 无 意 间 修 改 其 他 程 序 导 致 意 料 之 外 的 结 果,此 外,这 也 是 为 了 信 息 安 全。内 存 运 用 率 要 高,要 不 然 程
22、 序 在 内 存 和 硬 盘 之 间 进 行 I/O操 作 所 花 费 的 时 间 可 就 多 了。程 序 运 营 的 地 址 应 当 是 拟 定 的。由 于 多 数 程 序 指 令 跳 转 的 目 的 地 址 是 固 定 的,假 如 运 营 地 址 不 拟 定 就 不 能 保 证 每 次 都 在 目 的 地 址 上 运 营,这 就 需 要 重 定 向 进 行 调 整,浪 费 时 间。解 决 上 述 问 题 的 办 法 是 使 用 中 间 层,即 把 程 序 的 运 营 地 址 与 目 的 地 址 建 立 一 种 映 射 关 系。1.5.1关 于 隔 离 我 们 平 时 说 的 什 么 32位
23、,6 4位 CPU啥 的 都 是 指 CPU的 解 决 能 力,从 硬 件 的 角 度 讲,即,计 算 机 的 地 址 总 线 的 条 数。从 CPU的 设 计 上 讲 就 是 CPU一 次 可 以 解 决 的 二 进 制 位 数,而 这 个 位 数 尚 有 一 个 学 名 叫 字 长。内 存 的 物 理 地 址 空 间 就 是 真 实 的 内 存 空 间,虚 拟 地 址 空 间 则 是 应 用 于 进 程 的 逻 辑 地 址 空 间。1 5 2 分 段 我 在 想 如 何 从 16进 制 的 差 值 一 下 推 断 出 地 址 空 间 的 大 小?以 下 是 我 的 想 法。1位 16进 制
24、 数 字 代 表 4 位 2 进 制 数 字,换 句 话 说 16进 制 数 字 转 换 为 2 进 制 数 字 是 以 24为 单 位 进 行 换 算 的。那 么 根 据 某 个 16进 制 数 字 所 在 位 置 乘 以 当 前 权 值 就 可 以 得 到 该 位 置 上 的 16进 制 数 字 所 代 表 的 2 进 制 数 字。而 16进 制 某 位 的 权 值 等 于 低 一 位 的 权 值 乘 以 2 3 并 且 16进 制 最 低 位 的 权 值 是 2,因 此 可 以 根 据 这 个 规 律 换 算 出 相 应 的 2 进 制 数 字。来 看 个 例 子。书 上 说 从 0X0
25、0000000到 0X00A00000的 地 址 空 间 大 小 就 等 于|0 x00A00000-0 x00000000|=|A00000|由 于 A 是 10 所 以 其 等 价 于|1000000|,现 在 按 照 上 述 规 律 进 行 换 算。10X22+0 x2l6+0 x2l2+0 x28+0 x24+0 x20=10M(byte)o分 段 的 方 法 可 以 使 各 进 程 彼 此 隔 离,并 且 可 以 使 程 序 运 营 的 地 址 拟 定。分 段 的 缺 陷 就 是 它 以 程 序 为 单 位 进 行 解 决,但 是 根 据 程 序 运 营 的 局 部 性 原 理,程
26、序 通 常 情 况 下 只 有 一 少 部 分 需 要 常 驻 内 存,因 此 以 程 序 为 单 位 换 进 换 出 严 重 影 响 了 内 存 的 运 用 率 和 解 决 速 度。1.5.3分 页 页 面 有 3 种:1、虚 拟 页;2、内 存 页;3、磁 盘 页。MMU(Memory Management Unit)负 责 把 虚 拟 地 址 转 换 成 物 理 地 址。1.6众 人 拾 柴 火 焰 高 1.6.1 线 程 基 础 使 用 线 程 的 好 处?1、多 线 程 可 以 有 效 运 用 等 待 时 间。由 于 某 线 程 陷 入 等 待 状 态 后 别 的 线 程 可 以 继
27、 续 执 行;2、多 线 程 不 会 使 与 用 户 的 交 互 中 断。由 于 可 以 一 个 线 程 负 责 与 用 户 交 互,另 一 个 线 程 负 责 计 算;3、可 以 实 现 程 序 内 部 并 发 执 行 操 作;4、多 核 CPU等 硬 件 的 潜 力 只 有 多 线 程 才 干 使 其 充 足 发 挥;5、在 数 据 共 享 方 面 更 高 效。线 程 的 私 有 存 储 空 间?1、栈;2、线 程 局 部 存 储(Thread Local Storage,TLS);3、寄 存 器。线 程 真 正 的 并 发 执 行 和 非 真 正 并 发 执 行?在 同 一 时 间 只
28、有 解 决 器 核 心 数 量 大 于 等 于 执 行 线 程 数 量 的 时 候 才 是 真 并 发 执 行,除 此 之 外 都 是 模 拟 出 来 的。线 程 调 度:在 同 一 时 间 解 决 器 的 核 心 数 量 小 于 执 行 线 程 的 数 量 时 就 需 要 在 同 一 核 心 不 断 切 换 来 执 行 线 程。改 变 线 程 优 先 级 的 3 种 方 式 1、用 户 指 定 优 先 级;2、根 据 等 待 状 态 的 频 繁 限 度 调 整 优 先 级;3、长 时 间 得 不 到 执 行 而 被 提 高 优 先 级。可 抢 占 执 行 线 程 和 不 可 抢 占 执 行
29、线 程:线 程 的 各 种 状 态 完 全 由 操 作 系 统 来 控 制 这 就 叫 可 抢 占,就 像 某 线 程 的 时 间 片 用 完 进 入 就 绪 态 同 样,这 就 是 由 操 作 系 统 来 控 制 的。除 此 之 外 的 就 是 不 可 抢 占 线 程。不 可 抢 占 线 程 积 极 放 弃 执 行 的 时 机:1、线 程 等 待 某 事 件 发 生 时。2、线 程 积 极 放 弃 时 间 片。由 于 就 这 俩 条 件 所 以 不 可 抢 占 线 程 调 度 的 时 机 是 拟 定 的。Linux下 的 多 线 程:不 像 Windows那 样 把 线 程 和 进 程 分
30、得 那 样 清 楚,Linux是 以 任 务 为 单 位 的,假 如 某 几 个 任 务 的 执 行 是 做 同 一 件 事 的 各 个 部 分,那 么 这 几 个 任 务 就 可 以 当 作 是 线 程,而 这 件 事 就 可 以 当 作 是 进 程。所 以 Linux下 的 线 程 和 进 程 是 动 态 的 概 念。Linux下 的 fork函 数:fork是 叉 子 的 意 思,我 不 知 道 为 啥 Linux用 它 来 给 函 数 命 名。它 的 作 用 就 是 复 制 任 务,新 任 务 和 原 任 务 共 享 同 一 块 内 存 空 间,并 且 是 写 时 复 制。所 谓 写
31、时 复 制 就 是 写 的 时 候 才 从 内 存 空 间 里 面 复 制 出 一 块 给 你 写,原 内 存 空 间 内 容 不 变。读 的 时 候 新 旧 任 务 读 同 一 块 内 存 空 间。Linux下 的 exec函 数:fork产 生 的 是 本 任 务 的 镜 像,也 就 是 复 制 品。两 个 同 样 的 任 务 完 毕 同 样 的 功 能 是 浪 费 啊,所 以 fork是 个 半 成 品 函 数,必 须 搭 配 别 的 函 数 才 有 用,这 个 函 数 就 是 exec函 数。Exec函 数 用 来 执 行 别 的 可 执 行 文 献,换 句 话 说 就 是 干 别 的
32、 事。所 以 可 以 把 fork理 解 成 在 一 块 内 存 空 间 上 发 明 出 个 接 口 给 exec执 行 新 任 务。Linux下 的 clone函 数:我 对 它 的 理 解 就 是 fork和 exec二 合 一,clone的 作 用 就 是 产 生 新 线 程。1.6.2线 程 安 全 要 知 道 线 程 安 全 就 得 知 道 啥 叫 线 程 不 安 全。所 谓 线 程 不 安 全 就 是 指 多 个 线 程 同 时 访 问 共 享 数 据 导 致 结 果 的 不 拟 定 性。原 子 操 作:绝 对 不 会 被 打 断 的 操 作。由 于 原 子 是 化 学 反 映 中
33、 的 最 小 微 粒 不 可 再 分 所 以 拿 这 个 来 比 拟 原 子 操 作。它 合 用 于 简 朴 应 用 环 境。解 决 线 程 不 安 全 的 通 用 方 法 是 锁。线 程 同 步:一 开 始 我 还 认 为 是 多 个 线 程 一 起 访 问 某 个 资 源 呢,其 实 不 然,线 程 同 步 是 解 决 线 程 访 问 同 一 数 据 资 源 的 解 决 方 式,保 证 了 同 一 时 间 只 有 同 一 线 程访 问 数 据 资 源,从 而 保 证 了 线 程 安 全。锁 一 一 二 元 信 号 量:最 简 朴 的 锁 机 制。只 允 许 一 个 线 程 独 占,一 旦
34、有 线 程 占 用,锁 就 呈 现 占 用 状 态,其 他 线 程 无 法 访 问 资 源。否 则,非 占 用 状 态,可 以 接 受 线 程。锁 一 一 多 元 信 号 量:就 是 它 允 许 多 个 线 程 同 步 访 问 资 源,比 二 元 信 号 量 高 能 一 些。我 感 觉 信 号 量 就 像 管 道。一 个 线 程 想 访 问 资 源 它 就 必 须 一 方 面 获 取 一 个 管 道,这 样 本 来 的 管 道 数 就 少 1,于 是 信 号 量 一 方 面 减 1。但 是 假 如 信 号 量 减 1 以 后 成 为 负 值,说 明 本 来 的 管 道 数 为 0,即 本 来
35、就 已 经 没 有 管 道 了,那 么 此 时 信 号 量 机 制 就 只 能 让 该 线 程 等 待 了,这 就 是 P 原 语。而 假 如 一 个 线 程 用 完 了 资 源 想 要 释 放,那 么 它 必 须 归 还 它 所 使 用 的 管 道,那 么 管 道 总 数 应 当 加 1,即 信 号 量 加 lo正 由 于 信 号 量 已 经 加 1,假 如 此 时 的 信 号 量 值 为 小 于 1,那 说 明 在 加 1之 前 管 道 总 量 就 已 经 透 支 了,并 且 先 前 那 些 由 于 没 有 获 得 管 道 的 线 程 还 在 那 等 着 呢。正 好 有 个 线 程 归 还
36、 了 管 道,V 原 语 赶 紧 从 那 些 等 待 的 线 程 中 找 一 个 出 来 把 管 道 给 它,这 就 是 在 信 号 量 值 小 于 1 的 情 况 下 唤 醒 线 程 的 意 思。锁 一 一 互 斥 量(Mutex):信 号 量 与 互 斥 量 的 区 别 是 一 个 信 号 量 可 以 被 一 个 线 程 获 取 并 释 放 给 另 一 个 线 程 使 用,正 如 V 原 语 的 操 作。而 互 斥 量 始 终 都 是 一 个 线 程,上 锁 是 这 个 线 程,这 个 线 程 不 执 行 完 就 不 解 锁。锁 一 一 临 界 区:获 取 临 界 区 的 锁 为 进 入
37、临 界 区,释 放 锁 为 离 开 临 界 区。它 的 作 用 对 象 是 某 一 位 以 进 程,一 旦 某 进 程 进 入 临 界 区,其 他 进 程 就 无 法 进 入。除 此 之 外,临 界 区 与 互 斥 量 相 同。锁 一 一 读 写 锁:互 斥 量、临 界 区 和 信 号 量 合 用 于 读 写 都 非 常 频 繁 的 场 合,而 读 写 锁 合 用 于 读 频 繁 而 写 不 频 繁 的 场 合。它 的 工 作 规 律 可 用 下 表 表 达:锁 写 锁 状 态 以 共 享 方 式 获 取 以 独 占 方 式 获 取 自 由 成 功 成 功 共 享 成 功 等 待 独 占 等
38、待 等 待锁 一 一 条 件 变 量:相 称 于 一 个 开 关,它 可 以 让 等 待 它 的 线 程 继 续 等 待 也 可 以 让 它 们 继 续 执 行。而 这 个 开 关 需 要 一 些 其 他 的 线 程 打 开 或 关 闭 它。可 重 入 函 数:一 个 函 数 没 有 执 行 完 全,但 是 由 于 内 部 因 素 或 者 外 部 调 用,又 一 次 开 始 执 行 该 函 数。它 不 产 生 任 何 不 良 后 果。产 生 可 重 入 的 条 件:1、多 线 程 共 同 执 行 该 函 数。2、函 数 自 己 直 接 或 者 间 接 调 用 自 身。可 重 入 函 数 的 特
39、 点:1、不 使 用 任 何(局 部)静 态 或 全 局 的 非 const变 量。由 于 假 如 使 用 的 话 它 就 涉 嫌 操 纵 共 享 数 据,这 样 会 导 致 线 程 不 安 全。2、不 返 回 任 何(局 部)静 态 或 全 局 的 非 const变 量 的 指 针。由 于 这 同 样 涉 及 到 共 享 数 据。3、仅 依 赖 于 调 用 方 提 供 的 参 数。由 于 这 样 可 以 把 函 数 的 执 行 过 程 局 限 在 局 部。4、不 依 赖 于 任 何 单 个 资 源 的 锁。单 个 资 源 的 锁 不 允 许 被 中 断,这 不 符 合 可 重 入 函 数 的
40、 定 义。5、不 调 用 任 何 不 可 重 入 函 数。这 个 没 啥 好 说 的,假 如 调 用 了,可 重 入 函 数 就 成 了 不 可 重 入 函 数。可 重 入 性 质 是 并 发 安 全 的 强 力 保 证 可 在 多 线 程 环 境 下 大 胆 使 用。过 度 优 化:P53这 个 例 子 就 是 说 本 来 2 个 x+结 果 是 2,但 是 通 过 上 锁 以 后 却 是 1,这 证 明 即 使 通 过 锁 机 制 也 不 能 完 全 保 障 计 算 对 的,这 是 计 算 机 内 部 工 作 机 制 导 致 的 线 程 不 安 全。CPU对 程 序 的 优 化 也 许 导
41、 致 线 程 不 安 全,由 于 它 会 调 整 程 序 语 句 执 行 顺 序 以 达 成 CPU所 谓 的 优 化,这 有 时 候 很 麻 烦。Volatile关 键 字 可 以 阻 止 这 种 优 化。1、它 阻 止 编 译 器 为 提 高 程 序 执 行 速 度 将 一 个 变 量 缓 存 到 寄 存 器 内 而 不 写 回。2、它 阻 止 编 译 器 调 整 语 句 执 行 顺 序。这 两 件 事 就 是 volatile所 做 的 具 体 工 作。但 是,volatile能 管 住 编 译 器 管 不 了 CPU,CPU还 是 能 对 指 令 进 行 动 态 调 整。P54举 了
42、一 个 double-check的 例 子,虽 然 现 在 我 对 这 个 没 有 多 深 的 理 解,但 是 从 这 个 例 子 中 我 看 到 作 者 是 怎 么 分 析 的。它 是 将 各 个 语 句 内 部 实 际 所 进 行 的 操 作 都 列 出 来 进 行 分 析 的,这 个 值 得 我 学 习。虽 然 volatile管 不 了 C P U,但 是 CPU有 CPU相 称 于 volatile的 指 令,一 般 这个 指 令 叫 做 barrier o1.6.3多 线 程 内 部 情 况 线 程 分 为 内 核 级 线 程 和 用 户 级 线 程,内 核 级 线 程 是 用 户
43、 直 接 接 触 不 到 的,用 户 只 能 接 触 到 用 户 级 线 程。3 种 内 核 级 线 程 与 用 户 级 线 程 的 模 型。1、一 对 一 模 型:就 是 每 个 用 户 级 线 程 都 相 应 一 个 内 核 级 线 程,但 反 过 来 不 是,由 于 内 核 级 线 程 也 许 没 有 用 户 级 线 程 与 之 相 应。一 般 直 接 使 用 A P I或 者 系 统 调 用 创 建 的 线 程 均 为 一 对 一 模 型。它 的 优 点:真 正 实 现 线 程 的 并 发 执 行,线 程 之 间 彼 此 互 不 影 响。它 的 缺 陷:1、许 多 操 作 系 统 限
44、制 了 内 核 级 线 程 的 数 量 导 致 用 户 级 线 程 数 量 受 限。2、许 多 操 作 系 统 用 在 内 核 级 线 程 调 度 上 的 开 销 较 大,重 要 为 上 下 文 切 换 开 销,致 使 用 户 级 线 程 执 行 效 率 低 下。2、多 对 一 模 型:多 个 用 户 级 线 程 相 应 同 一 个 内 核 级 线 程,线 程 的 切 换 由 用 户 级 代 码 决 定。作 者 说 多 解 决 器 对 提 高 解 决 速 度 没 有 明 显 帮 助,这 是 当 然 的 了,C PU解 决 的 是 内 核 级 线 程,而 这 个 模 型 就 在 那 摆 着,C
45、PU也 只 能 按 照 这 个 模 式 来 解 决。再 说 了,一 个 线 程 只 能 在 一 个 核 上 跑,你 再 多 给 几 个 核 也 没 用 啊。它 的 优 点:它 比 一 对 一 模 型 快,尚 有 高 效 的 上 下 文 切 换 和 近 似 无 限 制 的 线 程 数 量。它 的 缺 陷:只 要 有 一 个 线 程 阻 塞,相 应 于 同 一 个 内 核 级 线 程 的 其 他 线 程 也 无 法 执 行,该 内 核 级 线 程 也 阻 塞,这 很 好 理 解,由 于 只 有 一 条 通 路。3、多 对 多 模 型:是 上 面 两 者 的 合 体。很 显 然 它 能 克 服 上
46、述 两 者 的 缺 陷,同 理 多 解 决 器 也 无 法 显 著 提 高 它 的 执 行 效 率。第 二 章 编 译 和 链 接 2.1 被 隐 藏 了 的 过 程 以 前 学 的 程 序 的 执 行 过 程 是 编 辑、编 译、链 接、执 行。今 天 这 本 书 把 这 个 过 程 更 加 细 化 了,它 以 C 语 言 中 的 helloworld程 序 为 例 进 行 说 明,讲 的 大 约 是 从 编 译 到 链 接 的 过 程。也 是 涉 及 4 步:1、预 解 决;2、编 译;3、汇 编;4、链 接。从 这 个 顺 序 可 以 看 出 在 C 语 言 中 预 解 决 是 在 编
47、译 之 前。2.1.1 预 编 译 预 编 译 是 个 独 立 的 过 程,不 同 于 源 文 献 的.cpp格 式 和 头 文 献 的.h格 式,预 编 译 得 到 的 文 献 后 缀 是.i或 者.ii。预 编 译 的 重 要 动 作 就 是 解 决 代 码 中 以#开 头 的 指 令,具 体 可 见 P 6 4这 些 环 节。由 于 宏 已 经 展 开 所 以.i文 献 不 包 含 任 何 宏 定 义。可 以 根 据.i文 献 查 看 宏 定 义 和 文 献 包 含 是 否 对 的。预 编 译 需 要 预 编 译 器。2.1.2 编 译 编 译 的 过 程 是 把 预 解 决 得 到 的
48、 文 献 进 行 词 法 分 析、语 法 分 析、语 义 分 析 和 优 化 后 生 成 相 应 的 汇 编 代 码 文 献。2.1 3 汇 编 汇 编 阶 段 是 通 过 汇 编 器 完 毕 的,其 作 用 就 是 把 汇 编 指 令 转 换 成 机 器 指 令。汇 编 结 束 以 后 生 成 目 的 文 献.obj o2.1.4链 接 链 接 简 而 言 之 就 是 把 目 的 文 献 链 接 在 一 起 生 成 可 执 行 文 献 的 过 程,但 是 事 实 上 这 是 一 个 非 常 复 杂 的 过 程,并 不 像 看 上 去 那 么 简 朴。2.2编 译 器 做 了 什 么 编 译
49、的 过 程 可 以 分 为 扫 描、语 法 分 析、语 义 分 析、源 代 码 优 化、代 码 生 成、目 的 代 码 优 化 等 6 步。2.2.1 词 法 分 析 这 一 过 程 是 交 给 扫 描 器 执 行 的,目 的 是 把 程 序 语 句 划 提 成 若 干 记 号。这 些 记 号 一 般 涉 及:1、关 键 字;2、标 记 符;3、字 面 量(数 字,字 符 串 等);4、特 殊 符 号(加 号,等 号 等)。止 匕 外,扫 描 器 还 将 标 记 符 放 到 符 号 表,将 字 面 量 放 到 文 字 表 中 以 备 后 用。词 法 分 析 需 要 此 法 扫 描 器。2.2.
50、2 语 法 分 析 它 是 对 词 法 分 析 产 生 的 各 种 记 号 进 行 语 法 分 析,并 产 生 一 颗 语 法 树。语 句 内 容 含 义 的 区 分,语 法 的 检 查 等 都 是 在 此 阶 段 完 毕 的。语 法 分 析 需 要 语 法 分 析 器。2.2.3 语 义 分 析 语 义 分 析 需 要 语 义 分 析 器。语 义 分 析 就 是 分 析 该 语 句 的 意 思,就 是 它 能 做 什 么,有 啥 用。编 译 器 所 能 做 的 涉 及 静 态 语 义 分 析 和 动 态 语 义 分 析。静 态 语 义:编 译 期 可 以 拟 定 的 语 义,它 重 要 涉