程序员的自我修养-笔记一

1、以一个简单的问题开始,HelloWorld运行的过程:包括

  • 编译器对程序的处理
  • 生成可执行文件是怎么组织的
  • 语言库
  • 操作系统负责的事情
  • 程序运行时候的内存分配
2、了解计算机:硬件和软件
硬件核心为CPU,内存和IO
 硬件结构的发展:
  • 早期的单总线模式,每个设备对应一个对应的IO控制器(CPU与其他设备的速度差异大,需要中间层,CPU频率和内存还差不多)
  • 系统总线模式,频率与内存频率一样,CPU采用倍频方式通信(CPU和内存的频率相差越来越大)
  • 南北桥芯片的设计,高速北桥,低速南桥(图形芯片的出现,慢速的总线无法满足)
  • 对称多处理器(SMP),适合处理高并发
软件部分核心为:操作系统,驱动程序,编译器等。
整个软件体系结构都是通过中间层的设计方式设计,下层提供接口,上层负责调用,中间层都是对下层的包装和扩展(接口的实现)
例子:操作系统是下层,那么操作系统的API就是中间层,开发工具和应用程序则属于上层
    操作系统作为上层的话,那么驱动程序为中间层,硬件设备是下层

3、操作系统:提供抽象接口,管理硬件资源

3.1 CPU资源的管理:发展
  • 最开始是单道程序系统:CPU利用率低
  • 多道程序系统:提高CPU利用率,当CPU空闲的时候插入运行
  • 分时系统:防止一个程序占用时间过多,但是如果有优先级高的程序一直运行的话,系统会陷入死机状态
  • 多任务系统:以进程为单位,如果有进程占用时间过长,则会挂起
3.2 操作系统对硬件设备的管理:驱动程序是中间层,硬件厂商根据操作系统接口设计驱动程序
例子:读取磁盘数据到内存中(操作系统->文件系统->磁盘驱动->磁盘硬件处理)
硬盘常识:盘片,正反面,磁道,扇区(512B)

3.3 操作系统对内存的管理:
  • 早期的程序是直接运行在物理内存上,直接访问物理地址(问题:地址空间不隔离(内存会被其他程序修改),内存使用效率低(内存空间不足的时候会频繁和磁盘空间交互),程序运行的地址不确定(重定位问题))
  • 添加中间层,使用虚拟地址,虚拟地址空间再映射到具体的物理地址空间,每个进程只能访问自己的虚拟空间,这样有效的实现了进程的隔离
  • 分段的虚拟内存设计:将一段与程序所需要空间大小的虚拟空间映射到某个地址空间(解决了隔离和地址不确定问题)
  • 分页的虚拟内存设计:大致其实和分段类似,只是这里以页为单位进行地址映射;内存和硬盘之间的交换方式以页为单位,大大提高了交换效率
4、线程相关:
  • 基础:一个标准线程包括:ID,当前指令指针,寄存器集合,堆栈。共享进程的内存空间(代码,数据,堆和进程级资源)
  • 多线程优势:提高效率,并发优势,提高多核CPU的利用率
  • 线程的优先级和调度:可抢占式的线程使用优先级调度和轮转法进行线程调度。优先级保证了线程更加灵活的调度,而轮转法可以避免”饿死“的状态,当线程等待时间长的时候自动调高优先级(一些基本概念:线程三态:运行,就绪,等待;时间片;IO密集型和CPU密集型线程)
  • 线程安全:多线程操作同一个数据的时候,如果操作不是原子的,就会使数据的最后结果难以预测。解决这一问题需要对数据进行同步,利用“锁”
  • 锁的实现:二元信号量(只允许一个线程独占一个数据),互斥量(哪个线程获取了就需要哪个线程去释放锁),临界区(只允许本进程修改锁),读写锁(分状态:自由,共享,独占),条件变量(可以恢复所有线程的执行)
  • 可重入的函数:可以在多线程环境中放心使用。因为其不调用到可修改的共享变量,不依赖资源锁,不调用任何不可重入函数
  • CPU的过度优化:动态调度会交换指令顺序,到时即使加了锁还是不能保证线程安全(使用barrier保证不交换指令顺序)
  • 三种线程模型:一对一模型(直接使用API或系统调用创建的线程均为一对一线程);一对多模型;多对多模型









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值