登 录
注 册
< 系统运维
Linux
计算机系统
系统工具
系统硬件组成
高速缓存
存储器及操作系统
Amdahl定理
信息表示和处理
内存有关错误
全球IP因特网
信号量同步线程
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
计算机系统
>>
存储器及操作系统
存储器及操作系统
2020-07-05 12:13:37 星期日 阅读:1694
 ####存储设备形成层次结构 在处理器和一个较大、较慢的设备(比如:主存)之间插入一个更小更快的存储设备(例如高速缓存)的想法已经成为一个普遍的观念。实际上,每个计算机系统中的存储设备都被组织成了一个存储器层次结构。如上图所示,在这个层次结构中,从上至下,设备的访问速度越来越慢,容量越来越大,并且每字节的造价也越来越便宜。寄存器文件在层次结构中位于最顶部,也就是0级或者记为L0。 存储器层次结构的主要思想是`上一层的存储器作为第一层存储器的高速缓存`。例如: - 寄存器文件就是L1的高速缓存; L2是L3的高速缓存; L3是主存的高速缓存; 主存是磁盘的高速缓存; 在某些具有分布式文件系统的网络中本地磁盘就是存储在其他系统中磁盘上的数据的高速缓存。 ####操作系统管理硬件 当shell加载和运行hello程序时,以及hello程序输出自己的消息时,shell和hello程序都没有直接访问磁盘,显示器,键盘或者主存。取而代之的是,他们依靠操作系统提供的服务。我们可以把操作系统理解为应用程序和硬件之间插入的一层软件。所有的应用程序对硬件的操作尝试都必须经过操作系统。 `操作系统有两个基本功能`: 1、防止硬件被失控的应用程序滥用; 2、向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。 操作系统通过几个最基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能。 文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。 ####进程 像hello这样的程序在现代的系统上运行时,操作系统会提供一种假象,就好像系统上只有这个程序在运行。程序看上去是独占地使用处理器、主存和I/O设备。处理器看上去就像在不间断的一条一条地执行程序中的指令,即该程序的代码和数据是系统内存中唯一的对象。这些假象是通过进程的概念来实现的,进程是计算机科学中最重要和最成功的概念之一。 进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而并发运行,则是说一个进行的指令和另一个进程的指令是交错执行的。传统系统在一个时刻只能执行一个程序,而先进的多核处理器同时能够执行多个程序。无论是在单核还是多核系统中,一个CPU看上去都像是在并发的执行多个进程,这是通过处理器在进程切换来实现的。操作系统这种交错执行的机制称为上下文切换。 操作系统保持跟踪进程所需要的所有状态信息,这种状态也就是上下文,包括许多信息: `PC(程序计数器)和寄存器的当前值;主存的内容等` 在任何一个时刻,单处理器系统都只能执行一个进程的代码,当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行上下文切换。即:保存当前的上下文,恢复新进程的上下文。让后将控制权传递到新进程,新进程就会从上次停止的地方开始。 上述示例中有两个并发的进程:shell进程和hello进程。 最开始,只有shell进程在运行,即等待命令行上的输入。当我们让它运行hello程序时,shell通过调用一个专门的函数,即系统调用来执行我们的请求,系统调用会将控制权传递给新的hello进行,hello进程终止后,操作系统恢复shell进程的上下文,并将控制权传回给它,shell进程会继续等待下一个命令行的输入。 从一个进程到另一个进程的转换是由操作系统内核(kernel)管理的,内核是操作系统代码常驻内存的部分。当应用程序需要操作系统的某些操作时(比如:读写文件),他就执行一个条特殊的系统调用(system call)指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。 注意,`内核不是一个独立的进程,相反,它是系统管理全部进程所用代码和数据结构的集合`。 实现进程这个抽象的概念需要低级硬件和操作系统软件之间的紧密合作。 ####线程 尽管通常我们认为一个进程只有单一的控制流,但是在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并享受同样的代码和全局数据。由于网络服务器中对并行处理的需求,现成成为越来越重要的编程模型,因为多线程之间比多进程之间更容易共享数据,也因为线程一般来说都比进程更高效。当有多处理器的时候,多线程也是一种使得程序可以运行得更快的方法。 ####虚拟内存 虚拟内存是一个抽象的概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存,每个进程看到的内存都是一致的。称为虚拟地址空间。如下图,地址空间最上面的区域是保留给操作系统中的代码和数据的,这对所有进程来说都一样。地址空间的底部区域存放用户进程定义的代码和数据。 每个进程看到的虚拟地址空间由准确定义的区域构成,每个区域都有专门的功能。 `程序和代码数据` 对所有进程来说,代码是从同一固定地址开始,紧接着的是和C全局变量相对应的数据位置。代码和数据区是直接按照可执行目标文件的内容初始化的,在示例中就是可执行文件hello。 `堆` 代码和数据后紧随着的是运行时堆。代码和数据区在进程一开始运行时就被指定了大小。与此不同,当调用像malloc和free这样的C标准库函数时,堆可以在运行时动态的扩展和收缩。 `共享库` 大约在地址空间中的中间部分是一块用来存放C标准库和数据库这样的共享库的代码和数据区域。共享库的概念非常大,也相当难懂。 `栈` 位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序运行期间可以动态扩展和收缩。我们每调用一个函数时,栈就会增长,从一个函数返回时,栈就会收缩。 `内核虚拟内存` 地址空间顶部的区域是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。相反,他们必须调用内核来执行这些操作。 虚拟内存的运行需要硬件和操作系统软件之间精密复杂的交互,包括对处理器生成的每个地址的硬件翻译。基本思想是`一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存`。 #####文件 文件就是字节序列,仅此而已。每个I/O设备,包括磁盘、键盘、显示器,甚至是网络,都可以看成是文件。系统中所有的输入输出都是通过使用一小组称为UnixI/O的系统函数调用读写文件来实现的。 文件这个简单而又精致的概念是非常强大的。因为它向应用程序提供了一个统一的视图,来看待系统中可能含有的各式各样的I/O设备。 比如,处理磁盘文件的应用程序猿可以非常幸福,因为他们无需了解具体的磁盘技术,同一个程序可以在使用不同磁盘技术的不同系统上运行。