声明

主页: 元存储的博客_CSDN博客
依公开知识及经验整理,如有误请留言。
个人辛苦整理,付费内容,禁止转载。


内容摘要

前言

1. SSD的架构

1.1 NAND闪存单元

1.2 SSD的组织

1.3生产过程

2.基准和性能度量

2.1基本基准

2.2 预处理

2.3工作负载和指标


前言

原文 http://codecapsule.com/2014/02/12/coding-for-ssds-part-2-architecture-of-an-ssd-and-benchmarking/

本第二部分包含了“为SSD编程”的6个内容,包括1、2两节,你可以参考目录。这是我在阅读了各种关于SSD的文档之后,为了分享我所学到的东西写的一系列文章。如果你没有时间慢慢看,你可以直接跳转到第六部分,这部分总结了所有其他部分的内容。

在本部分,我将解释NAND闪存的基本知识、闪存单元类型、和基本SSD内部架构。同样包括了SSD基准和如何解释这些基准。

1. SSD的架构

1.1 NAND闪存单元

固态硬盘(SSD)是基于闪存的数据存储设备。每个数据位保存在由浮栅晶体管制成的闪存单元里。SSD整个都是由电子组件制成的,没有像硬盘那样的移动或者机械的部分。

在浮栅晶体管中,使用电压来实现每个位的读写和擦除。写晶体管有两个方法:NOR闪存和NAND闪存。我不会更加深入的讨论NOR和NAND闪存的不同。本文将只包含被大多数制造商采用的NAND闪存。更多关于NOR和 NAND的不同点的信息,你可以参考Lee Hutchinson写的这篇文章[31]

NAND闪存模块的一个重要特征是,他们的闪存单元是损耗性的,因此它们有一个寿命。实际上,晶体管是通过保存电子来实现保存比特信息的。在每个P/E循环(Program/Erase,“Program”在这表示写)中电子可能被晶体管误捕,一段是时间以后,大量电子被捕获会使得闪存单元不可用。

有限的寿命

每个单元有一个最大的P/E 循环数量,当闪存单元被认为有缺陷后,NAND闪存被损耗而拥有一个有限的寿命。不同类型的NAND闪存有不同的寿命[31]。

最近的研究表示,通过给NAND一个相当高的温度,被捕获的电子可以被清除[14, 51]。尽管这仍然还只是研究,并且还没有确定到底哪一天能够将这个研究应用的消费市场,但这确实可以极大地增加SSD的寿命。

目前业界中的闪存单元类型有:

  • 单层单元(SLC),这种的晶体管只能存储一个比特但寿命很长。

  • 多层单元(MLC),这种的晶体管可以存储3个比特,但是会导致增加延迟时间和相对于SLC减少寿命。

  • 三层单元(TLC),这种的晶体管可以保存3个比特,但是会有更高的延迟时间和更短的寿命。

闪存单元类型

固态硬盘(SSD)是基于闪存的数据存储设备。比特存储在闪存单元中,有三种闪存单元类型:每个单元1比特(单层单元,SLC),每个单元2比特(多层单元,MLC),和每单元3比特(三层单元,TLC)。

下方的表1中是每种NAND类型的详细信息。为了比较,我添加了硬盘、内存、和L1/L2缓存的平均延迟。

SLC

MLC

TLC

HDD

RAM

L1 cache

L2 cache

P/E循环

100k

10k

5k

*

*

*

*

每单元比特数量

1

2

3

*

*

*

*

寻址用时(μs)

*

*

*

9000

*

*

*

读取用时(μs)

25

50

100

2000-7000

0.04-0.1

0.001

0.004

写入用时(μs)

250

900

1500

2000-7000

0.04-0.1

0.001

0.004

擦除用时(μs)

1500

3000

5000

*

*

*

*

备注

* 该种计量不适用此种存储设备

引用

P/E 循环 [20]

SLC/MLC用时 [1]

TLC用时 [23]

硬盘用时 [18, 19, 25]

内存用时 [30, 52]

L1 和L2 缓存用时 [52]

表1:NAND闪存不同类型的特征和用时与其他记忆组件比较

