程序员的自我修养——学习笔记1


计算机硬件

计算机硬件核心三部分:中央处理器CPU、内存、I/O控制芯片
CPU频率:大体上理解是,CPU操作的最小时间单位叫时钟周期,它的倒数叫频率。意思就是一秒钟CPU能执行多少条指令。频率越高,单位时间内能执行的命令越多,也就越快。时钟参考资料频率参考资料

早期计算机
  1. CPU的频率和内存的频率一致,直接连接到同一个总线Bus
  2. 为了协调I/O和总线的速度,每个I/O设备都有一个I/O控制器
发展
  1. CPU频率高于内存频率。采用 总线频率和内存频率一致,CPU倍频与总线通信的 方式
  2. I/O速度无法满足图形化芯片的需求,设计北桥芯片进行通信
  3. 为了减轻北桥芯片既要处理高速设备、又要处理低速设备的压力,设计南桥芯片。南桥主要处理低俗设备,汇总后连接到北桥
SMP和多核
  1. 频率越高,机器相应的性能会好,但是CPU的制造工艺限制,频率卡在了4GHz
  2. 提高CPU速度的另外的方式:增加CPU数量
  3. SMP对称多处理器,每个CPU完整,有cache等。
  4. 多核:共享昂贵的缓存设备,保留多个核心。
  5. 核的数量和速度提升不是线性正比,因为计算任务并不是完全相互独立。就和一个妈妈十个月才能生一个孩子,但是不能十个妈妈一个月生一个孩子。

计算机软件

  1. 管理计算机本身的软件称为系统软件。平台型软件:操作系统内核、驱动程序、运行库、系统工具;软件开发型:编译器、汇编器、链接器、开发库。
    层次结构

  2. 计算机软件有着严格的层次结构,各层之间通过接口进行通信。接口实际上就是一个通信协议,由下层定义实现,由上层调用。

  3. 层次结构的好处是,中间层都是对于下一层的封装和扩展,可以通过新加层提供其它功能。

  4. 应用程序使用运行库提供的应用程序接口API,比如Windows的运行库提供Windows API。运行库使用操作系统提供的系统调用接口,往往以软件中断的方式提供,比如Linux使用0x80号终端作为系统调用接口。操作系统和驱动程序使用硬件提供的硬件规格。

操作系统和设备驱动的作用

  1. 操作系统的功能:提供抽象的接口+管理硬件资源。操作系统不能让硬件资源闲置,要尽可能地挖掘其工作潜能。
  2. 多道程序:一个监控程序,当前程序没有使用CPU时,将另外等待CPU资源的程序启动。缺点:太粗糙,没有轻重缓急,交互性不行
  3. 分时系统:每个程序运行一段时间后主动让出CPU。缺点:程序主动让出CPU时间,如果一个程序写了个死循环,整个系统就像死机了一样。
  4. 多任务系统:操作系统接管所有硬件资源,并且运行在一个受硬件保护的级别。每个进程运行在比操作系统低权限地级别,有着自己独立的地址空间,有着自己的优先级。操作系统分配时间给进程,一段时间后剥夺CPU给另外地进程使用。即抢占式。
  5. 设备驱动屏蔽了底层硬件实现和调用的细节问题,给上层运行库和应用程序一个调用接口。比如输出到屏幕,程序设计者不用考虑到底硬件怎么输出的,比如在哪个位置呈现一个像素点。这些都交给了设备驱动程序来完成。

文件系统

  1. 文件系统管理着磁盘中文件的存储方式。比如一个长8000字节的文件,文件系统将前4096字节存储在磁盘的1000-1007山区,每个扇区512字节;4097-8000字节存储在磁盘的2000-2007扇区。
  2. 硬盘结构:一个磁盘有两个盘面,每个盘面按同心圆划分成多个磁道。每个磁道划分成若干个扇区,每个扇区大约512字节。由于靠近圆心的磁道长度小于外层的磁道,如果每个磁道划分成相同的扇区,那么外层磁道的密度肯定比内层小。所以我们采用逻辑扇区号,逻辑扇区号然后转换成盘片、盘面、磁道、扇区。
  3. 比如某个程序需要读取文件的前4096个字节,通过系统调用发送信息给设备驱动程序,设备驱动程序发送硬件命令给硬盘。

存储设备

假设当前有128M内存,程序A需要内存:10MB,程序B需要内存:100MB,程序C需要内存:20MB.

未使用内存管理时

