系统软件
用于管理计算机本身的软件称为系统软件,可以分成两块:
一块是平台性的,如操作系统内核、驱动、运行库;
另外一块是用于程序开发的,如编译器、汇编器、链接器。
软件体系架构
软件体系架构
计算机中的主要资源
CPU
不要让CPU空闲
多道程序:通过监控程序使CPU不空闲,一空闲,就把等待着的程序启动(策略粗糙,不分轻重)。
分时系统:部分系统调用时,OS判断是否有其他程序在等待,有就让出CPU。(问题:如果有1个程序进行耗时运算或陷入无限循环,不进行系统调用,OS就好像死机了一样。
多任务系统:通过抢占式分配CPU。所有应用程序以进程的方式,运行在比OS权限低的级别。CPU由OS进行分配,每个进程有优先级。OS将CPU执行的进程快速切换,造成了很多进程同时运行的假象。
存储(磁盘+内存)
磁盘
物理磁盘分为多个盘片,每个盘片2个盘面,每面按同心圆分为若干磁道,每个磁道分为若干扇区,每个扇区一般存储512字节数据。
硬盘g
现代磁盘已经演进为 => 屏蔽了复杂的硬件细节,通过LBA(Logical Block Address),对整个磁盘的扇区从001进行编号。
内存
早期,各程序是直接运行在物理内存上的,
因此带来了3个问题:
进程间地址空间不隔离,程序间可以相互改写数据
内存使用效率低,进程需要连续大小的内存,导致内存碎片
程序运行地址不确定,导致函数重定位困难
为此提出过2个解决方案:
分段:提出了每个进程独自的虚拟地址,通过页表与物理地址间进行映射
分段映射
这个方案解决了问题1、3,但是没有解决连续内存的问题,于是提出了方案2。
分页:在方案1的基础上,将虚拟内存分页(每页4kb)、物理内存分帧(每帧也是4kb),然后将页帧间进行映射
分页映射
ps.内存中每个地址可容纳1个byte的数据
分页之后其他问题:单进程的最大虚拟地址4GB(32位OS),物理内存最大4GB,会导致多进程运行时,物理内存可能会不够用。
解决方法:将进程中使用次数少的数据映射到磁盘。
虚拟内存分段:在进程的虚拟内存中,会根据数据类型进行分段管理。
虚拟内存地址分配
IO设备
线程
因多核CPU的发展而诞生
轻量级进程,程序执行流的最小单元
每个进程由1~3个线程组成,会共享进程的text、data、heap段中的数据,寄存器和栈中的数据不共享。
线程有三种状态:
运行
就绪:可以立即运行,但是当前无空闲CPU
等待:等待IO,无法执行
每个线程拥有一段可执行的时间,称为时间片。
线程状态切换
调度
优先级调度 + 轮转法:
每个线程有优先级,高优先级的线程更早被分配时间片。
线程可分为IO密集型线程(经常IO主动放弃时间片)和CPU密集型线程(很少等待IO,一直在进行运算),
其中IO密集型线程更容易获得优先级的提升。
导致的问题:进程饿死,优先级过低的线程,始终分配不到时间片,无法执行。
解决:等待过久的线程将获得优先级提升。
备注
Linux下不存在真正意义上的线程概念,都称为任务(task)。但是不同的任务间可以共享内存空间,构成同一个进程,这些任务也就成了这个进程里的线程。