精华内容
下载资源
问答
  • 为什么寄存器处理数据的速度比内存快? 计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。 同样都是晶体管存储设备,为什么寄存器比内存快呢? Mike Ash写了一篇很好的...

    为什么寄存器处理数据的速度比内存快?

    计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。

    同样都是晶体管存储设备,为什么寄存器比内存快呢?

    Mike Ash写了一篇很好的解释,非常通俗地回答了这个问题,有助于加深对硬件的理解。下面就是我的简单翻译。

    原因一:距离不同

    距离不是主要因素,但是最好懂,所以放在最前面说。内存离 CPU比较远,所以要耗费更长的时间读取。

    以3GHz的CPU为例,电流每秒钟可以振荡30亿次,每次耗时大约为0.33纳秒。光在1纳秒的时间内,可以前进30厘米。也就是说,在CPU的一个时钟周期内(0.33纳秒),光可以前进10厘米。

    涛声依旧注:每次震荡的耗时也就是CPU的时钟周期,时钟周期为震荡频率的倒数。

    因此,如果内存距离CPU超过5厘米,就不可能在一个时钟周期内完成数据的读取,这还没有考虑硬件的限制和电流实际上达不到光速。相比之下,寄存器在CPU内部,当然读起来会快一点。

    距离对于桌面电脑影响很大,对于手机影响就要小得多。手机CPU的时钟频率比较慢(iPhone 5s为1.3GHz),而且手机的内存紧挨着CPU。

    原因二:硬件设计不同

    苹果公司新推出的iPhone 5s,CPU是A7,寄存器有6000多位(31个64位寄存器,加上32个128位寄存器)。而iPhone 5s的内存是1GB,约为80亿位(bit)。

    这意味着,高性能、高成本、高耗电的设计可以用在寄存器上,反正只有6000多位,而不能用在内存上。因为每个位的成本和能耗只要增加一点点,就会被放大80亿倍。
    事实上确实如此,内存的设计相对简单,每个位就是一个电容和一个晶体管,而寄存器的设计则完全不同,多出好几个电子元件。
    并且通电以后,寄存器的晶体管一直有电,而内存的晶体管只有用到的才有电,没用到的就没电,这样有利于省电。

    这些设计上的因素,决定了寄存器比内存读取速度更快。

    原因三:工作方式不同

    寄存器的工作方式很简单,只有两步:

    (1)找到相关的位
    (2)读取这些位。

    内存的工作方式就要复杂得多:
    1. 找到数据的指针。(指针可能存放在寄存器内,所以这一步就已经包括寄存器的全部工作了。)
    2. 将指针送往内存管理单元(MMU),由MMU将虚拟的内存地址翻译成实际的物理地址。
    3. 将物理地址送往内存控制器(memory controller),由内存控制器找出该地址在哪一根内存插槽(bank)上。
    4. 确定数据在哪一个内存块(chunk)上,从该块读取数据。
    5. 数据先送回内存控制器,再送回CPU,然后开始使用。
      内存的工作流程比寄存器多出许多步。每一步都会产生延迟,累积起来就使得内存比寄存器慢得多。

    为了缓解寄存器与内存之间的巨大速度差异,硬件设计师做出了许多努力,包括在CPU内部设置缓存、优化CPU工作方式,尽量一次性从内存读取指令所要用到的全部数据等等。

    来源:阮一峰的网络日志 | 作者:阮一峰

    展开全文
  • 为什么我们要用 Redis

    2021-01-31 18:36:57
    本文将会从 Redis 的几大特性开始讲起,分别讲解 Redis 的速度快、支持多种数据类型、功能多样、服务简单、客户端语言丰富...存储器又是由闪存,硬盘,内存这三部分组成,而这三部分当中读取速度最快的是内存,Redis 正

    本文将会从 Redis 的几大特性开始讲起,分别讲解 Redis 的速度快、支持多种数据类型、功能多样、服务简单、客户端语言丰富、支持持久化及主从复制、高可用、分布式这几大特点。从这几大特点中,读者可以详细的知道为什么要学习 Redis 以及学习 Redis 有什么用。下面正式开始本文的学习。先介绍本文的思维导图。

    images01

    速度快

    1. 数据都在内存中:计算机由运算器,控制器,存储器,输入设备,输出设备这五大部分组成。存储器又是由闪存,硬盘,内存这三部分组成,而这三部分当中读取速度最快的是内存,Redis 正是利用了这一点,所以读取速度才会更快。

    2. 单线程,避免出现线程竞争问题:Redis 客户端每次调用都会经历发送、执行、返回结果的三个阶段,由于 Redis 是单线程模型,所以当请求来临时,所有的命令进入到一个对列中,然后依次按照对列执行。由于不会有两条命令同时执行,所以不会产生并发问题。 备注:单线程模型,指的是网路请求模块使用的是一个线程,即,一个线程处理所有的网络请求,其余模块仍然使用多个线程。

    3. 采用非阻塞 IO:Redis 由于是 C 语言实现,其速度上更快,更加接近于系统底层。Redis Build 相当的快,使用了内置容器,即 stl,使用了大量的模板,由于使用了 C 可移植性更高。

    images02

    如上图所示,Redis 有一个全局管理者——reactor,负责管理全局的请求,当没有请求的时候,进入到阻塞状态,即 acceptor 状态,当有请求来临的时候,会自动调用一个新的线程,重新启动新的程序。由于是多线程调用处理,速度会更快。

    一言以蔽之,就是把事件注册到监听器上,当请求来临时候,直接触发事件,调用新的线程进行处理。

    支持多种数据类型

    Redis 支持五大基础数据类型( string,字符串类型,hash 哈希,list 列表,set 集合)以及 zset 有序集合,如下图所示:

    images03

    string

    string 是 redis 的基本数据类型,即一个 key 对应于一个 value,常用的命令有 get、set、incr、decr、mget 等。应用场景主要是进行系统的缓存,如微博计数,粉丝计数等。 使用示例如下

    redis 127.0.0.1:6379> SET name "runoob"
    "OK" redis 127.0.0.1:6379> GET name
    "runoob"
    

    显示更多

    hash

    哈希是一个键值对的集合,redis hash 是一个 string 类型的 field 和 value 的映射表,hash 用于存储对象,常用命令有,hget,hset,hgetall。主要使用场景有存储一个用户信息的对象数据。例如 key 为用户 id,value 为用户序列化后的姓名数据,年龄数据,生日数据等。

    使用示例如下:

    redis> HSET myhash field1 "Hello" field2 "World"
    "OK" redis> HGET myhash field1
    "Hello" redis> HGET myhash field2
    "World"
    

    显示更多

    list

    list 列表是简单的字符串列表,按照插入的顺序排序,可以添加一个元素到列表的头部或尾部。常用命令有 ipush,rpush,ipop,rpop,lrange 等。微博的关注列表,粉丝列表都可以使用 redis 的 list 进行实现。

    使用示例如下

    redis 127.0.0.1:6379> lpush runoob redis
    (integer) 1 redis 127.0.0.1:6379> lpush runoob mongodb
    (integer) 2 redis 127.0.0.1:6379> lpush runoob rabitmq
    (integer) 3 redis 127.0.0.1:6379> lrange runoob 0 10
    1) "rabitmq"
    2) "mongodb"
    3) "redis" redis 127.0.0.1:6379>
    

    显示更多

    set

    set 是 string 类型的无序集合,通过 hashtable 实现,与概念和数学中的集合基本类似,可以进行交集,并集,差集等操作,set 中的元素没有顺序,添加,删除,查找其复杂度都为 O(1)。

    常用命令有 sadd,spop,smembers,sunion。常用的使用场景有微博中,把一个用户所有关注的人都保存为一个集合,把其所有的粉丝都保存为一个集合,因为 redis 还提供求交集,并集,差集,所以可以实现共同关注、共同喜好等功能。

    使用示例如下

    redis 127.0.0.1:6379> sadd runoob redis
    (integer) 1 redis 127.0.0.1:6379> sadd runoob mongodb
    (integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq
    (integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq
    (integer) 0 redis 127.0.0.1:6379> smembers runoob
    1) "redis"
    2) "rabitmq"
    3) "mongodb"
    

    显示更多

    zset

    zset 和 set 一样也是 string 类型的元素集合,并且不允许有重复成员,可以用 zadd 命令添加元素到集合,元素在集合中会更新对应的 score,常用的命令有 zadd,zrange,zrem,zcard 等。使用场景有,排行榜的使用,带权重的消息队列的使用。

    使用示例如下

    redis 127.0.0.1:6379> zadd runoob 0 redis
    (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 mongodb
    (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq
    (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq
    (integer) 0 redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
    1) "mongodb"
    2) "rabitmq"
    3) "redis"
    

    显示更多

    其余数据类型

    其余数据类型有位图、hyperloglog、geo,由于这些数据类型一般不太常用,所以本文不介绍。

    功能丰富

    redis 功能相当丰富,拥有键过期功能、基于发布订阅实现消息队列功能、通过 Lua 创建命令功能、pipeline 功能等。

    设置键过期

    redis 可以设置键过期功能,其示例代码如下

    redis> SET cache_page "www.google.com"
    OK
    redis> EXPIRE cache_page 30  # 设置过期时间为 30 秒
    (integer) 1
    redis> TTL cache_page    # 查看剩余生存时间
    (integer) 23
    redis> EXPIRE cache_page 30000   # 更新过期时间
    (integer) 1
    redis> TTL cache_page
    (integer) 29996
    

    显示更多

    基于发布订阅实现消息队列

    redis 可以基于发布订阅实现消息队列功能,其实现方案如下:

    使用 redis 的 ipush 命令,实现简单的左进右出,或者右进左出的 list 列表,然后需要开启一个线程任务或者定时任务,不停的调用 rpop 方法查看 list 中是否有待处理的消息,如果有进行处理,如果没有则继续调用查看。

    通过 lua 创建命令

    以一个例子作为验证,使用 lua 脚本实现 redis 的自乘。 书写 Lua 脚本如下

    local curVal = redis.call("get", KEYS[1]); 
    if curVal == false 
       then curVal = 0 
       else curVal = tonumber(curVal) 
    end;
    curVal = curVal * tonumber(ARGV[1]); 
    redis.call("set", KEYS[1], curVal);
    return curVal;
    

    显示更多

    执行验证,上面的 lua 脚本去掉换行即可。

    127.0.0.1:6379> SCRIPT LOAD 'local curVal = redis.call("get", KEYS[1]); if curVal == false then curVal = 0 else curVal = tonumber(curVal) end;curVal = curVal * tonumber(ARGV[1]);redis.call("set",KEYS[1], curVal);return curVal;'
    "3ffdd17da7e77aa3249ac0d0b05d6e8fc348e8f3"
    127.0.0.1:6379>
    

    显示更多

    设置两年 10 岁,然后调用 lua 缓存命令乘以 3.得出结果为 30

    127.0.0.1:6379> SCRIPT LOAD 'local curVal = redis.call("get", KEYS[1]); if curVal == false then curVal = 0 else curVal = tonumber(curVal) end;curVal = curVal * tonumber(ARGV[1]);redis.call("set",KEYS[1], curVal);return curVal;'
    "3ffdd17da7e77aa3249ac0d0b05d6e8fc348e8f3"
    127.0.0.1:6379> set gaoxinfu_age 10
    OK
    127.0.0.1:6379> EVALSHA 3ffdd17da7e77aa3249ac0d0b05d6e8fc348e8f3 1 gaoxinfu_age 3
    (integer) 30
    127.0.0.1:6379>
    

    显示更多

    Redis 高级特性

    Redis 除了上文介绍的一些比较初级的特性以外,还具有服务简单、客户端语言丰富、支持持久化、支持主从复制等一些高级特性。下面依次介绍这些高级特性。

    1. 服务简单:redis 服务相当简单,其源代码优雅,拥有多个操作系统的版本故而在一定意义上来说不依赖于操作系统,例如 windows 版本的 redis,linux 版本的 redis,还有 docker 容器版本的 redis,这些版本,随用随取,相当方便。
    2. 客户端语言丰富:redis 具有多语言客户端,有支持 Java 的 jredis,php 的 phpredis,python 的 redis-py 客户端,以及 node 的 redis 客户端 node_redis 等,客户端语言相当的丰富。
    3. 支持持久化:redis 支持持久化,主要有两种持久化方式:RDB 持久化和 AOF 持久化。这两种持久化方式一个为记录命令,一个为把当前的 redis 进行快照保存到磁盘中。
    4. 支持主从复制,高可用,分布式:redis 支持主从复制,哨兵机制,高可用机制,分布式机制。如图所示:

    images04

     

    小结

    本文通过介绍 redis 支持多种数据类型、功能丰富、服务简单、客户端语言丰富、支持持久化、支持分布式等特点详解了我们为什么要用 redis,从而帮助您为后续 redis 的学习奠定了基础。

    展开全文
  • 2、数据的一致性与完整性。3、数据的共享与独立性。 2.2. 系统的可行性分析 2.2.1. 技术可行性 技术上的可行性分析要考虑将来要采用的硬件和软件技术能否满足用户(这里是服务器,网速)提出的要求(如计算机的...
  •  值得一提是,由于整个过程都是在硬盘里读取数据,所以在安装速度上比用光盘安装很多。 其实这只是用U盘安装系统其中一种方法而已,还有很多其它方式可以安装系统,本文就不再一一举例。也许细心你已经...
  • LINGO软件学习

    2009-08-08 22:36:50
    为此,LINGO为用户提供了两个可选部分:输入集成员和数据的数据部分(Data Section)和为决策变量设置初始值的初始部分(Init Section)。 3.1 模型的数据部分 3.1.1 数据部分入门 数据部分提供了模型相对静止部分...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    3.2 使用我编译器,下面的代码int i= 7; printf("%d\n", i++ * i++); 打印出49。不管按什么顺序计算,难道不该是56吗? 33  3.3 对于代码int i=3; i=i++; 不同编译器给出不同i值,有为3,有为4,哪个是...
  • 3.2 使用我编译器,下面的代码inti=7;printf("%d\n",i++*i++);打印出49。不管按什么顺序计算,难道不该是56吗? 3.3 对于代码inti=3;i=i++;不同编译器给出不同i值,有为3,有为4,哪个是正确? *3.4 有...
  • 3.2 使用我编译器,下面的代码int i= 7; printf(%d\n, i++ * i++); 打印出49。不管按什么顺序计算,难道不该是56吗? 33  3.3 对于代码int i=3; i=i++; 不同编译器给出不同i值,有为3,有为4,哪个是...
  • 设置后,SFUD 会去结合当前设定 QSPI 总线数据线宽度,去 QSPI Flash 扩展信息表 中匹配最合适速度最快的快速读命令,之后用户在调用 sfud_read() 时,会使用 QSPI 模式传输函数发送该命令。 sfud_err sfud_...
  •  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: ...
  • 你必须知道495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    3.2 使用我编译器,下面的代码int i=7; printf("%dnn", i++ * i++); 返回49?不管按什么顺序计算, 难道不该打印出56吗? . . . . . . 13 3.3 对于代码int i = 3; i = i++; 不同编译器给出不同结果, 有为 3, 有...
  • 这里IDE设备包括了IDE硬盘和IDE光驱,第一、第二组设备是指主板上第一、第二根IDE数据线,一般来说靠近芯片是第一组IDE设备,而主设备、从设备是指在一条IDE数据线上接两个设备,大家知道每根数据线上可以接...
  • asp.net知识库

    2015-06-18 08:45:45
    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    步伐通知,计算和显示速度(步/分钟),处理输入所需步伐,并通知用户,如果他/她走或慢。 Pedometer 主界面 PedometerSettings 设置属性自定义类 Settings 设置界面 SpeakingTimer 说话时间 反复监听所有对象...
  •  本书是编程语言先驱者Ivor Horton经典之作,是C语言方面畅销图书品种之一,在世界范围内广受欢迎,口碑极佳。  本书目标是使你在C语言程序设计方面由一位初学者成为一位称职程序员。 内容简介  本书是...
  •  本书是编程语言先驱者Ivor Horton经典之作,是C语言方面畅销图书品种之一,在世界范围内广受欢迎,口碑极佳。  本书目标是使你在C语言程序设计方面由一位初学者成为一位称职程序员。 内容简介  本书是...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    C#--微软.NET第一语言 本书着重介绍语言本身,比较少涉及应用,不错入门书,从头讲起,不怕不明白。 <<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 ...
  • 电脑系统优化大全

    2011-11-21 12:35:25
    如采用系统悬挂,即将当前系统状态在关机后保存,下次开机后,系统会直接进入上次关机前桌面,用这种方法,开机时间最快可以达到4-5秒钟,但不是所有主板BIOS都支持,设置起来也稍显麻烦。 打开注册表,展开到...
  • C#微软培训资料

    2014-01-22 14:10:17
    以互相交换组件地方以互相交换组件地方 以互相交换组件地方 比尔 比尔比尔 比尔.盖茨 盖茨盖茨 盖茨 在本章中你将了解 Microsoft.NET 概念 .NET 框架 C#语言在.NET 框架中作用及其特性...
  •  硬盘中有一个很宠大的数据交换文件,它是系统预留给虚拟内存作暂存的地方,很多应用程序都经常会使用到,所以系统需要经常对主存储器作大量的数据存取,因此存取这个档案的速度便构成影响计算机快慢的非常重要因素...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    � 采用了对有限内存、电池和 CPU 优化过虚拟机 Dalvik , Android 运行速度比想象很多。 � 运营商(中国移动等)大力支持,产业链条热捧。 � 良好盈利模式( 3/7 开),产业链条各方:运营商、...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    4.1.1 显示数据的视图 111 4.1.2 做出选择的视图 112 4.1.3 控件 112 4.1.4 表格和拾取器 113 4.1.5 栏 113 4.1.6 进度与活动 114 4.2 UIViewController 114 4.2.1 UIViewController 114 4.2.2 ...
  • <ul><li>字面量与局部变量访问速度最快,数组元素和对象成员相对较慢</li><li>变量从局部作用域到全局作用域搜索过程越长速度越慢</li><li>对象嵌套越深,读取速度就越慢</li><li>对象在原型链中...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    在系统需要挂上大量NFS文件系统时可以加快加载的速度。 -f:通常用于除错。它会使mount不执行实际挂上的动作,而是模拟整个挂上的过程,通常会和-v一起使用。 -t vfstype:显示被加载文件系统的类型。 -n:...
  •  我们看看呀清晰看到ghost系统安装速度是相当快的,因为他是一种还原,可以节省我们很多时间,待这步完成后系统将自动重新启动电脑进入下一步安装;  这里是系统正在扫描我们硬件系统,扫描后即下图; ...
  • /r 找到坏扇区并恢复可读取的信息。隐含着 /p 参数。  注意 Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多...
  • CruiseYoung提供的带有详细书签的电子书籍目录 ... MySQL 5权威指南(第3版) 基本信息 原书名: The Definitive... 10.8 保证数据的一致性 219 10.8.1 找出没有作者的图书 219 10.8.2 找出无效的出版公司引用:1:n关系...
  • o 4.2 使用我编译器,下面的代码 int i=7; printf("%d\n", i++ * i++); 返回 49?不管按什么顺序计算, 难道不该打印出56吗? o 4.3 对于代码 int i = 3; i = i++; 不同编译器给出不同结果, 有为 3, 有为 4,...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

下面设备读取数据的速度最快