在相同数量的晶体管中的比特数更多可以降低生产成本。与基于MLC的SSD相比,基于SLC的SSD更可靠,并具有更长的寿命,但是有更高的生产成本。因此一般的大众SSD是基于MLC或者TLC的,只有专业的SSD是基于SLC的。因此往往会基于硬盘的目标工作负载和可能的数据更新频率,选择正确的存储类型。对于较高的更新工作负载,SLC是最后的选择,而高读取低写入的工作负载(例如视频存储和直播),TLC将极其适合。另外,TLC硬盘基于实际工作负载的基准检测显示出在实际中不必考虑基于TLC的SSD寿命。

NAND闪存的页和块

闪存的模块组织在被称为块的格子中,而块则组织成平面。块中可以读写的最小单元称为页。页不能独立擦除,只能整块擦除。NAND闪存的页大小可能是不一样的,大多数硬盘的页大小是2 KB, 4 KB, 8 KB 或 16 KB。大多数SSD的块有128或256页,这即表示块的大小也可能是256KB和4MB之间不同的值。例如Samsung SSD 840 EVO的块大小是2048KB,而每个块有256个8KB的页。页和块访问的细节在3.1节中

1.2 SSD的组织

下方的图1是SSD硬盘及其组件的示例。我只是重复了数篇论文[2, 3, 6]中已有的基本示意图。

图1:固态硬盘的架构

来自用户的命令是通过主机接口交换的。在我写这篇文章的时候,最新发布的SSD有两种最普遍的接口:SATA和PCIe。SSD控制器中的处理器接收这些命令并将它们传递给闪存控制器。SSD同样内嵌有RAM存储器,通常是作为缓存和存储映射信息使用。章节4包含了关于映射策略的细节信息。NAND闪存芯片通过多个通道组织在一起,和这些通道有关的信息在章节6中。

下方的图2和图3是从StorageReview.com [26, 27] 复制过来的,展示出真的SSD是长的什么样子的。

  • 1个SATA3.0接口

  • 1个SSD控制器(Samsung MDX S4LN021X01-8030)

  • 1个RAM模块(256 MB DDR2 Samsung K4P4G324EB-FGC2)

  • 8个MLC NAND闪存模块,每个模块有64G的存储空间(Samsung K9PHGY8U7A-CCK0)

图2:三星固态硬盘840 Pro(512 GB)— 感谢StorageReview.com[26] 的图片

图3是一个美光P420m 企业级PCIe固态硬盘,2013年末发布。主要组件有:

  • PCIe 2.0接口 x8

  • 1个SSD控制器

  • 1个RAM模块(DRAM DDR3)

  • 32通道上的64个MLC NAND闪存模块,每个模块有32GB的存储空间(Micron 31C12NQ314?25nm)

总存储空间为2048GB,但在应用over-provisioning技术后只有1.4TB可用。

图3:美光P420m企业级PCIe固态硬盘(1.4TB)— 感谢StorageReview.com[27] 的图片

1.3生产过程

很多SSD的生产商使用表面贴装技术(SMT,电子组件直接放置在PCB板上的一种生产方法)来生产SSD。SMT生产线由一系列机器组成,每个机器上下衔接,并有各自生产过程中的任务,例如安放组件或者融化焊锡。整个生产过程中同样贯穿了多重质量检测。Steve Burke的两篇参观金士顿在加利福利亚芳泉谷市的生产工厂的文章[67, 68]和Cameron Wilmot的一篇关于台湾金士顿组装工厂的文章[69]中,有SMT生产线的照片和视频。

另外还有两个有趣的视频,一个是关于美光Crucial SSD[70]的,而另一个是关于金士顿[71]。后边一个视频是Steve Burke文章的一部分,我同样在下方引用了。金士顿的Mark Tekunoff领读者参观了他们SMT生产线。有意思的是,视频中的每个人都穿着一套萌萌的抗静电服,看起来很有意思。

2.基准和性能度量

2.1基本基准

下边的表2展示的是不同的固态硬盘在顺序和随机工作负载下的读写速度。为了便于比较,这里包含了2008年到2013年发布的SSD、一个硬盘盒、和一个内存芯片

Samsung 64 GB

Intel X25-M

Samsung 840 EVO

Micron P420m

