基础知识
-
计算机有各种硬件,但在软件开发者的角度看有三个最为关键:中央处理器(CPU),内存和I/O控制芯片
-
早期的计算机没有很复杂的图形功能, CPU 的核心频率也不高,跟内存的频率一样,它们都是直接连接在同一个总线 (Bus) 上的。由于I/O 设备诸如显示设备、键盘、软盘和 磁盘等速度与 CPU 和内存相比还是慢很多,所以效率很缓慢
-
为了协调CPU、 内存和高速的图 形设备,人们专门设计了一个高速的北桥芯片,以便它们之间能够高速地交换数据
-
由于北桥运行的速度非常高,所有相对低速的设备如果全都直接连接在北桥上,北桥 既须处理高速设备,又须处理低速设备,设计就会十分复杂。于是人们又设计了专门处理 低速设备的南桥 (Southbridge) 芯片,磁盘、 USB、 键盘、鼠标等设备都连接在南桥上, 由南桥将它们汇总后连接到北桥上。
SMP
- 很早以前就有了多 CPU 的计算机,其中最常见的一种形式就是对称多处理器(SMP Symmetrical Multi -Processing ),简单地讲就是每个 CPU 在系统中所处的地位和所发挥的 功能都是一样的,是相互对称的。
站得高,看得远
-
系统软件这个概念其实比较模糊,传统意义上一般将用于管理计算机本身的软件称为系 统软件,以区别普通的应用程序。
系统软件可以分成两块, 一块是平台性的,比如操作系统 内核、驱动程序、运行库和数以千计的系统工具;另外一块是用于程序开发的,比如编译器、 汇编器、链接器等开发工具和开发库。本书将着重介绍系统软件的一部分,主要是链接器和 库(包括运行库和开发库)的相关内容。 -
计算机软件体系结构每个层次之间都须要相互通信,既然须要通信就必须有一个通信的协议,我们一般将其 称为接口 (Interface),接口的下面那层是接口的提供者,由它定义接口;接口的上面那层 是接口的使用者,它使用该接口来实现所需要的功能。
-
开发工具与应用程序是属 于同一个层次的,因为它们都使用一个接口,那就是操作系统应用程序编程接口,应用程序接口的提供者是运行库,什么样的运行库提供什么样的 API, 比如Linux 下的 Glibc 库提供 POSIX 的 API;
-
运行库使用操作系统提供的系统调用接口,系统调用接口在实现中往往以软件中断的方式提供
-
操作系统内核层对于硬件层来说是硬件接口的使用者,驱动程序如何操作硬件,如何与硬件进行通信。 这种接口往往被叫做硬件规格
操作系统
-
操作系统的一个功能是提供抽象的接口,另外一个主要功能是管理硬件资源。
-
操作系统作为硬件层的上层,它是对硬件的管理和抽象。对于操作系统上面的运行库和 应用程序来说,它们希望看到的是一个统一的硬件访问模式。
-
当成熟的操作系统出现以后,硬件逐渐被抽象成了系列概念。
这些繁琐的硬件细节全 都交给了操作系统,具体地讲是操作系统中的硬件驱动 (Device Driver)程序来完成。 -
文件系统管理着磁盘中文件的存储方式
-
操作系统分段,分页
线程
-
线 程 (Thread),有时被称为轻量级进程, 是程序执行流 的最小单元。一个标准的线程由线程 ID、当前指令指针 (PC)、 寄存器集合和堆栈组成。
-
一个进程由一个到多个线程组成,各个线程之间共享程序的内存空间(包括代码 段、数据段、堆等)及一些进程级的资源(如打开文件和信号)。
-
线程的访问非常自由,它可以访问进程内存里的所有数据,甚至包括其他线程的堆栈
-
线程调度与优先级
我们一般把频繁等待的 线程称之为 IO 密集型线程, 而把很少等待的线程称为CPU 密集型线程。IO密集型线程总是比CPU 密集型线程容易得到优先级的提升。 -
饿死
Linux的多线程
- Linux 将所有的执行实体(无论是线程还是进程)都称为任务 (Task)
Linux 下不同的任务之间可以选择共享内存空间,因而在实际意义上,共享了同一个内存空间的多 个任务构成了一个进程,这些任务也就成了这个进程里的线程。 - fork可以创建一个新任务
fork 产生新任务的速度非常快,因为 fork 并不复制原任务的内存空间,而是和原任务 一起共享一个写时复制 的内存空间。所谓写时复制, 指的是两个任务可以同时自由地读取内存,但任意一个任务试图对内存进行修改时,内存就 会复制一份提供给修改方单独使用,以免影响到其他的任务使用。
线程安全
- 原子操作
- 同步与锁
互斥量,临界区,读写锁
参考资料:<<程序员的自我修养>>