方案一:0-9MB分配给A,10-109MB分配给B。缺点如下:

  1. 地址空间不是隔离的,每个程序都可以直接访问物理地址。那么某些程序可能有意或者无意地就修改了其它程序。
  2. 内存使用效率低下。如果要运行C,内存目前不够分配。所以要将某个进程写到磁盘,腾出空间给C。将A换出内存仍然不够,只能将B换出,然后将C读入。大量的数据换入换出效率低下。
  3. 程序运行地址不确定。因为每次换入到内存中,地址是不确定的,这样导致重定位问题严重。
解决思路:地址空间
  1. 上述问题解决思路:增加一个中间层,使用间接的地址访问,将程序给出的地址看作虚拟地址,将虚拟地址映射到物理地址。通过控制映射过程,保证任意程序访问的内存区域互不重叠,保证隔离性。
  2. 地址空间:地址空间类似于一个数组,数组地每个元素占一个字节,数组的大小为地址空间的地址长度决定。32为的地址空间大小为2^32=4GB。
  3. 物理地址空间每台计算机唯一一个,相当于物理内存。比如32位机器,物理空间4GB,但是可能装的内存只用512MB。那物理地址有效部分是0x0000 0000~0x1FFF FFFF,其它的部分无效。
  4. 虚拟地址是虚拟出来的,每个进程不一样,每个进程只能访问自己的地址空间,从而进程隔离。
分段
  1. 对于程序A,虚拟地址空间0x0000 0000~0x00A0 0000。然后在内存中分配一个相同大小的物理地址,假设为0x0010 0000-0x00B0 0000

  2. 操作系统完成两个地址空间的一一映射,映射过程由软件来完成,实际的转换由硬件来完成。
    分段

  3. 分段解决了隔离性问题:如果程序访问的虚拟空间地址越界,硬件就会判断非法访问,报告错误给操作系统。

  4. 分段解决了地址重定位问题:每个程序不关心物理地址的变化,只需要按照虚拟地址空间来编写程序,放置变量。

  5. 分段没解决内存使用效率低下的问题:内存分配以程序为单位进行分配,还是有可能进行大量的磁盘-内存交换操作。

  6. 解决思路:程序在运行的一小个时间段内,不是使用了程序的所有数据,而是只使用到了一小部分数据。根据局部性原理减小内存分割、映射的粒度,不再以程序整体为粒度。

分页
  1. 将地址空间人为分成固定大小的页,每页的大小由硬件决定。在同一时刻只能存在一种页的大小。

  2. 在某个时刻,进程只将需要用到的页换到内存中,其它没有用到的页继续存放在磁盘中。当进程需要的某个不在内存中的页时,硬件捕获页错误消息,操作系统接管进程,将虚拟页的数据从磁盘换入到内存中。
    分页

  3. CPU发出的都是虚拟地址,经过MMU转换成物理地址访问内存。
    CPU使用地址方式

线程进程

  1. CPU频率现在无法提升,我们采取多核措施。软件并发执行的一个方法就是多线程。
  2. 线程,轻量级进程,程序执行流的最小单元。
线程进程
独有:线程ID、当前指令指针PC、寄存器集合、栈、特定创建的私有堆多个线程组合而成,他们共享代码段、数据段、堆、进程级资源如打开文件和信号

多线程
资源

  1. 多线程的优点:某个线程得不到数据就进入等待状态,另外的线程继续执行,从而有效利用了等待的时间,比如网页访问,比如交互与计算线程;相比多进程,多线程共享数据效率更高。
  2. 并发和并行:并行是某一时刻同时运行,并发是某一时间段同时运行。对于多核,可以实现真正的并发,对于单核,一般是模拟并发。
  3. 线程的三种状态:就绪、运行、等待
  4. 线程调度方案
    1. 轮转法:各个线程轮流执行一小段时间
    2. 优先级法:各个线程有自己的优先级,高优先级限制性。
    3. 线程的优先级可以认为手动设定,操作系统还会自动调节。频繁进入等待状态的线程受到欢迎。I/O密集型线程即频繁进入等待状态的线程,CPU密集型线程很少进入等待状态。
    4. 饿死现象:线程的优先级较低,一直得不到CPU资源。操作系统会根据一定的规则逐步提高一直得不到CPU资源的线程的优先级。
  5. 抢占和不可抢占线程:
  6. Linux多线程:
  7. 线程安全

参考资料

  1. 俞甲子. 程序员的自我修养 : 链接、装载与库[M]. 北京 : 电子工业出版社, 2009
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值