HDD

RAM

品牌 / 型号

Samsung(MCCDE64G5MPP-OVA)

Intel X25-M(SSDSA2MH080G1GC)

Samsung(SSD 840 EVO mSATA)

Micron P420m

Western Digital Black 7200 rpm

Corsair Vengeance DDR3

存储单元类型

MLC

MLC

TLC

MLC

*

*

上市年份

2008

2008

2013

2013

2013

2012

接口

SATA 2.0

SATA 2.0

SATA 3.0

PCIe 2.0

SATA 3.0

*

总容量

64 GB

80 GB

1 TB

1.4 TB

4 TB

4 x 4 GB

每块的页数

128

128

256

512

*

*

页大小

4 KB

4 KB

8 KB

16 KB

*

*

块大小

512 KB

512 KB

2048 KB

8196 KB

*

*

顺序读取 (MB/s)

100

254

540

3300

185

7233

顺序写入 (MB/s)

92

78

520

630

185

5872

4KB 随机读取(MB/s)

17

23.6

383

2292

0.54

5319 **

4KB 随机写入 (MB/s)

5.5

11.2

352

390

0.85

5729 **

4KB 随机读取(KIOPS)

4

6

98

587

0.14

105

4KB 随机写入 (KIOPS)

1.5

2.8

90

100

0.22

102

注意

* 存储设备不支持该指标

** 以2MB的块测量,而非 4 KB

指标

MB/s: MB每秒

KIOPS:千操作每秒,每秒1000输入/输出操作

引用

Samsung 64 GB[21]

Intel X25-M[2, 28]

Samsung SSD 840 EVO[22]

Micron P420M[27]

Western Digital Black 4 TB[25]

Corsair Vengeance DDR3 RAM[30]

表2: 固态硬盘与其他存储设备比较,特征和读写速度

影响性能的一个重要因素是接口。最新发布的SSD最常使用的接口是SATA3.0和PCI Express 3.0。使用SATA3.0接口时,数据传输速度可以达到6 Gbit/s,而在实际上大概能够达到550MB/s。而使用PCIe 3.0可以达到每条8 GT/s,而实际上能达到大概1 GB/s(GT/s是指G次传输(Gigatransfers)每秒)。使用PCIe 3.0接口的SSD都会使用不止一条通道。使用4条通道的话(译注:PCIe 3.0 x4),PCIe 3.0可以提供最大4 GB/s,的带宽,相当于SATA3.0的四倍一些企业级的SSD同样提供串行SCSI接口(SAS),最新版本的SAS可以提供最高12 GBit/s的速度,但是现在SAS的市场占有量很小。

大部分近期的的SSD的内部速度可以满足550 MB/s的SATA3.0限制,因此接口是其速度瓶颈。使用PCI Express 3.0或者SAS的SSD可以提供巨大的性能提升。

PCI Express 和SAS 比 SATA要快

生产商提供的两个主要接口是SATA3.0(550MB/s)和PCI Express 3.0 (每通道1 GB/s, 使用多个通道)。串行SCSI(SAS)同样应用在企业级SSD上。最新版本的接口定义中PCI Express 和SAS 比 SATA要快,但是同样要更贵。

2.2 预处理

如果你折磨数据足够久,它会招的 —— Ronald Coase

SSD生产商提供的数据资料充斥着令人惊讶的性能值。确实,通过各种乱七八糟的方法对数据处理足够长的时间,生产商似乎总能找到方法在商业传单上显摆那些闪亮的数字。这些数字是否真的有意义,或者能否真的反映产品系统的性能则是另外的问题。Marc Bevand在他关于常见SSD性能基准缺陷的文章中[66],提到了一些例子。例如常见的报道随机写负载的IOPS(每秒读写操作次数)而不提所跨的LBA(逻辑区块地址)的范围,很多IOPS的数据只是基于队列深度为1,而非整个硬盘最大值而测试的。同样也有很多基准性能测试工具误用的例子。

