专栏首页一个会写诗的程序员的博客计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决

计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决

计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决.

这句话几乎概括了计算机软件体系结构的设计要点.整个体系从上到下都是按照严格的层级结构设计的.

而这个中间层通过映射来连接上下文.

不仅是计算机系统的整个体系是这么设计的, 体系里面的每个组件,比如操作系统,很多应用程序甚至很多硬件系统结构都是按照层次化的结构来设计的.

遗憾的是,这句经典的名言出处无从考证.

本文就此展开.

计算机硬件体系架构

我们先看经典的 Von Neumann 架构:

基于上面的架构, 典型的 PC 机架构图如下

虽然硬件结构体系越来越复杂, 但目前来看, 计算机的架构还是没有脱离最初的 CPU, 内存以及 IO 的基本结构.

计算机软件体系架构

作为一个整体的计算机系统, 硬件跟软件都是必不可少的.计算机体系结构图如下:

计算机软件的体系结构分层示意图:

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

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

运行库使用操作系统提供的系统调用接口(System call Interface),系统调用接口在实现中往往以软件中断的方式提供,比如Linux使用0x80号中断作为系统调用接口,Windows使用0x2E号中断作为系统调用接口。

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

内存的分配问题: 一切皆是映射

如何将计算机上有限的物理内存分配给多个程序使用。在早期的计算机中,程序是直接运行在物理内存上的,也就是说,程序在运行时所访问的地址都是物理地址。但这样做的话会出现很多问题。

1 地址空间不隔离 所有的程序都直接访问物理地址,程序所使用的内存空间不是相互隔离的。恶意的程序很容易改写其他程序的内存数据,以达到破坏目的。

2 内存使用效率低 由于没有有效的内存管理机制,通常要一个程序执行时,监控程序就将整个程序装入内存然后开始执行。

举个例子:计算机有128MB内存,程序A运行需要10MB,B需要100MB,C需要20MB。如果我们要同时运行A和B,比较直接的做法是将内存的前10MB分配给程序A,10MB~110MB分配给程序B。这样就能够实现A和B同时运行。但是,如果我们忽然要运行C,那么这时内存空间已经不够了。由于程序所需要的空间是连续的,那么这个例子里面,如果我们将A换出到磁盘所释放的内存空间是不够的,所以只能将B换出,将C换入执行。可以看到整个过程中有大量的数据在换入换出,导致效率十分低下。

3 程序运行地址不确定 因为程序每次需要装入运行时,我们都需要给它从内存中分配一块足够大的空闲区域,这个空闲区域的位置是不确定的。这给编程造成了一定的麻烦,因为在程序编写时,它访问数据和指令跳转时的目标地址很多都是固定的。

解决方案

作为普通的程序,它需要一个简单的执行环境,有一个单一的地址空间。地址空间是一个比较抽象的概念,可以把它想象成一个很大的数组,每个数组的元素就是一个字节,数组的大小由地址空间的地址长度决定,比如32位的地址空间为2^32=4GB,地址空间的有效地址是0~4294967295,用16进制表示为0x0000 ~ 0xFFFFFFFF。

地址空间分为两种:虚拟地址空间和物理地址空间。

物理地址空间是实实在在存在的,存在于计算机当中,而且对于每一台计算机来说是唯一的,可以想象成为计算机的物理内存,比如你的计算机用的是32位的处理器,即计算机地址线有32条,那么物理空间就有4G。虚拟地址空间是指虚拟的、想象出来的地址空间,现实中并不存在,每个进程都有自己独立的虚拟空间,而且每个进程只能访问自己的地址空间,这样就有效地做到了进程的隔离。

分段(Segmentation)

最开始人们使用的是一种分段的方法,基本思路是把一段与程序所需要的内存空间大小的虚拟空间映射到某个地址空间。比如程序A需10MB内存,那么我们假设有一个地址从0x00000000到0x00A00000的10MB大小的虚拟空间,然后我们从实际物理内存中分配一个相同大小的物理地址,假设物理地址是0x00100000到0x00B00000。然后我们把这两块相同大小的地址空间一一映射,即虚拟空间里的每个字节对应物理空间中的每个字节。这个映射过程由软件来设置,实际的地址转换由硬件完成。

比如,A和B同时运行时,它们的虚拟空间和物理空间映射关系如图所示。

分段的方法基本上解决了上面问题中的第一个和第三个。

