计算机系统基本概念

news2024/12/23 18:17:41

1.计算机的硬件结构

早期的计算机没有很复杂的图形功能,CPU的核心频率也不高,跟内存的频率一样,它们都是直接连接在同一个总线(Bus) 上的。由于IO设备诸如显示设备、键盘、软盘和磁盘等速度与CPU和内存相比还是慢很多,当时也没有复杂的图形设备,显示设备大多是只能输出字符的终端。为了协调IO设备与总线之间的速度,也为了能够让 CPU能够和IO设备进行通信,一般每个设备都会有一个相应的 IO 控制器。早期的计算机硬件结构如图所示:

在这里插入图片描述

后来由于CPU核心频率的提升,导致内存跟不上CPU的速度,于是产生了与内存频率一致的系统总线,而CPU采用倍频的方式与系统总线进行通信。接着随着图形化的操作系统普及,特别是3D游戏和多媒体的发展,使得图形芯片需要跟CPU和内存之间大量交换数据,慢速的I/O总线已经无法满足图形设备的巨大需求。为了协调CPU、内存和高速的图形设备,人们专门设计了一个高速的北桥芯片,以便它们之间能够高速地交换数据。

由于北桥运行的速度非常高,所有相对低速的设备如果全都直接连接在北桥上,北桥既须处理高速设备,又须处理低速设备,设计就会十分复杂。于是人们又设计了专门处理低速设备的南桥(Southbridge) 芯片,磁盘、USB、键盘、鼠标等设备都连接在南桥上,由南桥将它们汇总后连接到北桥上。20世纪90年代的PC机在系统总线上采用的是PCI结构,而在低速设备上采用的ISA总线,采用PCI/ISA及南北桥设计的硬件构架如图所示:

在这里插入图片描述

位于中间是连接所有高速芯片的 北桥(Northbridge,PCI Bridge),它就像人的心脏,连接并驱动身体的各个部位;它的左边是 CPU,负责所有的控制和运算,就像人的大脑。北桥还连接着几个高速部件,包括右边的内存和下面的PCI总线。

PCI的速度最高为133 MHz,它还是不能满足人们的需求,于是人们又发明了AGP、PCI Express等诸多总线结构和相应控制芯片。虽然硬件结构看似越来越复杂,但实际上它还是没有脱离最初的CPU、内存,以及I/O的基本结构。我们从程序开发的角度看待硬件时可以简单地将它看成最初的硬件模型。

2.SMP与多核

在过去的50年里,CPU的频率从几十KHz到现在的4GHz,整整提高了数十万倍,基本上每18个月频率就会翻倍。但是自2004年以来,这种规律似乎已经失效,CPU的频率自从那时开始再也没有发生质的提高。原因是人们在制造CPU的工艺方面已经达到了物理极限,除非CPU制造工艺有本质的突破,否则CPU的频率将会一直被目前4GHz的“天花板”所限制。

在频率上短期内已经没有提高的余地了,于是人们开始想办法从另外一个角度来提高CPU的速度,就是增加CPU 的数量。一个计算机拥有多个CPU早就不是什么新鲜事了,很早以前就有了多CPU的计算机,其中最常见的一种形式就是对称多处理器(SMP,Symmetrical Multi-Processing),简单地讲就是每个CPU在系统中所处的地位和所发挥的功能都是一样的,是相互对称的。理论上讲,增加CPU的数量就可以提高运算速度,并且理想情况下,速度的提高与CPU的数量成正比。但实际上并非如此,因为我们的程序并不是都能分解成若干个完全不相干于的子问题。就比如一个女人可以花10个月生出一个孩子,但是10个女人并不能在一个月就生出一个孩子一样。

