《程序员的自我修养》第一章 温故而知新(计算机基础篇)

《程序员的自我修养》第一章 温故而知新(计算机基础篇)_第1张图片

第一章主要介绍了一些计算机基础知识,如硬件、软件、线程等。读完之后,收益颇多,故此记录。

关键词介绍

硬件

  1. 计算机的三大硬件核心:CPU、内存、I/O 控制芯片
  2. 主频 = 外频(与内存频率一致) * 倍频
  3. 北桥芯片:协调 CPU、内存和高速图形设备的数据交换
  4. 南桥芯片:专门处理低速设备(磁盘、USB、键盘、鼠标等)
  5. 对称处理器(SMP):由于 CPU 的频率被限制在了 4GHz,人们通过增加 CPU 数量来提高 CPU 速度。(在大型的数据库、网络服务器上,同时要处理大量独立请求时,能发挥威力)
  6. 多核处理器:共享比较昂贵的缓存部件,只保留多个核心,从程序员角度,与对称处理器相差不大。

系统软件

  1. 程序员应牢记名言:计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。
  2. 接口:定义每个层次之间通信的协议(原则:精心设计接口,保持其稳定不变,任何一个层都可以被修改或替换)
  3. 软件层次:(从上至下)应用程序-运行库-操作系统内核-硬件

管理硬件资源(如何发挥硬件能力)

  1. CPU 的使用
    • 多道程序(不分轻重缓急)
    • 分时系统(主动让出 CPU)
    • 多任务系统(进程概念的引入,有独立的地址空间,抢占式分配方式)
  2. 硬件驱动:完成繁琐的硬件细节,并抽象供用户使用(如磁盘被抽象为普通文件系统)
  3. 硬盘组成:多个盘片-两面-若干个磁道(同心圆)-若干个扇区(LBA)
  4. 简单的内存分配存在一些问题
    • 地址空间不隔离:程序所使用的内存空间不是相互隔离的,恶意程序可以非常容易修改其它程序的内存数据。
    • 内存使用效率低:如果内存不足,只能将整个程序大量的数据被换入换出。
    • 程序运行的地址不确定:每次程序装入运行时,需要从内存中分配区域,需要重定位。
  5. 解决内存分配问题的方案
    • 隔离分段:引入虚拟内存,与物理内存一一对应,解决 4中的了1、3两个问题。
    • 分页:把地址空间人为地等分成固定大小的页。通过减小粒度的方式,把常用的数据和代码页装载到内存中,把不常用的保存在磁盘里。以页为单位来存取和交换数据。解决了第2个问题。保护也是页映射的目的之一,简而言之每个页可以设置权限属性。采纳技术:MMU(Memory Management Unit)。

线程基础

  1. 什么是线程:轻量级进程,是程序执行流的最小单位。共享进程的内存空间(包括代码段、数据段、堆等)
  2. 线程组成:线程 ID、当前指令指针、寄存器集合和堆栈。
  3. 为何使用线程
    • 可以让一个线程负责交互、另一个线程负责计算
    • 有效利用等待的时间
    • 满足并发操作
    • 相比多进程应用,数据共享
  4. 线程调度的三种状态
    • 运行:线程正在执行
    • 就绪:此时线程可以立刻运行,但 CPU 已经被占用
    • 等待:此时线程正在等待某一事件发生(通常是 I/O 或同步),无法执行
  5. 时间片:处于运行中线程拥有一段可以执行的时间。
  6. 调度方式
    • 优先级调度:根据线程优先级进行调度
    • 轮转法:令线程交错执行
  7. 饿死:一个线程的优先级较低,在它执行之前,总是有较高的优先级的线程要执行。
  8. 优先级调整方式
    • I/O 密集型线程比 CPU 密集型线程容易得到优先级的提升。
    • 用户指定优先级
    • 长时间得不到执行而被提升优先级
  9. 可抢占和不可抢占线程:线程在用尽时间片之后会被强制剥夺继续执行的权利,而进入就绪状态,这个过程叫抢占

线程安全

  1. 原子操作:单指令的操作。
  2. 竞争:多个线程同时访问某个数据或资源。
  3. 同步:在一个线程访问未结束的时候,其它线程不得对同一个数据进行访问。如此,对数据的访问被原子化了
  4. :每一个线程在访问数据或资源时,先试图获取锁,并在访问结束之后释放。在锁已占用的时候,试图获取锁,线程会等待,直到锁可重新获得。
  5. 二元信号量:最简单的一种锁。只有占用和非占用两种状态。只适合被唯一一个线程独占访问的资源。
  6. 多元信号量:允许多个线程并发访问的资源。
  7. 互斥量:与信号量相似,唯一的区别是互斥量是必须由相同线程占用和释放锁。
  8. 临界区:相比信号量和互斥量更严格,只在当前进程可见,并只允许在当前进程获取。
  9. 读写锁(为了解决频繁上锁,性能低下的问题):有两种获取方式,共享的()或独占的()。
  10. 条件变量:类似于栅栏,多个线程一起等待栅栏被撤掉(条件变量被唤醒),才可以一起恢复执行。
  11. 过度优化:编译器在过度优化时,可能交换指令顺序。只有通过插入 barrier,阻止交换。
  12. 线程模型:用户使用的用户线程和内核线程的对应关系
    • 一对一模型优点有实现真正的并发,线程之间不会相互影响。缺点有因为内核线程数受限,用户线程数量也受到限制,其次因为内核线程调度,上下文切换开销大,执行效率低。
    • 多对一模型:多个用户线程对应一个内核线程。优缺点和一对一模型正好相反。
    • 多对多模型:针对前两个模型的特点,这种模型可以完美解决上面存在的问题。

第一章更新完毕...

你可能感兴趣的:(《程序员的自我修养》第一章 温故而知新(计算机基础篇))