首先做到了地址隔离,因为A和B被映射到了两块不同的物理空间,它们之间没有任何重叠,如果A访问虚拟空间的地址超过了0x00A00000这个范围,硬件就会判断这是一个非法的访问,并将这个请求报告给操作系统或者监控程序,由它决定如何处理。

再者,对于每个程序来说,无论它们被分配到地址空间的哪一个区域,对于程序来说都是透明的,它们不需要关心物理地址的变化,它们只要按照从地址0x00000000到0x00A00000来编写程序、放置变量,所以程序不需要重定位。

分页(Pageing)

但是分段的方法没有解决内存使用效率的问题。分段对于内存区域的映射还是按照程序为单位,如果内存不足,被换入换出的磁盘的都是整个程序,这样势必会造成大量的磁盘访问操作,从而严重影响速度,这种方法还是显得粗糙,粒度比较大。事实上根据程序的局部性原理,当一个程序正在运行时,在某个时间段内,它只是频繁用到了一小部分数据,也就是说,程序的很多数据其实在一个时间段内是不会被用到的。人们很自然地想到了更小粒度的内存分割和映射方法,使得程序的局部性原理得到充分利用,大大提高了内存的使用率。这种方法就是分页

分页的基本方法是把地址空间人为得等分成固定大小的页,每一个页的大小由硬件决定,或硬件支持多种页的大小,由操作系统选择决定页的大小。目前几乎所有PC的操作系统都是用4KB大小的页。我们使用的PC机是32位虚拟地址空间,也就是4GB,按4KB分页,总共有1048576个页。

举个例子,如图所示:

那么,当我们把进程的虚拟地址空间按页分割,把常用的数据和代码装载到内存中,把不常用的代码和数据保存在磁盘里,当需要用到的时候再把它们从磁盘里取出即可。图中的线表示映射关系,我们可以看到虚拟空间有些页被映射到同一个物理页,这样就可以实现内存共享。

我们可以看到Process 1 的VP2和VP3不在内存中,但是当进程需要用到这两个页的时候,硬件就会捕获到这个消息,就是所谓的页错误(Page Fault),然后操作系统接管进程,负责将VP2和VP3从磁盘读取出来装入内存,然都将内存中的这两个页和VP2和VP3建立映射关系。以页为单位存取和交换数据非常方便,硬件本身就支持这种以页为单位的操作方式。

保护页也是页映射的目的之一,简单地说就是每个页可以设置权限属性,谁可以修改,谁可以访问,而且只有操作系统有权修改这些属性,那么操作系统就可以做到保护自己和保护进程。

虚拟存储的实现需要硬件支持,几乎所有CPU都采用称为MMU的部件来进行页的映射:

在页映射模式下,CPU发出的是Virtual Address ,即我们程序看到的是虚拟地址。经过MMU转换以后就变成了Physical Address。一般MMU集成在CPU内部,不会以独立的部件存在。

计算机网络体系架构: OSI 模型

The International Standards Organization (ISO) developed the Open Systems Interconnection (OSI) model. It divides network communication into seven layers. In this model, layers 1-4 are considered the lower layers, and mostly concern themselves with moving data around. Layers 5-7, called the the upper layers, contain application-level data. Networks operate on one basic principle: "pass it on." Each layer takes care of a very specific job, and then passes the data onto the next layer.

The 7 Layers of the OSI In the OSI model, control is passed from one layer to the next, starting at the application layer (Layer 7) in one station, and proceeding to the bottom layer, over the channel to the next station and back up the hierarchy. The OSI model takes the task of inter-networking and divides that up into what is referred to as a vertical stack that consists of the following 7 layers.

Layer 7 - Application
Layer 6 - Presentation
Layer 5 - Session
Layer 4 - Transport
Layer 3 - Network
Layer 2 - Data Link
Layer 1 - Physical

OSI 模型中的信息交换:

操作系统架构

操作系统是一个一直运行在计算机中的程序。它管理着计算机的硬件和软件资源,提供一些服务给计算机的程序。

Linux OS

以 Linux OS 为例.

现代 Linux 系统内核结构采用组件化结构,如图

Linux is one the popular modified version of UNIX operating system. It is an Open Source OS and it is free to use as well as for modifications. Linux was design by considering UNIX compatibility. Its functionality list is quite similar to that of UNIX.

The operating system architecture is organized in two parts :

  • Kernel Mode
  • User Mode