多处理器应用最多的场合也是这些商用的服务器和需要处理大量计算的环境。而在个人电脑中,使用多处理器则是比较奢侈的行为,毕竟多处理器的成本是很高的。于是处理器的厂商开始考虑将多个处理器“合并在一起打包出售”,这些“被打包”的处理器之间共享比较昂贵的缓存部件,只保留多个核心,并且以一个处理器的外包装进行出售,售价比单核心的处理器只贵了一点,这就是多核处理器(Multi-core Processor) 的基本想法。多核处理器实际上就是SMP的简化版,当然它们在细节上还有一些差别,但是从程序员的角度来看,它们之间区别很小,逻辑上来看它们是完全相同的。只是多核和SMP在缓存共享等方面有细微的差别,使得程序在优化上可以有针对性地处理。简单地讲,除非想把CPU的每一滴油水都榨干,否则可以把多核和SMP看成同一个概念。

3.计算机系统软件体系结构

系统软件这个概念其实比较模糊,传统意义上一般将用于管理计算机本身的软件称为系统软件,以区别普通的应用程序。系统软件可以分成两块,一块是平台性的,比如操作系统内核、驱动程序、运行库和数以千计的系统工具;另外一块是用于程序开发的,比如编译器、汇编器、链接器等开发工具和开发库。

计算机系统软件体系结构采用一种层的结构,有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。”

Any problem in computer science can be solved by another layer of indirection

这句话几乎概括了计算机系统软件体系结构的设计要点,整个体系结构从上到下都是按照严格的层次结构设计的。不仅是计算机系统软件整个体系是这样的,体系里面的每个组件比如操作系统本身,很多应用程序、软件系统甚至很多硬件结构都是按照这种层次的结构组织和设计的。系统软件体系结构中,各种软件的位置如图所示:

在这里插入图片描述
每个层次之间都须要相互通信,既然须要通信就必须有一个通信的协议,我们一般将其称为接口(Interface)接口的下面那层是接口的提供者,由它定义接口;接口的上面那层是接口的使用者,它使用该接口来实现所需要的功能。在层次体系中,接口是被精心设计过的,尽量保持稳定不变,那么理论上层次之间只要遵循这个接口,任何一个层都可以被修改或被替换。除了硬件和应用程序,其他都是所谓的中间层,每个中间层都是对它下面的那层的包装和扩展。正是这些中间层的存在,使得应用程序和硬件之间保持相对的独立,比如硬件和操作系统都日新月异地发展,但是最初为80386芯片和 DOS系统设计的软件在最新的多核处理器和 Windows Vista下还是能够运行的,这方面归功于硬件和操作系统本身保持了向后兼容性,另一方面不得不归功于这种层次结构的设计方式。 最近开始流行的虚拟机技术更是在硬件和操作系统之间增加了一层虚拟层,使得一个计算机上可以同时运行多个操作系统,这也是层次结构带来的好处,在尽可能少改变甚至不改变其他层的情况下,新增加一个层次就可以提供前所未有的功能。

我们的软件体系中,位于最上层的是应用程序,比如我们平时用到的网络浏览器、Email客户端、多媒体播放器、图片浏览器等。从整个层次结构上来看,开发工具与应用程序是属于同一个层次的,因为它们都使用一个接口,那就是操作系统应用程序编程接口(Application Programming Interface)。应用程序接口的提供者是运行库,什么样的运行库提供什么样的API,比如Linux下的Glibc库提供POSIX的API;Windows 的运行库提供 Windows API,最常见的32位Windows提供的API又被称为Win32

运行库使用操作系统提供的系统调用接口(System call Interface),系统调用接口在实现中往往以软件中断(Software Interrupt) 的方式提供,比如Linux使用Ox80号中断作为系统调用接口,Windows使用Ox2E号中断作为系统调用接口(从Windows XP Sp2开始,Windows开始采用一种新的系统调用方式)

操作系统内核层对于硬件层来说是硬件接口的使用者,而硬件是接口的定义者,硬件的接口定义决定了操作系统内核,具体来讲就是驱动程序如何操作硬件,如何与硬件进行通信。这种接口往往被叫做硬件规格(Hardware Specification)硬件的生产厂商负责提供硬件规格,操作系统和驱动程序的开发者通过阅读硬件规格文档所规定的各种硬件编程接口标准来编写操作系统和驱动程序

4.操作系统

操作系统的一个功能是提供抽象的接口,另外一个主要功能是管理硬件资源。