正确评估SSD的性能并非易事。硬件评测博客上的很多文章都是在硬盘上随机写十分钟,便声称硬盘可以进行测试,并且测试结果是可信的。然而SSD性能只会在足够长时间的随机写工作负载下才会有性能降低,而所需的时间基于SSD的总大小会花费30分钟到3小时不等。这即是更多认真的基准性能测试开始于相当长时间的随机写负载(称为“预处理”)的原因[50]。下方的图7来自StorageReview.com上的一篇文章[26],显示出在多个SSD上预处理的效果。可以看见在30分钟左右出现了明显的性能下降,所有硬盘都出现读写速度下降和延迟上升。之后的四个小时中,硬盘性能缓慢降低到一个最小的常量值。

图7:多个SSD上预处理的效果 — 感谢来自StorageReview.com[26]的图片

5.2节解释了图7中实际上发生的事情,随机写入的量太大并以这种持续的方式进行使得垃圾回收进程不能维持在后台。因为必须在写命令到达时擦除块,因此垃圾回收进程必须和来自主机的工作在前台的操作竞争。使用预处理的人声称基准测试可以代表硬盘在最坏的情况下的表现。这种方法在所有工作负载下是否都是好模型还是值得商榷。

为了比较不同制造商的各种产品,找到可以比较的共同点是必要的,而最坏的情况是一个有效的共同点。然而选择在最糟糕的工作负载下表现最好的硬盘并不能保证其在生产环境下所有的工作负载下都表现的最好。实际上大部分的生产环境下,SSD硬盘只会在唯一的一个系统下工作。因其内部特征,这个系统有一个特定的工作负载。因此比较不同硬盘的更好更精确的方法是在这些硬盘上运行完全相同的工作负载,然后比较他们表现的性能。 这就是为何,即使使用持续的随机写工作负载的预处理可以公平的比较不同SSD,但还是有一点需要注意,如果可以的话,运行一个内部的基于目标工作负载的基准测试。

内部基准测试同样可以通过避免使用“最好的”SSD来避免过度调配资源,譬如当一个比较便宜的SSD型号已经足够并且能够省下一大笔钱的时候。

基准测试很难

测试者是人,因此并不是所有的基准测试都是没有错的。在使用生产商或者第三方的基准测试的时候请小心,并且在相信这些数据之前参考多个消息源,孤证不立。如果可以的话,使用你系统的特定工作负载来进行你自己的内部基准测试。

2.3工作负载和指标

性能基准都有相同的指标,并使用相同的度量。在本节中,对于如何解释这些指标,我希望能够给出一些见解。

通常使用的参数如下:

  • 工作负载类型:可以是基于用户控制数据的指定性能基准,或者只是顺序或者随机访问的性能基准(例:仅随机写)

  • 读写百分比(例:30%读70%写)

  • 队列长度:在硬盘上运行命令的并发执行线程的数量

  • 访问的数据块大小(4 KB 8 KB等)

:基准测试的结果可能使用不同的度量指标。常用的如下:

  • 吞吐量:数据传输的速度,通常单位是KB/s或MB/s,表示千字节每秒和百万字节每秒。这个指标常用在顺序读写基准测试中。

  • IOPS:每秒读写操作的数量,每个操作都是相同大小的数据块(通常是4KB/S)。这个指标通常用在随机读写基准测试中。[17]

  • 延迟:在发送完命令后设备的反应时间,通常是μs或ms,表示微秒或者毫秒。

虽然吞吐量这个指标很容易理解和接受,但IOPS却比较难以领会。例如,如果一个硬盘在随机写上的表现是在4KB的数据块上是1000 IOPS,这即表示吞吐量是1000 x 4096 = 4 MB/s.。因此,IOPS高只有在数据块足够大的时候才可以被解释成吞吐量高,而IOPS高但平均数据块小的话只能代表一个低吞吐量。

为了阐明这个观点,不妨想象我们有一个登陆服务器,每分钟要对数千个不同的文件执行微量的更新,表现出10k IOPS的性能。因为这些更新分布在如此多的文件里,吞吐量能够接近20 MB/s,然而在同一个服务器中仅对同一个文件进行顺序写入能够将吞吐量提高到200 MB/s,这可是10倍的提升。例子中的数字是我编的,不过这些数据很接近我接触到的生产环境。

