计算机硬件
计算机硬件核心三部分:中央处理器CPU、内存、I/O控制芯片
CPU频率:大体上理解是,CPU操作的最小时间单位叫时钟周期,它的倒数叫频率。意思就是一秒钟CPU能执行多少条指令。频率越高,单位时间内能执行的命令越多,也就越快。时钟参考资料、频率参考资料
早期计算机
- CPU的频率和内存的频率一致,直接连接到同一个总线Bus
- 为了协调I/O和总线的速度,每个I/O设备都有一个I/O控制器
发展
- CPU频率高于内存频率。采用 总线频率和内存频率一致,CPU倍频与总线通信的 方式
- I/O速度无法满足图形化芯片的需求,设计北桥芯片进行通信
- 为了减轻北桥芯片既要处理高速设备、又要处理低速设备的压力,设计南桥芯片。南桥主要处理低俗设备,汇总后连接到北桥
SMP和多核
- 频率越高,机器相应的性能会好,但是CPU的制造工艺限制,频率卡在了4GHz
- 提高CPU速度的另外的方式:增加CPU数量
- SMP对称多处理器,每个CPU完整,有cache等。
- 多核:共享昂贵的缓存设备,保留多个核心。
- 核的数量和速度提升不是线性正比,因为计算任务并不是完全相互独立。就和一个妈妈十个月才能生一个孩子,但是不能十个妈妈一个月生一个孩子。
计算机软件
-
管理计算机本身的软件称为系统软件。平台型软件:操作系统内核、驱动程序、运行库、系统工具;软件开发型:编译器、汇编器、链接器、开发库。
-
计算机软件有着严格的层次结构,各层之间通过接口进行通信。接口实际上就是一个通信协议,由下层定义实现,由上层调用。
-
层次结构的好处是,中间层都是对于下一层的封装和扩展,可以通过新加层提供其它功能。
-
应用程序使用运行库提供的应用程序接口API,比如Windows的运行库提供Windows API。运行库使用操作系统提供的系统调用接口,往往以软件中断的方式提供,比如Linux使用0x80号终端作为系统调用接口。操作系统和驱动程序使用硬件提供的硬件规格。
操作系统和设备驱动的作用
- 操作系统的功能:提供抽象的接口+管理硬件资源。操作系统不能让硬件资源闲置,要尽可能地挖掘其工作潜能。
- 多道程序:一个监控程序,当前程序没有使用CPU时,将另外等待CPU资源的程序启动。缺点:太粗糙,没有轻重缓急,交互性不行
- 分时系统:每个程序运行一段时间后主动让出CPU。缺点:程序主动让出CPU时间,如果一个程序写了个死循环,整个系统就像死机了一样。
- 多任务系统:操作系统接管所有硬件资源,并且运行在一个受硬件保护的级别。每个进程运行在比操作系统低权限地级别,有着自己独立的地址空间,有着自己的优先级。操作系统分配时间给进程,一段时间后剥夺CPU给另外地进程使用。即抢占式。
- 设备驱动屏蔽了底层硬件实现和调用的细节问题,给上层运行库和应用程序一个调用接口。比如输出到屏幕,程序设计者不用考虑到底硬件怎么输出的,比如在哪个位置呈现一个像素点。这些都交给了设备驱动程序来完成。
文件系统
- 文件系统管理着磁盘中文件的存储方式。比如一个长8000字节的文件,文件系统将前4096字节存储在磁盘的1000-1007山区,每个扇区512字节;4097-8000字节存储在磁盘的2000-2007扇区。
- 硬盘结构:一个磁盘有两个盘面,每个盘面按同心圆划分成多个磁道。每个磁道划分成若干个扇区,每个扇区大约512字节。由于靠近圆心的磁道长度小于外层的磁道,如果每个磁道划分成相同的扇区,那么外层磁道的密度肯定比内层小。所以我们采用逻辑扇区号,逻辑扇区号然后转换成盘片、盘面、磁道、扇区。
- 比如某个程序需要读取文件的前4096个字节,通过系统调用发送信息给设备驱动程序,设备驱动程序发送硬件命令给硬盘。
存储设备
假设当前有128M内存,程序A需要内存:10MB,程序B需要内存:100MB,程序C需要内存:20MB.
未使用内存管理时
方案一:0-9MB分配给A,10-109MB分配给B。缺点如下:
- 地址空间不是隔离的,每个程序都可以直接访问物理地址。那么某些程序可能有意或者无意地就修改了其它程序。
- 内存使用效率低下。如果要运行C,内存目前不够分配。所以要将某个进程写到磁盘,腾出空间给C。将A换出内存仍然不够,只能将B换出,然后将C读入。大量的数据换入换出效率低下。
- 程序运行地址不确定。因为每次换入到内存中,地址是不确定的,这样导致重定位问题严重。
解决思路:地址空间
- 上述问题解决思路:增加一个中间层,使用间接的地址访问,将程序给出的地址看作虚拟地址,将虚拟地址映射到物理地址。通过控制映射过程,保证任意程序访问的内存区域互不重叠,保证隔离性。
- 地址空间:地址空间类似于一个数组,数组地每个元素占一个字节,数组的大小为地址空间的地址长度决定。32为的地址空间大小为2^32=4GB。
- 物理地址空间每台计算机唯一一个,相当于物理内存。比如32位机器,物理空间4GB,但是可能装的内存只用512MB。那物理地址有效部分是0x0000 0000~0x1FFF FFFF,其它的部分无效。
- 虚拟地址是虚拟出来的,每个进程不一样,每个进程只能访问自己的地址空间,从而进程隔离。
分段
-
对于程序A,虚拟地址空间0x0000 0000~0x00A0 0000。然后在内存中分配一个相同大小的物理地址,假设为0x0010 0000-0x00B0 0000
-
操作系统完成两个地址空间的一一映射,映射过程由软件来完成,实际的转换由硬件来完成。
-
分段解决了隔离性问题:如果程序访问的虚拟空间地址越界,硬件就会判断非法访问,报告错误给操作系统。
-
分段解决了地址重定位问题:每个程序不关心物理地址的变化,只需要按照虚拟地址空间来编写程序,放置变量。
-
分段没解决内存使用效率低下的问题:内存分配以程序为单位进行分配,还是有可能进行大量的磁盘-内存交换操作。
-
解决思路:程序在运行的一小个时间段内,不是使用了程序的所有数据,而是只使用到了一小部分数据。根据局部性原理减小内存分割、映射的粒度,不再以程序整体为粒度。
分页
-
将地址空间人为分成固定大小的页,每页的大小由硬件决定。在同一时刻只能存在一种页的大小。
-
在某个时刻,进程只将需要用到的页换到内存中,其它没有用到的页继续存放在磁盘中。当进程需要的某个不在内存中的页时,硬件捕获页错误消息,操作系统接管进程,将虚拟页的数据从磁盘换入到内存中。
-
CPU发出的都是虚拟地址,经过MMU转换成物理地址访问内存。
线程进程
- CPU频率现在无法提升,我们采取多核措施。软件并发执行的一个方法就是多线程。
- 线程,轻量级进程,程序执行流的最小单元。
线程 | 进程 |
---|---|
独有:线程ID、当前指令指针PC、寄存器集合、栈、特定创建的私有堆 | 多个线程组合而成,他们共享代码段、数据段、堆、进程级资源如打开文件和信号 |
- 多线程的优点:某个线程得不到数据就进入等待状态,另外的线程继续执行,从而有效利用了等待的时间,比如网页访问,比如交互与计算线程;相比多进程,多线程共享数据效率更高。
- 并发和并行:并行是某一时刻同时运行,并发是某一时间段同时运行。对于多核,可以实现真正的并发,对于单核,一般是模拟并发。
- 线程的三种状态:就绪、运行、等待
- 线程调度方案
- 轮转法:各个线程轮流执行一小段时间
- 优先级法:各个线程有自己的优先级,高优先级限制性。
- 线程的优先级可以认为手动设定,操作系统还会自动调节。频繁进入等待状态的线程受到欢迎。I/O密集型线程即频繁进入等待状态的线程,CPU密集型线程很少进入等待状态。
- 饿死现象:线程的优先级较低,一直得不到CPU资源。操作系统会根据一定的规则逐步提高一直得不到CPU资源的线程的优先级。
- 抢占和不可抢占线程:
- Linux多线程:
- 线程安全
参考资料
- 俞甲子. 程序员的自我修养 : 链接、装载与库[M]. 北京 : 电子工业出版社, 2009