计算机硬件的能力是有限的,比如一个CPU一秒钟能够执行的指令条数是1亿条或是1GB的内存能够最多同时存储1GB 的数据。无论你是否使用它,资源总是那么多。当然我们不希望自己花钱买回来的硬件成为摆设,充分挖掘硬件的能力,使得计算机运行得更有效率,在更短的时间内处理更多的任务,才是我们的目标。这对于早期动辄数百万美元的古董计算机来说更是如此,人们挖空心思让计算机硬件发挥所有潜能。一个计算机中的资源主要分CPU、存储器(包括内存和磁盘〉和IO设备,我们分别从这三个方面来看看如何挖掘它们的潜力。

在计算机发展早期,CPU资源十分昂贵,如果一个CPU 只能运行一个程序,那么当程序读写磁盘(当时可能是磁带)时,CPU就空闲下来了,这在当时简直就是暴殄天物。于是人们很快编写了一个监控程序,当某个程序暂时无须使用CPU时,监控程序就把另外的正在等待CPU资源的程序启动,使得CPU 能够充分地利用起来。这种被称为多道程序(Multiprogramming) 的方法看似很原始,但是它当时的确大大提高了CPU的利用率。不过这种原始的多道程序技术存在最大的问题是程序之间的调度策略太粗糙。对于多道程序来说,程序之间不分轻重缓急,如果有些程序急需使用CPU来完成一些任务(比如用户交互的任务),那么很有可能很长时间后才有机会分配到CPU。这对于有些响应时间要求高的程序来说是很致命的,想象一下你在Windows 上面点击鼠标10分钟以后系统才有反应,那该是多么沮丧的事

经过稍微改进,程序运行模式变成了一种协作的模式,即 每个程序运行一段时间以后都主动让出CPU给其他程序,使得一段时间内每个程序都有机会运行一小段时间 。这对于一些交互式的任务尤为重要,比如点击一下鼠标或按下一个键盘按键后,程序所要处理的任务可能并不多,但是它需要尽快地被处理,使得用户能够立即看到效果。这种程序协作模式叫做分时系统(Time-Sharing System),这时候的监控程序已经比多道程序要复杂多了,完整的操作系统雏形已经逐渐形成了。Windows的早期版本(Windows 95和Windows NT之前),Mac OS X之前的Mac OS版本都是采用这种分时系统的方式来调度程序的。比如在Windows 3.1中,程序调用Yield、GetMessage或 PeekMessage这几个系统调用时,Windows3.1操作系统会判断是否有其他程序正在等待CPU,如果有,则可能暂停执行当前的程序,把CPU让出来给其他程序。如果一个程序在进行一个很耗时的计算,一直霸占着CPU不放,那么操作系统也没办法,其他程序都只有等着,整个系统看过去好像死机了一样。比如一个程序进入了一个while(1)的死循环,那么整个系统都停止了

这在现在看来是很荒唐的事,系统中的任何一个程序死循环都会导致系统死机,这是无法令人接受的。当然当时的PC硬件处理能力本身就很弱,PC上的应用也大多是比较低端的应用,所以这种分时方式勉强也能应付-一下当时的交互式环境了。此前在高端领域,非PC的大中小型机领域,其实已经在研究一种更为先进的操作系统模式了。这种模式就是我们现在很熟悉的多任务(Multi-tasking)系统操作系统接管了所有的硬件资源,并且本身运行在一个受硬件保护的级别。所有的应用程序都以进程(Process)的方式运行在比操作系统权限更低的级别,每个进程都有自己独立的地址空间,使得进程之间的地址空间相互隔离。CPU由操作系统统一进行分配,每个进程根据进程优先级的高低都有机会得到CPU,但是,如果运行时间超出了一定的时间,操作系统会暂停该进程,将CPU资源分配给其他等待运行的进程。这种CPU的分配方式即所谓的抢占式(Preemptive),操作系统可以强制剥夺CPU资源并且分配给它认为目前最需要的进程。 如果操作系统分配给每个进程的时间都很短,即 CPU在多个进程间快速地切换,从而造成了很多进程都在同时运行的假象。目前几乎所有现代的操作系统都是采用这种方式,比如我们熟悉的UNIX、Linux、 Windows NT,以及Mac OS X等流行的操作系统。

操作系统作为硬件层的上层,它是对硬件的管理和抽象。 对于操作系统上面的运行库和应用程序来说,它们希望看到的是一个统一的硬件访问模式。作为应用程序的开发者,我们不希望在开发应用程序的时候直接读写硬件端口、处理硬件中断等这些繁琐的事情。由于硬件之间千差万别,它们的操作方式和访问方式都有区别。比如我们希望在显示器上画一条直线,对于程序员来说,最好的方式是不管计算机使用什么显卡、什么显示器,多少大小多少分辨率,我们都只要调用一个统一的LineTo()函数,具体的实现方式由操作系统来完成。试想一下如果程序员需要关心具体的硬件,那么结果会是这样:对于A型号的显卡来说,需要往IO端口0x1001写一个命令0x1111,然后从端口0x1002中读取一个4字节的显存地址,然后使用DDA(一种画直线的图形算法)逐个地在显存上画点……如果是B型号的显卡,可能完全是另外一种方式。这简直就是灾难。不过在操作系统成熟之前的确存在这样的情况,就是应用程序的程序员需要直接跟硬件打交道。

当成熟的操作系统出现以后,硬件逐渐被抽象成了一系列概念。在UNIX中,硬件设备的访问形式跟访问普通的文件形式一样;在 Windows系统中,图形硬件被抽象成了GDI,声音和多媒体设备被抽象成了DirectX对象;磁盘被抽象成了普通文件系统,等等。程序员逐渐从硬件细节中解放出来,可以更多地关注应用程序本身的开发。这些繁琐的硬件细节全都交给了操作系统,具体地讲是操作系统中的硬件驱动(Device Driver)程序来完成。驱动程序可以看作是操作系统的一部分,它往往跟操作系统内核一起运行在特权级,但它又与操作系统内核之间有一定的独立性,使得驱动程序有比较好的灵活性。因为PC的硬件多如牛毛,操作系统开发者不可能为每个硬件开发一个驱动程序,这些驱动程序的开发工作通常由硬件生产厂商完成。操作系统开发者为硬件生产厂商提供了一系列接口和框架,凡是按照这个接口和框架开发的驱动程序都可以在该操作系统上使用。让我们以一个读取文件为例子来看看操作系统和驱动程序在这个过程中扮演了什么样的角色。

提到文件的读取,那么不得不提到文件系统这个操作系统中最为重要的组成部分之一。文件系统管理着磁盘中文件的存储方式,比如我们在Linux系统下有一个文件“/home/user/test.dat”,长度为8 000个字节。那么我们在创建这个文件的时候,Linux的ext3文件系统有可能将这个文件按照这样的方式存储在磁盘中:文件的前4096字节存储在磁盘的1000号扇区到1007号扇区,每个扇区512字节,8个扇区刚好4096字节;文件的第4097个字节到第8 000字节共3 904个字节,存储在磁盘的2000号扇区到2007号扇区,8个扇区也是4 096字节,只不过只存储了3904个有效的字节,剩下的192个字节无效。如果把这个文件的存储方式看作是一个链状的结构,它的结构如图所示:

在这里插入图片描述
文件系统保存了这些文件的存储结构,负责维护这些数据结构并且保证磁盘中的扇区能够有效地组织和利用。那么当我们在 Linux操作系统中,要读取这个文件的前4096个字节时,我们会使用一个read的系统调用来实现。文件系统收到read请求之后,判断出文件的前4096个字节位于磁盘的1000号逻辑扇区到1007号逻辑扇区。然后文件系统就向硬盘驱动发出一个读取逻辑扇区为1000号开始的8个扇区的请求,磁盘驱动程序收到这个请求以后就向硬盘发出硬件命令。向硬件发送IO命令的方式有很多种,其中最为常见的一种就是通过读写IO端口寄存器来实现。在x86平台上,共有65536个硬件端口寄存器,不同的硬件被分配到了不同的IO端口地址。CPU提供了两条专门的指令“in”和“out”来实现对硬件端口的读和写。

对IDE 接口来说,它有两个通道,分别为IDE0和IDE1,每个通道上可以连接两个设备,分别为Master和Slave,一个PC中最多可以有4个 IDE设备。假设我们的文件位于IDE0的 Master硬盘上,这也是正常情况下硬盘所在的位置。在PC 中,IDE0通道的IO端口地址是0x1F0~0x1F7及0x376~0x377。通过读写这些端口地址就能与IDE硬盘进行通信。这些端口的作用和操作方式十分复杂,我们以实现读取1000号逻辑扇区开始的8个扇区为例:

1.第Ox1F3~Ox1F64个字节的端口地址是用来写入LBA地址的,那么1000号逻辑扇区的LBA地址为OxO00003E8,所以我们需要往Ox1F3、Ox1F4'写入Ox00,往Ox1F5写入Ox03,往Ox1F6写入OxE8。

2.Ox1F2这个地址用来写入命令所需要读写的扇区数。比如读取8个扇区即写入8.

3.Ox1F7这个地址用来写入要执行的操作的命令码,对于读取操作来说,命令字为Ox20。

执行的命令为:
out 0×1F3,0x00
out Ox1F4,0x00
out 0x1F5,Ox03
out 0x1F6,OxE8
out 0x1F2,0x08
out 0x1F7,0x20

在硬盘收到这个命令以后,它就会执行相应的操作,并且将数据读取到事先设置好的内存地址中(这个内存地址也是通过类似的命令方式设置的)。当然这里的例子中只是最简单的情况,实际情况比这个复杂得多,驱动程序须要考虑硬件的状态(是否忙碌或读取错误)调度和分配各个请求以达到最高的性能等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64142.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT:布局管理器消息盒子对话框

让组件在水平和垂直方向对齐 有三种常用布局管理器: 水平,QHBoxLayout 垂直,QVBoxLayout 网格,QGridLayout(使布局好的界面嵌套到主窗口) 1.让组件大小固定 修改属性:minimusize,maxmumsize 最小和最大组件…

使用setuptools构建python包

python包分发方式 源码包分发: 源码包安装过程是先解压,再编译。最后才安装,所以其是跨平台的,由于每次安装都需要进行编译,相对于二进制包安装方式来说安装速度较慢。 解压——编译——安装 源码包本质上是一个压缩…

CDGA|2023年数据治理发展前景预测步骤

CDGA|2023年数据治理发展前景预测步骤 数据治理发展前景预测,就是在数据治理市场调查获得的各种信息和资料的基础上,运用科学的预测技术和方法,对影响数据治理市场供求变化的诸因素进行调查研究,分析和预见数据治理发展趋势&…

《解构领域驱动设计》读书笔记

文章目录书籍信息开篇软件复杂度剖析复杂系统理解能力预测能力领域驱动设计概览基本概念控制软件复杂度领域驱动设计统一过程现存的不足领域驱动设计统一过程全局分析问题空间探索全局分析的 5W 模型高效沟通高效协作商业模式画布业务流程图服务蓝图用例图事件风暴学习循环价值…

windows系统下mysql的主从复制

使用一台物理机实现mysql的主从复制功能。 准备: 1、操作系统:Windows Server 2016 Standard 2、下载mysql免安装包: https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.17-winx64.zip 安装maser 1、解压mysql压缩包&…

Windows下安装hadoop2.7.4

Windows下安装hadoop 案例环境 该压缩包是已经简化配置后的 hadoop2.7.4下载地址文件分享 (weiyun.com) 安装步骤 解压压缩包 配置环境变量 在系统变量中添加 在path中添加 拷贝hadoop2.7.4\bin\hadoop.dll到目录C:\Windows\System32 配置文件 把/etc/hadoop/ 下目录的相…

玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一)