另一个需要掌握的概念是,高吞吐量并不足以表示这是一个快的系统。实际上,如果延迟很高,不管吞吐量有多么好,整个系统还是会慢。让我们拿一个假象的单线程进程为例,这个进程需要连接25个数据库,每个数据库都有20ms的延迟。因为连接的延迟是累积的,获取25个连接需要5 x 20 ms = 500 ms。因此,即便运行数据库查询的机器有很快的网卡,就当5 GBits/s的带宽吧,但这个脚本仍然因为延迟而会很慢。

本节的重点在于,着眼于全部的指标是很重要的,这些指标会显示出系统的不同特征,并且可以在瓶颈出现时识别出来。当在看SSD的基准测试并确定所选择的型号时,通常有一个很好的经验就是,别忘了这些待选的SSD中,哪个指标对于系统是最关键的。

对于这个主题有一个很有意思的扩展阅读:Jeremiah Peschka 写的一篇文章“IOPS是骗局”[46]。

下一部分

第三部分在这。你同样可以去内容目录来看看这一系列的文章。如果你时间很紧,你同样可以直接去总结了所有其他部分的内容的第六部分。

引用

[1]Understanding Intrinsic Characteristics and System Implications of Flash Memory based Solid State Drives, Chen et al., 2009

[2]Parameter-Aware I/O Management for Solid State Disks (SSDs), Kim et al., 2012

[3]Essential roles of exploiting internal parallelism of flash memory based solid state drives in high-speed data processing, Chen et al, 2011

[4]Exploring and Exploiting the Multilevel Parallelism Inside SSDs for Improved Performance and Endurance, Hu et al., 2013

[5]Design Tradeoffs for SSD Performance, Agrawal et al., 2008

[6]Design Patterns for Tunable and Efficient SSD-based Indexes, Anand et al., 2012

[7]BPLRU: A Buffer Management Scheme for Improving Random Writes in Flash Storage, Kim et al., 2008

[8]SFS: Random Write Considered Harmful in Solid State Drives, Min et al., 2012

[9]A Survey of Flash Translation Layer, Chung et al., 2009

[10]A Reconfigurable FTL (Flash Translation Layer) Architecture for NAND Flash-Based Applications, Park et al., 2008

[11]Reliably Erasing Data From Flash-Based Solid State Drives, Wei et al., 2011

[12]http://en.wikipedia.org/wiki/Solid-state_drive

[13]http://en.wikipedia.org/wiki/Write_amplification

[14]http://en.wikipedia.org/wiki/Flash_memory

[15]http://en.wikipedia.org/wiki/Serial_ATA

[16]http://en.wikipedia.org/wiki/Trim_(computing)

[17]http://en.wikipedia.org/wiki/IOPS

[18]http://en.wikipedia.org/wiki/Hard_disk_drive

[19]http://en.wikipedia.org/wiki/Hard_disk_drive_performance_characteristics

[20]http://centon.com/flash-products/chiptype

[21]http://www.thessdreview.com/our-reviews/samsung-64gb-mlc-ssd/

[22]http://www.anandtech.com/show/7594/samsung-ssd-840-evo-msata-120gb-250gb-500gb-1tb-review

[23]http://www.anandtech.com/show/6337/samsung-ssd-840-250gb-review/2

[24]http://www.storagereview.com/ssd_vs_hdd

[25]http://www.storagereview.com/wd_black_4tb_desktop_hard_drive_review_wd4003fzex

[26]http://www.storagereview.com/samsung_ssd_840_pro_review

[27]http://www.storagereview.com/micron_p420m_enterprise_pcie_ssd_review

[28]http://www.storagereview.com/intel_x25-m_ssd_review

[29]http://www.storagereview.com/seagate_momentus_xt_750gb_review

[30]http://www.storagereview.com/corsair_vengeance_ddr3_ram_disk_review

[31]http://arstechnica.com/information-technology/2012/06/inside-the-ssd-revolution-how-solid-state-disks-really-work/

[32]http://www.anandtech.com/show/2738

[33]http://www.anandtech.com/show/2829

[34]http://www.anandtech.com/show/6489

[35]http://lwn.net/Articles/353411/

[36]http://us.hardware.info/reviews/4178/10/hardwareinfo-tests-lifespan-of-samsung-ssd-840-250gb-tlc-ssd-updated-with-final-conclusion-final-update-20-6-2013