Kernel Mode executes the operating system processes. User Mode executes application program of the user.

The architecture of operating system consist of five Components:

Kernel
Shell
System Utilities
User application
Hardware platform

权限等级

Windows OS 架构:

Diagram of Mac OS X architecture:

iOS 架构:

As shown above, the Core OS and Core Services make up the base and very strongly support the iOS application. On top of that comes the Media and Cocoa Touch which are again very essential for supporting an iOS application. All of these reside on top of the Kernel and device drivers.

Cocoa has a very important role to play for supporting an iOS application. It provides UIKit for the application to work which is essentially the USP of an iOS application.

Android 系统架构:

Android 是一种基于 Linux 的开放源代码软件栈,为广泛的设备和机型而创建。下图所示为 Android 平台的主要组件。

Linux 内核

Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。

使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序。

硬件抽象层 (HAL)

硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。

Android Runtime

对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的 Android Runtime (ART) 实例。ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编译工具链(例如 Jack)将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行。

ART 的部分主要功能包括:

预先 (AOT) 和即时 (JIT) 编译 优化的垃圾回收 (GC) 更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置监视点以监控特定字段

在 Android 版本 5.0(API 级别 21)之前,Dalvik 是 Android Runtime。如果您的应用在 ART 上运行效果很好,那么它应该也可在 Dalvik 上运行,但反过来不一定。

Android 还包含一套核心运行时库,可提供 Java API 框架使用的 Java 编程语言大部分功能,包括一些 Java 8 语言功能。

原生 C/C++ 库 许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形。

如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某些原生平台库。

Java API 框架

您可通过以 Java 语言编写的 API 使用 Android OS 的整个功能集。这些 API 形成创建 Android 应用所需的构建块,它们可简化核心模块化系统组件和服务的重复使用,包括以下组件和服务:

丰富、可扩展的视图系统,可用以构建应用的 UI,包括列表、网格、文本框、按钮甚至可嵌入的网络浏览器 资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件 通知管理器,可让所有应用在状态栏中显示自定义提醒 Activity 管理器,用于管理应用的生命周期,提供常见的导航返回栈 内容提供程序,可让应用访问其他应用(例如“联系人”应用)中的数据或者共享其自己的数据 开发者可以完全访问 Android 系统应用使用的框架 API。

系统应用

Android 随附一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用。平台随附的应用与用户可以选择安装的应用一样,没有特殊状态。因此第三方应用可成为用户的默认网络浏览器、短信 Messenger 甚至默认键盘(有一些例外,例如系统的“设置”应用)。

系统应用可用作用户的应用,以及提供开发者可从其自己的应用访问的主要功能。例如,如果您的应用要发短信,您无需自己构建该功能,可以改为调用已安装的短信应用向您指定的接收者发送消息。

来自: https://developer.android.com/guide/platform

JVM 体系架构

JVM stands for Java Virtual Machine. It provides you with environment to execute your compiled programs, called bytecode. There are multiple implementations of JVM from different vendors for variety of platforms. In this article I will explain the main components of JVM, including memory management, class loading and the Garbage collector.

Usually we do not dig deep into the internal mechanics of JVM. If our code works, then we go on without caring much about the internal mechanics… until the day something goes wrong and we need to tweek JVM or fix a memory leak for example.

Java Virtual Machine questions are very popular in job interviews. Interviewers love to ask various questions about JVM to prove your general understanding of the Java platform.

Java Virtual Machine Architecture The Java virtual machine consists of three main areas:

  • Class loader subsystem
  • Runtime data area
  • Execution engine

We will look at each one in greater details:

Java Platform:

The following conceptual diagram illustrates the components of Oracle's Java Platform Products:

Jave SE Platform at a Glance

数据库系统架构

The following diagram shows in-memory and on-disk structures that comprise the InnoDB storage engine architecture.

参考:https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html

MySQL InnoDB File Architecture

Keep in mind that /var/lib/mysql/ibdata1 is the busiest file in the InnoDB infrastructure. It normally houses six types of information:

Table Data
Table Indexes
MVCC (Multiversioning Concurrency Control) Data
Rollback Segments
Undo Space
Table Metadata (Data Dictionary)
Double Write Buffer (background writing to prevent reliance on OS caching)
Insert Buffer (managing changes to non-unique secondary indexes)

Please find below architecture for complete details

Spring 5 架构

太阳系结构图