前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。 而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞&a…

管理RMAN备份_维护RMAN备份和仓库记录

1.RMAN备份和仓库维护概述 1.1.备份和仓库维护的目的 建议的维护策略是配置一个快速恢复区域,一个备份保留策略和一个归档 redo日志删除策略。在这种情况中,数据库按需要自动维护和删除备份与归档redo日志。然而,有时…

[附源码]Python计算机毕业设计Django水果管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

阿里P8专家爆出:入职阿里必备的598道java面试题,内含算法

前言 之前也给大家分享过很多的面试题和大佬的面试经验,相信大家也已经利用到了,也顺利找到了工作,并拿到了高薪。 今天就给大家分享阿里P8专家长期以来面试所问到的java面试题,总共有598道(含算法)&…

PCL 使用MLS 上采样

移动最小二乘法MLS(Moving Lest Squares)简要介绍_Figure 09的博客-CSDN博客_移动最小二乘法 深入理解移动最小二乘法曲面拟合代码(MLS2D.m)_残影丶的博客-CSDN博客_mls2d PCL 点云采样_Σίσυφος1900的博客-CSDN博客 上采样…

和数集团浅谈区块链技术如何赋能数字政务?

在“十四五”提高数字政府建设水平的大环境下,构建数字政务发展体系是国家治理现代化的必然选择。2021年是2035远景目标的开局之年,《十四五规划纲要》中明确将区块链列为“十四五”七大数字经济重点产业之一。数字政务的体系架构和创新机理,离不开新兴技术融合互通…