[37]http://www.anandtech.com/show/6489/playing-with-op

[38]http://www.ssdperformanceblog.com/2011/06/intel-320-ssd-random-write-performance/

[39]http://en.wikipedia.org/wiki/Native_Command_Queuing

[40]http://superuser.com/questions/228657/which-linux-filesystem-works-best-with-ssd/

[41]http://blog.superuser.com/2011/05/10/maximizing-the-lifetime-of-your-ssd/

[42]http://serverfault.com/questions/356534/ssd-erase-block-size-lvm-pv-on-raw-device-alignment

[43]http://rethinkdb.com/blog/page-alignment-on-ssds/

[44]http://rethinkdb.com/blog/more-on-alignment-ext2-and-partitioning-on-ssds/

[45]http://rickardnobel.se/storage-performance-iops-latency-throughput/

[46]http://www.brentozar.com/archive/2013/09/iops-are-a-scam/

[47]http://www.acunu.com/2/post/2011/08/why-theory-fails-for-ssds.html

[48]http://security.stackexchange.com/questions/12503/can-wiped-ssd-data-be-recovered

[49]http://security.stackexchange.com/questions/5662/is-it-enough-to-only-wipe-a-flash-drive-once

[50]http://searchsolidstatestorage.techtarget.com/feature/The-truth-about-SSD-performance-benchmarks

[51]http://www.theregister.co.uk/2012/12/03/macronix_thermal_annealing_extends_life_of_flash_memory/

[52]http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html

[53]http://blog.nuclex-games.com/2009/12/aligning-an-ssd-on-linux/

[54]http://www.linux-mag.com/id/8397/

[55]http://tytso.livejournal.com/2009/02/20/

[56]https://wiki.debian.org/SSDOptimization

[57]http://wiki.gentoo.org/wiki/SSD

[58]https://wiki.archlinux.org/index.php/Solid_State_Drives

[59]https://www.kernel.org/doc/Documentation/block/cfq-iosched.txt

[60]http://www.danielscottlawrence.com/blog/should_i_change_my_disk_scheduler_to_use_NOOP.html

[61]http://www.phoronix.com/scan.php?page=article&item=linux_iosched_2012

[62]http://www.velobit.com/storage-performance-blog/bid/126135/Effects-Of-Linux-IO-Scheduler-On-SSD-Performance

[63]http://www.axpad.com/blog/301

[64]http://en.wikipedia.org/wiki/List_of_solid-state_drive_manufacturers

[65]http://en.wikipedia.org/wiki/List_of_flash_memory_controller_manufacturers

[66]http://blog.zorinaq.com/?e=29

[67]http://www.gamersnexus.net/guides/956-how-ssds-are-made

[68]http://www.gamersnexus.net/guides/1148-how-ram-and-ssds-are-made-smt-lines

[69]http://www.tweaktown.com/articles/4655/kingston_factory_tour_making_of_an_ssd_from_start_to_finish/index.html

[70]http://www.youtube.com/watch?v=DvA9koAMXR8

[71]http://www.youtube.com/watch?v=3s7KG6QwUeQ

[72]Understanding the Robustness of SSDs under Power Fault, Zheng et al., 2013—[discussion on HN]

[73]http://lkcl.net/reports/ssd_analysis.html—[discussion on HN]

原文出处:

https://blog.csdn.net/cugbabybear/article/details/23265253

