《程序员的自我修养》第一部分

前言

简单的做做笔记,后续添加思考

书主要内容

系统软件的运行机制和原理
一个应用程序在编译、链接和运行时刻所发生的各种事项
包括:

  1. 代码指令如何保持的
  2. 库文件如何与应用程序代码静态链接
  3. 应用程序如何被装载到内存中并开始运行
  4. 动态链接如何实现
  5. C/C++运行库工作原理
  6. 操作系统提供的系统服务是如何被调用

具体一点就是:

  • 描述Window、Linux操作系统下各自的可执行文件、目标文件格式
  • 普通C/C++程序代码如何被编译成目标文件
  • 程序在目标文件中如何存储
  • 目标文件如何被链接器链接到一起,并形成可执行文件
  • 目标文件在链接时符号处理、重定向和地址分配如何进行
  • 可执行文件如何被装载并执行
  • 可执行文件与进程的虚拟空间之间如何映射
  • 什么是动态链接,为什么要进行动态链接
  • Window、Linux如何进行动态链接和动态链接是的相关问题
  • 堆、栈
  • 函数调用惯例
  • 运行库
  • 系统调用与API

第一部分

简介
第一章 温故而知新
介绍基本背景知识,包括硬件、操作系统、线程等

回顾计算机系统基本又重要的概念,分两部分
硬件部分、软件部分
本书讨论的计算机:兼容x86指令集的32位CPU的个人计算机
计算机最关键3个部件:中央处理器CPU、内存、I/O控制芯片

计算机的发展
早期计算机:
CPU与内存,频率一样,连接在同一个总线(Bus)上。
I/O设备速度慢很多,通过相应I/O控制器协调后与总线通信。

后期发展:
CPU频率符合摩根定律,一直提速,导致内存跟不上。
发明高速的北桥芯片,低速的南桥芯片进行协调。
虽然硬件结构越看越复杂,但离不开3个关键部件

多核出现的原因:
CPU制造工艺达到物理极限,增加CPU数量提高算力
系统软件:计算机本身的软件,分为两块
一块是:平台性的,比如:操作系统内核、驱动程序、运行库和系统工具。另一块用于程序开发,比如:编译器、汇编器、链接器等开发工具和开发库。

计算机设计的层次结构:
应用系统 中间层 硬件。每个中间层都是对它下面那层的包装和扩展,所以应用系统和硬件相对独立。
接口与系统调用:
应用程序 使用 运行库 提供的 操作系统应用程序编程接口,
运行库 使用 操作系统 提供的 系统调用接口
系统调用接口在实现中往往以软件终端的方式提供
操作系统内核层 使用 硬件层 提供的 硬件接口
硬件的生产厂商负责提供硬件规格,操作系统和驱动程序的开发者通过硬件规格文档和接口标准编写操作系统和驱动程序。

操作系统主要做什么:
两个功能: 提供抽象接口,管理硬件资源
不让CPU打盹
多道程序的方法,缺点程序之间没有优先级。
通过协作模式改良后叫 分时系统
现代的操作系统:多任务操作系统
操作系统接管所有硬件资源,本身运作在一个受硬件保护的级别。所有的应用程序都以进程的方式运行在比操作系统权限更低的级别,每个进程都有自己独立的地址空间,使得进程之间的地址空间互相隔离。CPU由操作系统统一进行分配,每个进程根据进程的优先级的高低都有机会得到CPU,但如果运行时间超过一定时间,操作系统会暂停改进程。这种叫抢占式

怎么样合理利用CPU
进程 虚拟内存 分段 分页
CPU怎么调度线程 优先级…

线程安全
防止多个线程同时访问一个内存地址
解决办法:
锁,用锁来保证同步性。访问前获得锁,访问后释放锁。

  1. 二元锁、多元锁Semaphore, 可以由A线程获取锁,B线程释放锁。
  2. 互斥量Mutex,那个线程获取锁,就要由那个线程释放锁。
  3. 临界区Critical Sectioon。锁的获取称为临界区,把锁的释放称为离开临界区。互斥量和信号量在系统的任何进程都是可见,临界区只有本进程可见,除此之外跟互斥量相同
  4. 读写锁 读不锁,写上锁同步。对于同一个锁,读写锁获取方式 1.共享的 2.独立的

CPU乱序调度造成的线程不安全

线程的内部情况
一用户线程对一内核线程、多对一、多对多

你可能感兴趣的:(《程序员的自我修养》第一部分)