移动通信:分集技术(时间分集,频率分集,空间分集,SC,MRC,EGC)学习笔记

文章目录Micro diversityTime DiversityFrequency DiversitySpatial DiversityCombination of signalsSelection CombiningMaximal Ratio CombiningEqual Gain CombiningReferences分集技术是用来补偿衰落信道损耗的,它通常通过两个或更多的接收天线来实现。同均衡器…

越早越好,突破职业瓶颈,2023年考PMP项目管理有何好处?

考PMP没有行业和职业的限制,只要是需要感兴趣的人就可以报考。 适合任何领域行业的项目。 是通用的项目管理理念。 那么 # 考了PMP会有什么益处呢?# ---带你30秒看完,从六个方面讲 01 职场加分项 目前国内很多的大型企业在招聘的时候会有…

矿泉水溴酸盐超标如何解决?除溴酸盐设备有哪些?

水生产企业多使用臭氧消毒,不过,水生产企业不存在水运输路途遥远的问题,因此可以使用臭氧消毒。同时,也是因为臭氧在消毒后会直接变成氧气,所以不会有使用氯消毒后的那种味道,不会影响矿泉水的口感&#xf…

SpringBoot的创建的使用

哈喽呀,你好呀,欢迎呀,快来看一下这篇宝藏博客吧~~~ 目录 1、Spring Boot快速扫盲 2、Spring Boot 项目创建 3、运行项目 4 、输出hello world 5、注意事项--包路径错误 6、小结 1、Spring Boot快速扫盲 在创建SpringBoot项目前,我们得…

