精华内容
下载资源
问答
  • 《MySQL 性能优化》之理解 MySQL 体系结构

    万次阅读 多人点赞 2020-02-10 10:40:03
    本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。

    作为专栏文章《MySQL 性能优化》的第一篇,本文介绍 MySQL 的服务器体系结构,包括物理结构、逻辑结构以及插件式存储引擎。

    实例和数据库

    我们通常所说的 MySQL 数据库服务器由一个实例(instance)以及一个数据库(database)组成。实例包括一组后台进程/线程和许多内存结构,用于管理数据库;数据库由一组磁盘文件组成,用于存储数据和日志等信息。MySQL 使用典型的客户端/服务器(Client/Server)结构,下图显示了一个简单的 MySQL 体系结构:

    mysql
    客户端通过通过实例中的后台进程访问 MySQL 数据库。MySQL 采用单进程多线程架构,也就是说一个 MySQL 实例在操作系统中就是一个进程(mysqld)。在 Linux 系统中使用ps命令进行查看:

    [root@sqlhost ~]# ps -ef|grep mysql|grep -v grep
    mysql     7898     1  1 Feb03 ?        00:12:12 /usr/sbin/mysqld
    

    严格来说,一个 MySQL 实例管理的是多个数据库(也叫模式,Schema)包括系统数据库 mysql、information_schema、performance_schema、sys 以及用户创建的数据库等。使用SHOW DATABASES或者SHOW SCHEMAS命令查看当前实例中的数据库:

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mydb               |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.14 sec)
    

    数据库就像是一个容器,存储了各种对象。例如,数据表(Table)、视图(View)、存储过程(Stored Procedure)以及触发器(Trigger)等。其中,表是存储数据的主要对象。它们之间的关系如下图所示:

    mysql database

    MySQL 物理结构

    MySQL 的物理结构主要包括两个目录:软件的安装目录和数据目录,以及配置文件和日志文件等。

    mysql

    📝不同平台、不同安装方式(源码安装、二进制解压)的目录结构有所不同,具体可以参考 MySQL 官方文档

    安装目录

    安装目录(Base Directory)是 MySQL 服务器的安装路径,Linux 上使用 RPM 包安装的默认位置为 /usr/。安装目录中主要包含以下内容:

    文件或目录 描述
    bin/ mysql 客户端和实用程序目录
    sbin/ mysqld 服务器程序目录
    share/man/ Unix 帮助手册页目录
    include/mysql/ 头文件目录
    lib/mysql/ 库文件目录
    share/mysql/ 各种字符集、语言相关的错误信息目录

    我们可以使用下面的命令查看安装目录:

    mysql> show global variables like "%basedir%";
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | basedir       | /usr/ |
    +---------------+-------+
    1 row in set (0.00 sec)
    

    数据目录

    数据目录(Data Directory)是 MySQL 存储数据库文件的位置,Linux 上使用 RPM 包安装的默认位置为 /var/lib/mysql/。数据目录中主要包含以下内容:

    文件或目录 描述
    #innodb_temp/ InnoDB 会话临时表空间目录
    mysql/ 系统数据库 mysql 文件目录
    performance_schema/ 性能数据库 performance_schema 文件目录
    sys/ sys 数据库文件目录
    其他子目录 每个数据库对应一个文件目录,存储该数据库中的文件
    auto.cnf 当前服务器实例的 UUID,用于主从复制
    binlog.* 二进制日志 binary log 相关文件
    *.pem SSL 连接相关的证书和密钥文件
    ib_buffer_pool 缓冲区 buffer pool 中数据页的页号转储文件
    ibdata1 InnoDB 表空间文件
    ib_logfile0
    ib_logfile1
    InnoDB 事务日志(REDO)文件
    ibtmp1 InnoDB 临时表空间文件
    mysql.ibd 系统数据库 mysql 数据文件
    mysql.sock Unix 套接字文件
    undo_001
    undo_002
    InnoDB UNDO 表空间文件

    我们可以使用以下命令查看数据目录:

    mysql> show global variables like "%datadir%";
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | datadir       | /var/lib/mysql/ |
    +---------------+-----------------+
    1 row in set (0.01 sec)
    

    配置文件

    MySQL 服务器进程和各种工具程序启动时,需要通过配置文件(my.cnf 或者 my.ini)读取各种参数。Linux 上使用 RPM 包安装的默认配置文件为 /etc/my.cnf,可以使用mysqld --verbose --help查看读取配置文件的顺序:

    [root@sqlhost ~]# mysqld --verbose --help | grep -A 1 'Default options'
    Default options are read from the following files in the given order:
    /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
    

    服务器运行使用的所有配置选项都可以使用SHOW VARIABLES命令查看,例如以下命令可以查看 InnoDB 缓冲池相关的配置:

    mysql> show variables like '%buffer_pool%';
    +-------------------------------------+----------------+
    | Variable_name                       | Value          |
    +-------------------------------------+----------------+
    | innodb_buffer_pool_chunk_size       | 8388608        |
    | innodb_buffer_pool_dump_at_shutdown | ON             |
    | innodb_buffer_pool_dump_now         | OFF            |
    | innodb_buffer_pool_dump_pct         | 25             |
    | innodb_buffer_pool_filename         | ib_buffer_pool |
    | innodb_buffer_pool_in_core_file     | ON             |
    | innodb_buffer_pool_instances        | 1              |
    | innodb_buffer_pool_load_abort       | OFF            |
    | innodb_buffer_pool_load_at_startup  | ON             |
    | innodb_buffer_pool_load_now         | OFF            |
    | innodb_buffer_pool_size             | 8388608        |
    +-------------------------------------+----------------+
    11 rows in set (0.00 sec)
    

    除此之外,MySQL 还使用一些其他的文件:

    • 错误日志文件,例如 /var/log/mysqld.log;
    • 慢查询日志文件,例如 /var/lib/mysql/HOSTNAME-slow.log;
    • 服务器进程 PID 文件,例如 /var/run/mysqld/mysqld.pid;

    MySQL 逻辑结构

    MySQL 使用典型的客户端/服务器(Client/Server)结构,逻辑结构图如下所示:

    mysql logical
    MySQL 体系结构大体可以分为三层:客户端、服务器层以及存储引擎层。其中,服务器层又包括了连接管理、查询缓存 、SQL 接口、解析器、优化器、缓冲与缓存以及各种管理工具与服务等。

    具体来说,每个组件的作用如下:

    • 客户端,连接 MySQL 服务器的各种工具和应用程序。例如 mysql 命令行工具、mysqladmin 以及各种驱动程序等。
    • 连接管理,负责监听和管理客户端的连接以及线程处理等。每一个连接到 MySQL 服务器的请求都会被分配一个连接线程。连接线程负责与客户端的通信,接受客户端发送的命令并且返回服务器处理的结果。
    • 查询缓存 ,用于将执行过的 SELECT 语句和结果缓存在内存中。每次执行查询之前判断是否命中缓存,如果命中直接返回缓存的结果。缓存命中需要满足许多条件,SQL 语句完全相同,上下文环境相同等。实际上除非是只读应用,查询缓存的失效频率非常高,任何对表的修改都会导致缓存失效;因此,查询缓存在 MySQL 8.0 中已经被删除。
    • SQL 接口,接收客户端发送的各种 DML和 DDL 命令,并且返回用户查询的结果。另外还包括所有的内置函数(日期、时间、数学以及加密函数)和跨存储引擎的功能,例如存储过程、触发器、视图等。
    • 解析器,对 SQL 语句进行解析,例如语义和语法的分析和检查,以及对象访问权限检查等。
    • 优化器,利用数据库的统计信息决定 SQL 语句的最佳执行方式。使用索引还是全表扫描的方式访问单个表,多表连接的实现方式等。优化器是决定查询性能的关键组件,而数据库的统计信息是优化器判断的基础。
    • 缓存与缓冲,由一系列缓存组成的,例如数据缓存、索引缓存以及对象权限缓存等。对于已经访问过的磁盘数据,在缓冲区中进行缓存;下次访问时可以直接读取内存中的数据,从而减少磁盘 IO。
    • 存储引擎,存储引擎是对底层物理数据执行实际操作的组件,为服务器层提供各种操作数据的 API。MySQL 支持插件式的存储引擎,包括 InnoDB、MyISAM、Memory 等。
    • 管理工具,MySQL 提供的系统管理和控制工具,例如备份与恢复、复制、集群等。

    我们使用 mysql 客户端工具连接到 MySQL 服务器:

    [root@sqlhost ~]# mysql -h 192.168.56.104 -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 18
    Server version: 8.0.19 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> 
    

    以上方式是通过 TCP/IP 网络协议连接到 MySQL 服务器,需要提供服务器的 IP、端口以及用户名和密码等信息。如果提供的信息不正确,将会返回错误消息。另外,我们也可以通过命名管道或者 UNIX 套接字进行连接。

    连接成功之后就可以执行各种语句和命令,我们以一个查询语句为例:

    SEELCT * FROM employees;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SEELCT * FROM employees' at line 1
    

    以上语句通过 SQL 查询接口提交给服务器的处理线程,解析器进行语法检查时发现 SELECT 写成了 SEELCT,提示的是语法错误。示例表来自《SQL 入门教程》示例数据库

    如果语句没有问题,通过解析器之后生成解析树,然后发送给优化器;优化器判断是否进行查询重写,并且根据统计信息决定访问表的方式和顺序等。我们可以通过 EXPLAIN 命名了解优化器选择的执行计划:

    mysql> EXPLAIN SELECT * FROM employees;
    +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------+
    | id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
    +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------+
    |  1 | SIMPLE      | employees | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  107 |   100.00 | NULL  |
    +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------+
    1 row in set, 1 warning (0.00 sec)
    

    这里我们查询的是整个表的数据,因此 MySQL 采用全表扫描的方式(type = ALL)获取数据。关于执行计划的解释,可以参考这篇文章

    最后,由存储引擎获取表中的数据;如果数据已经被缓存,可以直接从缓冲区获取。

    MySQL 存储引擎

    插件式存储引擎是 MySQL 的一大特点体系结构,每个存储引擎都提供了各自的功能,用户可以根据业务或者应用场景为数据表选择不同的存储引擎。也就是说,存储引擎的设置是在表级别的;因此也被称为表类型(table type)。

    📝从 MySQL 5.5 之后,默认的存储引擎是 InnoDB。InnoDB 是一个通用的存储引擎,除非有特殊需求,推荐使用 InnoDB。

    MySQL 插件式存储引擎结构允许在 MySQL 服务器运行时装载和卸载一个存储引擎,使用SHOW ENGINES语句可以查看当前服务器支持的存储引擎:

    mysql> SHOW ENGINES;
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
    | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
    | InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
    | PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
    | MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
    | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
    | BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
    | CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
    | ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    9 rows in set (0.00 sec)
    

    其中,Support 列显示了是否支持该存储引擎以及默认的存储引擎。MySQL 8.0 支持的存储引擎如下:

    • InnoDB:默认的存储引擎。InnoDB 是一个事务安全(ACID 兼容)的存储引擎,支持事务的提交、回滚以及故障恢复功能。InnoDB 行级锁(无需升级到更高粒度的锁)以及类似 Oracle 的一致性非锁定读功能能够增加多用户并发性和性能。InnoDB 使用聚集索引存储用户数据,减少了常见的基于主键查询时的 I/O 操作。为了维护数据完整性,InnoDB 还支持 FOREIGN KEY 参照完整性约束。
    • MyISAM:这种类型的表占用很少的磁盘空间。表级锁限制了它的并发读/写性能,因此通常用于只读或者以读为主的 Web 应用和数据仓库。
    • Memory:将所有数据存储在 RAM 中,用于需要快速查找的非关键数据。Memory 之前被称为 HEAP 存储引擎。它的使用场景越来越少;InnoDB 中的 buffer pool 内存区提供了将大部分或全部数据保留在内存中的一个通用持久性方法,NDBCLUSTER 为海量分布式数据集提供了快速的键-值查找。
    • CSV:这种类型的表实际上就是逗号分隔符文本文件。CSV 表可以导入或导出 CSV 格式的数据,用于脚本和应用程序之间的数据交换。由于 CSV 表不支持索引,通常可以在日常操作中将数据存储在 InnoDB 表中,只在导入或导出阶段使用 CSV 表。
    • Archive:这种压缩格式的无索引表主要用于存储和检索大量的很少使用的历史、归档或者安全审计数据。
    • Blackhole:Blackhole 存储引擎不会实际存储数据,类似于 Unix 中的 /dev/null 设备。查询永远不会返回数据。这种表可以用于特定的复制环境,DML 语句需要发送到从服务器,但是主服务器自身不保存数据。
    • NDB (也就是 NDBCLUSTER):这种集群数据库引擎主要用于对服务可用性要求极高的场景。
    • Merge:支持 MySQL DBA 或者开发人员将许多结构一致的 MyISAM 表作为一个逻辑对象使用。可以用于 VLDB 环境,例如数据仓库。
    • Federated:提供访问远程数据库的功能,可以将多个 MySQL 物理服务器组合成一个逻辑数据库。非常适合分布式环境或者数据集市。
    • Example:这是 MySQL 源代码中的一个示例存储引擎,用于演示如何编写新的存储引擎。它主要面向开发者,这种类型的表无法存储数据,也不会返回任何结果。

    存储引擎的设置不在服务器级别,也不在数据库(模式)级别;用户可以为不同的表指定不同的存储引擎。例如,一个应用程序大多数的表使用 InnoDB 存储引擎;同时创建一个 CSV 表,用于将数据导出到电子表格文件中;另外创建一些 MEMORY 表作为临时存储区。

    下表描述了 MySQL 中常见存储引擎支持的功能特性。

    功能特性 MyISAM Memory InnoDB Archive NDB
    B-树索引 ✔️ ✔️ ✔️
    备份/时间点恢复(1) ✔️ ✔️ ✔️ ✔️ ✔️
    集群数据库 ✔️
    聚集索引 ✔️
    压缩数据 ✔️ (2) ✔️ ✔️
    数据缓存 N/A ✔️ ✔️
    加密数据 ✔️ (3) ✔️ (3) ✔️ (4) ✔️ (3) ✔️ (3)
    外键 ✔️ ✔️ (5)
    全文搜索索 ✔️ ✔️ (6)
    空间数据类型 ✔️ ✔️ ✔️ ✔️
    空间数据索引 ✔️ ✔️ (7)
    哈希索引 ✔️ ❌ (8) ✔️
    索引缓存 ✔️ N/A ✔️ ✔️
    锁的粒度 表级 表级 行级 行级 行级
    MVCC ✔️
    复制 (1) ✔️ 有限(9) ✔️ ✔️ ✔️
    存储限制 256TB RAM 64TB 384EB
    T-树索引 ✔️
    数据库事务 ✔️ ✔️
    更新数据字典统计信 ✔️ ✔️ ✔️ ✔️ ✔️

    注释:

    1. 在服务器层实现,而不是存储引擎层。
    2. 只有使用行压缩格式才支持 MyISAM 压缩表。使用行压缩格式的 MyISAM 表属于只读表。
    3. 在服务器层通过加密函数实现。
    4. 在服务器层通过加密函数实现;MySQL 5.7 开始支持表空间静态数据(data-at-rest)加密。
    5. MySQL Cluster NDB 7.3 开始支持外键约束。
    6. MySQL 5.6 开始支持 InnoDB 的 FULLTEXT 索引。
    7. MySQL 5.7 开始支持 InnoDB 的空间数据索引。
    8. InnoDB 内部使用哈希索引实现自适应哈希索引(Adaptive Hash Index)特性。
    9. 内存表的复制

    下一篇我们来具体谈谈 InnoDB 存储引擎的体系结构。欢迎关注❤️、点赞👍、转发📣!

    展开全文
  • 计算机体系结构.体系结构简介 什么是计算机体系结构 对于“Computer Architecture”,有些地方译为“计算机系统结构”,有些地方译为“计算机体系结构”。这两种翻译都对,只是经常会被混用。本文将以“体系结构”为...

    计算机体系结构.体系结构简介

    什么是计算机体系结构

    对于“Computer Architecture”,有些地方译为“计算机系统结构”,有些地方译为“计算机体系结构”。这两种翻译都对,只是经常会被混用。本文将以“体系结构”为主,不过如果偶尔出现了“系统结构”那也不要慌,其实指的都是”Computer Architecture“。

    计算机体系结构包含了整个计算机设计与实现的方方面面,是对整个计算机系统的组织、功能、实现的全面考量【1】。值得一提的是,过去(上世纪)的体系结构通常指的是指令集架构(Instruction Set Architecture,简称ISA),彼时摩尔定律的效果十分强劲,只需堆砌更多的晶体管就可以获得性能上的提升,因此并不需要太多的微结构设计。

    当然如今已经不仅仅是ISA了,但ISA是仍是体系结构中很重要的一部分,因为ISA设计是关乎软硬件结合的关键:软件通过指令操控硬件,硬件根据指令执行具体功能。ISA设计通常可以被视为系统结构所涵盖范围的上层,而下层是微结构(Microarchitecture)。

    有些地方会将“体系结构”和“微结构”所混淆,其实是不准确的。微结构对应的是某一具体ISA在某种特定处理器上的具体实现【2】,对于常见的桌面处理器其微结构设计通常包括但不限于:流水线、存储层次结构、功能单元、乱序结构、片上网络等等,而对于专用的嵌入式处理器常常不采用乱序结构(更肯定一点的话,可以去掉“常常”二字)且流水线也十分简单。相同的ISA可以有不同的微结构实现,比如Intel和AMD的处理器都是x86指令集,但其内部架构千差万别,耳熟能详的有Intel的酷睿系列、至强系列,AMD的推土机和锐龙。

    但是,体系结构设计常常不仅仅需要这两部分的知识,或者换句话说,对于体系结构而言,仅仅把视角局限于ISA和微结构是远远不够的:

    • 对于ISA设计,其需要和应用(操作系统、编译器、应用软件等)相结合。
      • 比如在x86指令集发展过程中,其支持的越来越多的扩展指令集,如SSE、AVX、VT-x等等【3】,其主要目的是能够针对某种特定的应用,为其提供更直接的指令,从而使得程序运行更快。当然除了性能方面的考量,也有对应用功能上的支持,比如虚拟化的支持、系统特权级的支持、内存保护的支持等等。
      • 因此ISA设计绝不仅仅是拍脑袋想出来的一堆指令,其设计都是有着广泛考量,要做到对编译器友好、对底层实现友好、对程序运行友好、对操作系统友好等等各方面,设计出一个足够好的ISA的确是不太容易的一件事。
      • (题外话:x86指令集足够好吗?单从设计上看x86称不上好,但Intel实力雄厚,可以背下足够沉重的历史包袱,使得x86指令集的发展中做到了很好的兼容性,而这也是其能够赢得市场的关键原因)
    • 对于微结构设计,其需要和硬件实现相互配合,这就需要微结构设计人员具备电路逻辑设计、芯片封装与测试等广泛的硬件知识。
      • 比如流水线的设计需要与时钟频率相互配合,一般而言每级流水的最佳延迟是6至8个FO4的延迟【4】。此外很重要的一点,或者说是最重要的一点,就是微结构设计与性能、成本和功耗之间的关系。要使微结构设计在这三者之间达到平衡,从而取得最佳的设计效果,进而达到预期的设计目标,是很不容易的一件事。
      • 不十分准确但足以表达这种权衡(tradeoff)的说法是,当专注提升其中某一个指标的时候,往往会影响另外两个指标,比如当以复杂的设计来取得较好的性能时,可能需要付出较大的芯片面积从而增加成本(涉及生产良率、测试成本等等),同时复杂的逻辑也会带来功耗上的压力。

    在体系结构领域的经典著作《量化研究方法》(第五版)中,体系结构涵盖了这三个方面:ISA、组成(微结构)、硬件。

    • 计算机的实现包括两方面:组成和硬件。组成即“微结构”,包括存储系统、处理器内部实现等等,与前文所述的概念一致。硬件则指的是具体实现,包括计算机的详尽数字电路逻辑设计和芯片封装技术。可以认为,微结构即描述了计算机逻辑上的设计,而硬件则描述了计算机具体的实现,二者结合来实现了一个具体的计算机。而ISA则可以认为是计算机所表露的接口,所有用该ISA所写的程序,都可以在该计算机上运行。
    • 目前我个人更倾向于把体系结构集中在ISA和微结构这两方面上,而将硬件相关的知识作为微结构设计中所不可缺少的一部分。要设计出一个好的微结构必然需要对硬件有相当的理解,能从逻辑设计上看到真正的硬件实现时所需要的资源,并保证微结构的设计符合硬件的约束。在我看来体系结构最具吸引力的是微结构,而对微结构设计的学习并不需要深入了解硬件,但是在真正实现一个可以流片的芯片时,必然需要与硬件工艺进行对接。

    计算机系统层次

    从上至下来看到整个计算机系统,可以大致分成这样几个层次:

    1. Problem
    2. Algorithm
    3. Program
    4. ISA
    5. Microarchitecture
    6. Circuits/Gates
    7. Electrons

    前三层是对所有软件的一个划分:首先我们有了某个问题(比如人们需要一个程序来管理各种硬件资源),然后设计一个算法(如何管理呢,划分成内存管理、进程管理等),最后编成程序(就是操作系统啦)。

    对于Program这一级通常可以分为三个层次,即编程语言(Programming Language)、汇编语言(AssemblyLanguage)和机器码(Machine Code)。如果进一步划分下去,编程语言又分为高级编程语言(如Java、Python)和低级编程语言(如C、BASIC)。低级编程语言并不是格调上更low,而是更接近底层,可以直接与硬件进行交互,需要具备一定的计算机知识才能比较好的学习和使用,比如C的指针其实就是内存地址。而高级语言则进行了一定的抽象,屏蔽的硬件细节,使得人们可以不需要了解硬件的组织和运行就可以编写程序,就像写数学公式一样来完成编程工作,比如Matlib。

    再向下就到了体系结构所涵盖的范围了,即ISA和微结构。再下层的Circuits/Gates即电路。微结构设计通常使用HDL(Hardware Description Language)语言来完成。以verilog为例,其包含若干抽象层次,比如你可以使用“+”来完成一个加法操作,也可以亲自上手使用逻辑门来设计出一个加法器。

    而要设计出一个满足需求的结构,数字电路的知识是必不可少的。至少需要对电路运行的时钟有所了解,才能开始上手HDL的学习。更进一步,当需要更好的设计时,那就更不能缺少对电路的了解了。比如相同功能的实现常常有若干种不同的电路组成可以完成,通常使用更少的门电路可以减少面积、降低延迟,但也有可能面临稳定性的问题。而面对复杂的功能需求,则需要设计出一个足够高效的电路结构,否则则会拖慢整个流水线,从而降低芯片的执行效率。尽管微结构设计人员不需要亲自上手设计出电路上的每一个逻辑门,但也要时刻明白不能把过重的任务压在电路设计上,要避免设计太过复杂使得电路难以实现。此外也需要注意到电路的功耗等等其他因素。

    而Electrons则更加底层,这一层通常不关心微结构是如何设计的,更不关心程序要如何运行,而是专注于把逻辑设计(HDL)实现成真正的数字电路,并且满足各种物理上的约束。比如晶体管尺寸不断降低,相同面积的芯片上可以集成越来越多的晶体管,但要如何保证尺寸这么小的晶体管能够正常运行,比如晶体管中越来越薄的绝缘层所面临的漏电问题,这些就是电子所需要关注的。

    后续目录

    目录

    1. 体系结构简介 introduction
      1.1 概念
      1.2 计算机的层次结构
    2. 计算机简史 brief history
      2.1 两大定律与两大结构
      2.2 历史上的计算机
      2.3 北桥和南桥
    3. 微结构系列 microarchitecture
      3.1 流水线设计 pipeline design
      3.2 缓存层次 cache hierarchy
      3.3 乱序结构 out of order execution
      3.4 多发射结构 multiple instruction issue
      3.5 分支预测 branch prediction
      3.6 数据预取 data prefetching
      3.7 快表 TLB translation lookaside buffer
      3.8 缓存一致性 cache coherence
      3.9 内存一致性 memory consistency
      3.10 向量计算 vector execution
      3.11 图形计算 graph process unit
      3.12 片上网络 network on chip
    4. ISA设计 instruction set architecture
      4.1 CISC vs RISC
      4.2 现有指令集 x86 ARM POWER MIPS Alpha
      4.3 指令集架构设计原则 design rules
    5. 性能工程 & 功耗管理 & 成本控制
    6. Domain Specific Architecture

    参考资料

    [1] WiKiPedia.Computer architecture[EB/OL].(2019-03-02)[2019-04-29]
    https://en.wikipedia.org/wiki/Computer_architecture

    [2] WiKiPedia.Microarchitecture[EB/OL].(2019-03-03)[2019-04-29]
    https://en.wikipedia.org/wiki/Microarchitecture

    [3] WiKiChip.Core i5-8400[EB/OL].(2019-01-16)[2019-04-29]
    https://en.wikichip.org/wiki/intel/core_i5/i5-8400

    [4] M. S. Hrishikesh, Doug Burger, Stephen W. Keckler, Premkishore Shivakumar, Norman P. Jouppi, Keith I. Farkas: The Optimal Logic Depth Per Pipeline Stage is 6 to 8 FO4 Inverter Delays. ISCA 2002: 14-24

    展开全文
  • 知识体系结构

    千次阅读 2019-10-20 11:13:14
    知识体系结构

    思维导图

    1.常见工程、应用、学习错误与安装问题与实用技巧
    2.日常安排
    3.
    4.格式
    5.文学
    6.金融
    7.音乐
    8.资产
    9.饮食
    10.运动
    11.培养计划
    12.课题
    ++.百度上网
    ++.深度学习岗位设计
    15.面试
    16.知识体系结构(副)
    17.规范
    18.Algorithm
    19.设计模式
    20.PPT展示
    21.吃生活
    22.项目
    23.major_s
    24.国内产业形势分析
    25.国际产业形势分析
    26.国内政治生态
    27.国际政治生态
    28.论文研究


    一 基础:

    计算机基础


    二 科研方向:

    人工智能

    数据科学

    3D视觉


    三 求职方向

    软件工程应用

    Python

    运维

    大数据

    工业视觉

    人工智能

    七 嵌入式计算机视觉开发

    八 Web安全

    九 逆向工程:c/c++ sdk\ddk编程

    架构师


    四 前沿:

    论文报告/前沿文章


    五 选修:

    选修课程

    物理学基础


    六 竞赛

    1. 竞赛常用
    2. CV方向
    3. 推荐方向
    4. NLP方向
    5. 时间序列
    6. 竞赛教程

    问题板


    八 常用网址:

    提醒:打不开就是说明要外网

    • 常用论文查找地址

    arXiv
    Google学术
    百度学术

    • 解决一般的技术问题网站:

    stackflow
    github
    youtube
    google

    • 常用代码查找地址

    Papers with Code
    github
    码云

    • 竞赛地址:

    机器学习类:Kaggle
    医学类:grand-challenge、MICCAI
    数据挖掘:KDD-CUP
    大数据类:DataCastle
    flyai–小型比赛圈

    国内的:阿里天池、腾讯广告算法大赛华为云平台等等

    • 学习地址

    深度之眼
    B站

    • 论文下载(目前我不怎么用,一般在线直接浏览 用arxiv 或 Google学术):

    SCI-HUB
    booksc
    medium

    • 云地址

    阿里云
    百度智能云
    聚合数据
    七牛云

    • 网盘地址

    百度网盘
    谷歌网盘

    • 软件工程

    墨刀
    声网-可构建实时通讯


    九 推荐学习网站

    1. EDX
    2. 学堂在线
    3. Coursera
    4. 优达
    5. 慕课网
    6. 网易云课堂
    7. Mooc
    8. bilibili
    9. 51学院
    10. http://introtodeeplearning.com/
    11. 极客时间
    12. 拉钩教育
    13. 今日头条
    14. 知识星球
    15. gitchat
    16. 淘宝、咸鱼
    17. c/c++系列教程推荐网址
    18. http://www.aliangedu.cn/

    十 其他

    深度学习的学习路径
    推荐书籍

    租GPU网址


    在这里插入图片描述

    卡输出阈值:比如一张图片的类别输出只有几十个像素,这种可能既不符合实际的,直接将输出结果置0,直接进行手工预测限制

    展开全文
  • 冯诺依曼体系结构 存储程序原理 程序(指令)和数据同时存放在一个存储器上,控制流由指令流产生,且指令在存储器中按执行 顺序存放,存储程序计算机最早是由著名数学家冯·诺依曼等人在1946年总结并明确提出来的, ...

    冯诺依曼体系结构

    存储程序原理

    程序(指令)和数据同时存放在一个存储器上,控制流由指令流产生,且指令在存储器中按执行
    顺序存放,存储程序计算机最早是由著名数学家冯·诺依曼等人在1946年总结并明确提出来的,
    因此又被称为冯·诺依曼计算机(又称为普林斯顿体系结构)。

    基本点是指令驱动

    程序预先存放在计算机存储器中,计算机一旦启动,
    就按照程序指定的逻辑顺序执行这些程序

    冯诺依曼体系结构的主要特点
    1. 计算机以运算器为处理中心
    2. 在存储器中指令和数据同等对待(可以进行运算);
    3. 存储器是按地址访问的,按地址线性编址的一维结构,每个单元格的位数是一定的;
    4. 指令的执行是顺序的;
    5. 指令由操作码和地址码组成。操作码指明指令的类型,
      地址码指明操作数地址和存放运算结果的地址。操作数的类型由操作码决定,
      操作数本身不能判断是何种数据类型;
    6. 指令和数据均以二进制编码表示,采用二进制运算;  
      缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈
      后来的计算机对上述不足之处做的改进:
    7. 对输入输出方式的改进:
    8. 采用并行处理技术:
    9. 存储器组织结构的发展:
    10. 指令集的发展

    哈佛结构

    哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,它的主要特点是
    将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,、
    每个存储器独立编址、独立访问,目的是为了减轻程序运行时的访存瓶颈。

    总结

    随着CPU设计的发展,流水线的增加,指令和数据的互斥读取影响CPU指令执行的scale程度。
    哈佛结构中数据存储器与程序代码存储器分开,各自有自己的数据总线与地址总线,取操作数与取指令能同时进行。
    但这是需要CPU提供大量的数据线,因而很少使用哈佛结构;构作为CPU外部构架来使用。
    对于CPU内部,通过使用不同的数据和指令cache,可以有效的提高指令执行的效率,
    因而目前大部分计算机体系都是在CPU内部的使用哈佛结构,在CPU外部使用冯·诺依曼结构。

    展开全文
  • 任何不拿出干货的技术文档都是耍流氓,首先上体系结构图,如图所示,在整体体系结构上,微博推荐可以被划分为4层:前端展现层、应用层、计算层以及数据层,其中我们把数据日志、统计、监控以及评估也都...
  • Oracle体系结构

    万次阅读 2020-12-03 19:41:08
    Oracle体系结构前言1、数据库2、 实例3、用户4、表空间5、数据文件(dbf、ora)6、逻辑图 前言 提示:本文章是日常学习内容的总结,并非全部原创;仅供大家参考借鉴,并无其他商业用途。 1、数据库 Oracle 数据库...
  • 第三章 软件体系结构风格 一、基本概念 1. 软件体系结构设计的一个核心问题是能否使用重复的体系结构模式,即能够达到体系结构级的复用。 2. 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。...
  • ARM体系结构

    千次阅读 2018-11-14 10:35:59
    ARM体系结构
  • 计算机两大体系结构: 1.冯诺依曼体系结构 计算机系统由一个中央处理单元CPU和一个存储器组成。 存储器拥存储数据和指令,并且可以根据所给的地址对它进行读或写。 数据和指令都存储在存储器中的计算机被称为冯...
  • 软件体系结构基础

    千次阅读 2020-12-27 12:57:33
    软件体系结构基础,对软件体系结构做简要总结,通用模型可以应用于许多不同类型的系统。此部分选择有代表性的结构进行总结。体系结构的模式选择设计模式做阐述,风格选择典型的三种体系结构风格做阐述,框架选择MVC...
  • 冯诺依曼体系结构与哈弗体系结构 冯·诺依曼结构(von Neumann architecture)  冯·诺依曼结构也称作普林斯顿结构,是一种将程序(指令序列的集合)和数据存放在同一存储器的不同地址的电脑设计概念结构。这是...
  • 冯诺依曼体系结构简介: 美籍匈牙利数学家冯·诺依曼于1946年提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。 冯·诺依曼体系结构冯·诺依曼理论的要点是:计算机的数制采用...
  • ARM处理器体系结构

    千人学习 2016-01-19 16:43:49
    本课程主要的内容是介绍ARM处理器的体系结构发展历史,工作模式,存储器组织基本知识。
  • 计算机体系结构

    万次阅读 2017-12-14 15:00:26
    详解计算机体系结构  计算机体系结构是指那些对程序员可见的系统属性,还包括设计思想与体系结构。今天课课就来和大家分享这篇文章,全面概述了计算机体系结构。要认真阅读~  计算机体系...
  • 冯诺依曼体系结构、哈佛体系结构

    千次阅读 2015-10-15 12:43:27
    冯诺依曼体系结构、哈佛体系结构与改进型哈佛结构之间的区别 1、冯·诺依曼结构 冯·诺依曼结构又称作普林斯顿体系结构(Princetionarchitecture)。 1945年,冯·诺依曼首先提出了“存储程序”的概念和二进制...
  • 计算机网络体系结构

    万次阅读 2020-10-28 21:43:54
    计算机网络体系结构 计算机网络是利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统。 网络模型 OSI七层模型,开放...
  • 物联网安全体系结构

    万次阅读 2019-04-21 22:14:02
    物联网安全体系结构 物联网结构复杂、技术繁多,面临的安全威胁的种类也就比较多。结合物联网的安全架构来分析感知层、传输层、处理层以及应用层的安全威胁与需求,不仅有助于选取,研发适合物联网的安全技术,更有...
  •  研究软件体系结构的首要问题是如何表示软件体系结构,即如何对软件体系结构建模。可以将软件体系结构的模型分为5种:结构模型、框架模型、动态模型、过程模型、功能模型。 一、4+1视图模型 1.定义 “4+1”视图...
  • 9.2 Servlet体系结构&工作方式

    万次阅读 2020-05-10 17:41:54
    Servlet体系结构 基础知识 Java Web应用是基于Servlet规范写的,而Servlet规范又是基于以下几个类运转的: Servlet顶层类关联图: 从图中可以看到,有三个类ServletConfig、ServletRequest、ServletResponse是与...
  • 软件体系结构

    2017-05-25 16:42:02
    软件体系结构定义了软件的局部与总体计算部件的构成以及他们之间的相互关系。总的来说,软件体系结构是结构和相互作用功能各异的构件之的集合,按照层次构成的。 体系结构=部件+连接件+约束
  • Linux体系结构

    千次阅读 2018-10-18 22:13:14
    为便于更好的了解Linux系统的体系结构,先介绍常用的windows系统的体系结构。  Windows系列操作系统采用微内核体系结构,模块化设计,将对象分为用户模式层和内和模式层。用户模式层由一组组价(子系统)构成,将...
  • Spring 的体系结构

    千次阅读 2018-11-14 18:38:33
    Spring的体系结构
  • 物联网体系结构

    千次阅读 2019-12-31 11:03:02
    有共性,所以有体系结构,谁赞成?谁反对(抖个机灵) 当你有些知识储备后,你就会觉得很多总结性的话语看似是多余的话,但其实每句话都有很深层次的含义,里面出现的名词都在相关领域有着一席之地。 我们需要寻找...
  • 冯诺依曼体系结构

    千次阅读 2021-02-27 18:53:56
    理解冯诺依曼体系结构3.1冯诺依曼体系结构简图3.2为什么输入/出设备的数据,不直接给CPU反而给内存3.3为什么程序运行的时候,要加载到内存3.4内存如何充当缓存区的?3.5内存是计算机的核心4.在硬件层面上对冯诺依曼...
  • 冯诺依曼计算机体系结构

    万次阅读 2019-02-22 14:30:52
    当前计算机主要是基于冯诺依曼体系结构设计的,下面就简单分析一下冯诺依曼体系结构的计算机是如何工作的,首先下面的图就是冯诺依曼体系结构图。 主要由五大部件组成: 1.存储器用来存放数据和程序 2.运算器主要...
  • 冯诺依曼体系结构和哈佛体系结构

    千次阅读 2014-02-12 17:48:46
    目前,有两种占统治地位的计算机体系及结构:复杂指令集计算机(CISC)体系结构和精简指令集计算机(RISC)体系结构。 CISC的代表就是通常所说的冯诺依曼体系结构,由普林斯顿大学的约翰冯诺依曼所发明。在此...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,399
精华内容 43,359
关键字:

体系结构