[深入理解SSD 为SSD编程] SSD的架构和基准相关推荐

  1. 固态硬盘SSD学习笔记:SSD综述

    一. SSD VS HDD SSD(Solid State Device):闪存介质+主控 HDD(Hard Disk Drive):马达+磁头+磁盘 方式 数据存储介质 读取写入 HDD 机械 磁盘 ...

  2. 在线ssd测试软件,AS SSD Benchmark测试

    AS SSD Benchmark测试 ● AS SSD Benchmark AS SSD是基于全方位性能的测试软件,它使用了非常深度的Queue Depth(QD)队列深度,以及非压缩测试. • AS ...

  3. 你知道企业级SSD与消费级SSD的区别吗?

    [引语] 前两天,一位从事大数据工作的好朋友问我: "企业级SSD与消费级SSD的区别是什么?" "大数据中心能否采用消费级SSD?" 我想,大部分朋友应该都知 ...

  4. mysql ssd优化_针对 SSD 的 MySQL IO 优化

    现在数据库标配基本都是SSD了,在使用SSD之前,对SSD进行了充分的测试,这其中当然包括最为关键的性能测试部分.下面就跟大家分享一下在SSD性能测试过程中遇到的一个问题和解决问题的思路. 我们的性能 ...

  5. 我所理解的 iOS 并发编程

    作者:bool周 原文链接:我所理解的 iOS 并发编程 无论在哪个平台,并发编程都是一个让人头疼的问题.庆幸的是,相对于服务端,客户端的并发编程简单了许多.这篇文章主要讲述一些基于 iOS 平台的一 ...

  6. BP神经网络理解原理——用Python编程实现识别手写数字(翻译英文文献)

    BP神经网络理解原理--用Python编程实现识别手写数字   备注,这里可以用这个方法在csdn中编辑公式: https://www.zybuluo.com/codeep/note/163962 一 ...

  7. 从你家的衣柜,理解软件编程的「架构」

    从你家的衣柜,理解软件编程的「架构」 2017-05-09 陈小霖Kelly 51CTO博客 作者:陈小霖Kelly 来源:商学院毕业的程序员 可阅读原文 事情是这样的,一个读商科的好基友是金融公司的 ...

  8. 秋读|10本热门图书(人工智能、编程开发、架构、区块链等)免费送!

    古人说:"秋读书,玉露凉,钻科研,学文章." 时下,秋意渐浓, 网易云社区联合博文视点为大家送来一大波技术图书,涉及人工智能.编程开发.架构.软件工程.区块链技术五大版块. 知乎活 ...

  9. 轻松掌握FFmpeg编程:从架构到实践

    轻松掌握FFmpeg编程:从架构到实践 (Master FFmpeg Programming with Ease: From Architecture to Practice 引言 (Introduc ...

  10. 我对架构师的理解(如何成为一个合格的架构师)

    我对架构师的理解(如何成为一个合格的架构师) 引子: 在讨论架构之前,我们先上道菜,青椒土豆肉丝,这道小菜味道还是不错的,自私点了,不考虑您是否喜欢,今天就上它了. 准备原材料:食用油.青椒.土豆.肉 ...

最新文章

  1. html事件绑定的方法,javascript实现简单的on事件绑定
  2. 3、Python 基础类型 -- List 列表类型
  3. 每天一道LeetCode-----将数字集转成字母集,计算有多少种转换方式
  4. 科学家研究:生女有撇步 多钙少碰香蕉
  5. kafka Failed to send producer
  6. 95-31-020-ChannelGroup-DefaultChannelGroup
  7. 服务器和数据库基本知识
  8. But Wang Xing, who is concerned about long-term
  9. python控制excel选择区域_python操作excel常用的方法
  10. HDU2026 首字母变大写【文本处理】
  11. Matlab中的各种运算符的用法
  12. linux informix数据库下载,informix数据库基础下载_informix数据库基础官方下载-太平洋下载中心...
  13. php版ueditor配置_ThinkPHP配置UEditor
  14. 超好用的卸载工具——geek(免安装)
  15. python内turtle库应用
  16. u盘文件变成快捷方式怎么恢复,恢复U盘文件的五种方法
  17. 如何解决:error: failed to push some refs to
  18. Qt5 多国语言设置
  19. 2017年GitHub中最为流行的30个开源机器学习项目
  20. Tensorflow入门到实战五(卷积神经网络)

热门文章

  1. quark h5 学习
  2. C语言编程:求水仙花数。输入一个正整数n,计算n位水仙花数。
  3. 基于android的个人健康身体检测测试软件app
  4. Android面试总结(持续更新修改)
  5. linux部署qq机器人记录
  6. SFC游戏<战区88>,买100W战斗机的测试
  7. Html--判断客户端类型
  8. 网站图标开发指南(精)
  9. 在鹅厂工作的广西表妹教我用Python生成会跳舞的美女~
  10. perl use和require的用法