[TOC]
# 简介
如果每个程序员都不得不掌握系统的所有细节,那就不可能再编写代码了.而且管理这些部件并加以优化使用,是一个挑战性极强的工作.所以计算机安装了一个操作系统
# 运行模式
**多数计算机有2种运行模式:内核态和用户态.**
软件最基础是操作系统,他运行在内核态(也称为管态,核心态),在这个模式中,操作系统对所有硬件有完全访问权,可以执行机器能够运行的任何指令.
软件其他部分运行在用户态,在用户态下,只使用了机器指令中的一个子集.特别的,哪些会影响机器的控制或可进行I/O操作的指令,在用户态是完全禁止的
![](https://box.kancloud.cn/6d4d4bd7a064f0241f225d0e511b04e7_920x518.png)
# 作为一个可扩展的操作系统
**抽象是管理所有复杂性的一个关键.好的抽象可以把一个几乎不可能管理的任务划分成2个可管理的部分.
其第一部分是有关抽象的定义和实现.
第二部分是随时用这些抽象解决问题**
操作系统的任务是创建好抽象,并实现和管理它所创建的抽象
# 作为资源管理者的操作系统
**把操作系统看作应用程序提供的基本抽象概念,是一种自顶向下的观点.
按照另一种自底向上的观点,操作系统则用来管理一个复杂系统的各个部分**
**资源管理者包括用以下2种不同方式实现多路复用(共享)资源,在时间和空间上复用**
当一种资源在时间上复用时,不同的程序或用户轮流使用它
空间复用,每个客户都得到资源的一部分,从而取代客户排队,通常在运行程序之间分割内存,这样每一个运行程序都可以同时入驻内存,假设有足够多的内存可以放多个程序,那么在内存中同时存放若干个程序的效率,比把所有内存给一个程序效率要高的多,特别是程序只需要内存中的一部分,更是这样
# 简单的个人计算机中部件
![](https://box.kancloud.cn/632caf5a70ef4640fb45860ec8cb10dd_1427x636.png)
# 处理器
每个cpu都有一套可执行的专门指令集,所以x86的处理器不能执行ARM程序,而ARM处理器不能处理X86程序
**寄存器**
除了用来保存变量和临时结果的通用寄存器之外,多数计算机还有一些对程序员可见的专用寄存器.其中之一是**程序计数器**,它保存了将要取出的下一条指令的内存地址,在指令取出之后,程序计数器就被更新以便指向后继的指令
另一个寄存器是**堆栈指针**,它指向内存中当前栈的顶端,该栈包含了每个执行过程的栈帧.一个过程的栈帧中保存了有关的输入参数,局部变量以及那些没有保存在寄存器中的临时变量
当前还有**程序状态字**寄存器,这个寄存器包含了条件码位(由比较指令设置),cpu优先级,模式(用户态和内核态),以及各种其他控制位,用户程序通常读入整个psw,但是只对其中少量的字段写入.在系统调用和I/O中,psw很重要
无论32位的寄存器,还是64位的寄存器,他们存储容量都小于1kb
为了改善性能,cpu设计师早就放弃了同时读取,解码和执行一条指令的简单模型.许多现代cpu具有同时取出多条指令的机制
比流水线更先进的设计是超标量的cpu
![](https://box.kancloud.cn/32c336e1f12cc1399c3783074587b4d8_927x357.png)
除了在嵌入式系统中非常简单的cpu之外,多数cpu有2种模式,前面提到的内核态和用户态
psw有一个二进制位控制这2个模式,当在内核态运行时,cpu可以执行指定集中的每一条指令,并且使用硬件的每种功能
用户程序在用户态下运行,仅允许执行整个指令集的一个子集和访问所有功能的一个子集,当然将psw模式位设置为内核态也是禁止的
从操作系统中获得服务,用户程序必须使用系统调用(system call)以陷入内核态并调用操作系统,TRAP指令把用户态切换成内核态,并启用操作系统,操作完成切换为用户态
# 超线程
![](https://box.kancloud.cn/a82f7ea8b361e7cec970a498c7faa60c_1417x888.png)
# GPU
其实在绝对数目方面,没什么能跑赢现代的GPU.GPU指的是由成千上万个微核组成的处理器.他们擅长处理大量并行的简单计算,比如在图像应用中渲染多边形.他们不太能胜任串行任务,并且很难编程.虽然CPU对操作系统很有用(比如加密或处理网络传输),当操作系统本身不太可能运行在GPU上
# 高速缓存
高速缓存命中,缓存满足了请求,就不需要通过总线把访问请求送往主存.
高速缓存命中通常需要2个时钟周期.高速缓存没有命中就要访问主存了,这需要付出大量的时间代价
由于高速缓存价格昂贵,所以大小有限,有些机器具有2级甚至3级高速缓存,每一级缓存比前一级慢并且容量大
现代cpu设置了2个缓存,第一级称为L1缓存,总是在cpu中,用来将已解码的指令调入cpu的执行引擎.对于那些频繁使用的数据字,多数芯片安排有第二个L1缓存,典型的L1缓存大小为16kb,另外,往往还设计有二级缓存称为L2缓存,用来存放进来使用过的若干兆字节的内存字,L1和L2缓存之间的差别在于时序.对于L1缓冲的访问,不存在任何延迟,而对于L2缓存的访问,则会延迟1或2个时钟
# 磁盘
磁盘结构
![](https://box.kancloud.cn/a0f436b7d2be9372aea52310c1896a47_1429x652.png)
最近流行的固态硬盘,叫闪存,如果闪存擦除的次数过多,就被磨损了
# 总线
![](https://box.kancloud.cn/72886c6f8872178ffd2942573824baf6_723x519.png)
# posix
- 书列表
- laravel框架关键技术
- 第一章 组件化开发与composer使用
- 简介
- composer
- 添加路由组件
- 添加控制器模块
- 添加模型组件
- 添加视图组件
- 第三章 laravel框架中常用的php语法
- 匿名函数
- 文件包含
- 魔术方法
- 魔术常量
- 反射
- 后期静态绑定
- traits
- 第四章 laravel框架中使用的HTTP协议基础
- HTTP协议
- 数据库
- 数据迁移
- 第六章 laravel框架中的设计模式
- IOC模式
- php核心技术与最佳实践
- 第一章面向对象核心
- 反射
- 简单ORM
- 异常和错误
- 接口
- 第二章,面向对象设计
- 设计原则
- 单一职责
- 接口隔离
- 开放封闭
- 替换原则
- 依赖倒置
- linux是怎么写的呢?
- 第三章 正则表达
- 认识正则
- 第四章 php网络技术应用
- HTTP协议详解
- php和http相关函数
- 垃圾信息防御措施
- 现代操作系统
- 引论
- sql必知必会
- 限制结果
- 按位置排序
- where求职顺序
- IN操作符
- like
- 函数
- group by
- 组合查询
- 插入检索出的数据
- 视图
- 高性能mysql
- 第一章节 mysql架构与历史
- mysql架构逻辑图
- 连接与管理
- 优化与运行
- 读写锁
- 锁粒度
- 表锁(table lock)
- 行级锁(row lock)
- ACID
- 隔离级别
- 死锁
- 隐式和显式锁定
- 多版本并发控制
- Innodb概览
- 第四章节 Schema与数据类型优化
- 选择优化的数据类型
- 日期和时间类型
- 标识列
- 特殊类型数据
- 表设计中的缺陷
- 范式
- 计数器表
- 第五章 创建高性能索引
- 索引基础
- 索引类型
- 索引的优点
- 高性能索引策略
- 选择合适的索引列顺序
- 聚簇索引
- 顺序的主键什么时候会造成更坏的后果
- 覆盖索引
- 使用索引扫描来做排序
- 压缩索引
- 冗余和重复索引
- 索引和锁
- 支持多种过滤条件
- 什么是范围条件
- 优化排序
- 维护索引和表
- 表损坏
- 减少索引和数据的碎片
- 第六章 查询性能优化
- 扫描的行数和访问类型
- 重构查询方式
- 查询执行的基础
- 重构-改善既有代码设计
- 第一章-重构
- 什么是重构
- 第一个案列
- 重构第一步
- 王垠博客
- 多态取代价格相关逻辑