大数据1.5 使用Vim编辑器

一、安装Vim编辑器 执行命令:yum -y install vim 二、三种工作模式 1、命令模式 执行命令:vim test.txt,进入默认的命令模式 2、输入模式 在输入模式下,Vim 可以对文件执行写操作,类似于在 Windows 系统的文档中…

常见的排序算法

常见排序算法前言排序分类一、插入排序直接插入排序希尔排序二、选择排序直接选择排序堆排序三、交换排序冒泡排序快速排序1、hoare版本2、挖坑法3、前后指针版本快排时间复杂度分析快排的优化4、快排非递归实现(利用栈实现)5、快排非递归实现&#xff0…

节省时间的分层测试,到底怎么做?

为什么要做分层测试 从软件工程的角度,结合软件开发的V模型、MVC架构、测试金字塔,综合起来便于理解。 1、借鉴与软件开发的V模型 从V模型的底部往右上方向,先做单元测试,再做集成测试一直到最后的验收测试。 2、来源于MVC架构…

SSM房屋租赁系统

SSM房屋租赁系统该项目采用的技术实现一、系统功能技术栈二、关键代码1.首页运行截图总结该项目采用的技术实现 后台框架:Spring、SpringMVC、MyBatis UI界面:jQuery 、JSP 数据库:MySQL 提示:以下是本篇文章正文内容&#xff…