The Solar System is our local neighborhood in space. This incredible system of celestial pobjects contains a star, eight planets, 140 moons, and a variety of other objects such as asteroids, comets, and dwarf planets. At the center the is an average-sized, middle aged yellow star known as the Sun. The eight planets and other bodies orbit the Sun in a perpetual dance that has been going on for nearly five billion years. The planets in this system range in size from small, rocky worlds to gigantic balls of gas and ice. These planets are orbited by a multitude of moons that vary from asteroid-sized chunks of rock to nearly planet-sized worlds with atmospheres of their own.

http://www.seasky.org/solar-system/solar-system.html

Structure Of Atom

Food Chain

A Food Web displays more of the interactions that take place within the ecosystem and therefore would be a better representation. Food web is a realistic, true to life representation.

Explanation:

The Food Web shows more of the interactions between the organisms of the ecosystem and the trophic levels included from Producers to Primary/Secondary Consumers up through the Tertiary Consumers.

https://sciencezoneja.files.wordpress.com

While a food Chain is more of a linear representation of a specific line of interaction within the greater Food Web. Thus food chain is a part of the whole story.

阴阳

老子在《道德经》中说:“道生一,一生二,二生三,三生万物。万物负阴而抱阳,冲气以为和”。阴阳的特性如下:

“对立而统一关系”( the contradictoryunity)(太极)

两者互相对立:万物皆有其互相对立的特性。如热为阳,寒为阴;天为阳,地为阴,说明了宇宙间所有事物皆对立存在。然这种相对特性并非绝对,而是相对。如上为阳,下为阴,平地相对于山峰,山峰为阳,平地为阴;但平地若相对于地底,则平地属阳、地底属阴,可见阴阳的相对性关系。

两者相互依靠、转化、消长:阴阳存在互根互依,互相转化的关系,阴中有阳,阳中有阴,因彼此的消长,阴阳可以变化出许多不同的现象分类。

阴阳的例子:

阳的代表:天、父、雄性、光、热、表面、进行、单数、刚强(主导性)。 阴的代表:地、母、雌性、暗、寒、里面、完成、偶数、柔顺(包容性)。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Java 并发编程实战】信号量 (Semaphore)

    1965年,荷兰学者Edsger Dijkstra提出的信号量(Semaphores)机制是一种卓有成效的进程同步工具,在长期广泛的应用中,信号量机制得到了极大...

    一个会写诗的程序员
  • Kotlin 函数编程详解函数Kotlin 开发者社区

    Functions in Kotlin are declared using the fun keyword:

    一个会写诗的程序员
  • Koltin Any 类型Koltin Any 类型

    The root of the Kotlin class hierarchy. Every Kotlin class has Any as a supercla...

    一个会写诗的程序员
  • 机器学习实战 | 第三章:集成学习

    集成学习肯定是在实战中最不可或缺的思想了.毕竟都想把错误率低一点,再低一点,再低一点.看看kaggle大量的集成学习就知道这节肯定绕不过去了. 在这里,仅仅说...

    用户1332428
  • 限制对比度自适应直方图均衡化算法原理、实现及效果

    一、自适应直方图均衡化(Adaptive histgram equalization/AHE)

    用户1138785
  • md5算法原理一窥(其一)

        首先,需要了解的事,md5并不是传说中的加密算法,只是一种散列算法。其加密的算法并不是我们说所的那样固定不变,只是一种映射的关系。 所以解密MD5没有现...

    Gxjun
  • Hdu 3177 Crixalis's Equipment

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe...

    若羽
  • 人体姿态估计--Learning Feature Pyramids for Human Pose Estimation

    Learning Feature Pyramids for Human Pose Estimation ICCV2017 Torch: https:/...

    用户1148525
  • 用Python构建NLP Pipeline,从思路到具体代码,这篇文章一次性都讲到了

    授人以鱼不如授人以渔,今天的文章由作者Adam Geitgey授权在人工智能头条翻译发布。不仅给出了具体代码,还一步步详细解析了实现原理和思路。正所谓有了思路,...

    用户1737318
  • 用Python构建NLP Pipeline,从思路到具体代码,这篇文章一次性都讲到了

    授人以鱼不如授人以渔,今天的文章由作者Adam Geitgey授权在人工智能头条翻译发布。不仅给出了具体代码,还一步步详细解析了实现原理和思路。正所谓有了思路,...

    用户1737318

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动