之前一直以为固态硬盘各方面都比机械硬盘性能高,所以首选固态硬盘,直到看了极客时间-深入浅出计算机组成原理中硬盘相关章节的内容,才发现固态硬盘原来是有缺点的,所以这里来做一个总结。
机械硬盘由以下几个部分组成:
盘面:盘面(盘片)上有一层磁性涂层,数据就是存储在这个磁性的涂层上,一个盘面在正反两面都有磁性涂层。盘面中央有一个可以旋转的主轴,主轴可以使盘片以固定的旋转速率进行旋转,我们看到磁盘标注的每分钟多少转(RPM , Revolution Per Minute)指的就是这个旋转速率,比如7200转,表示一分钟可以旋转7200下:

(注:图片来自极客时间-深入浅出计算机组成原理)
一个盘面又可以划为多个扇区和多个磁道。
磁道:一个盘片可以划分为多个同心圆,每一个圆环就叫做磁道,可以理解为是盘片上的圆形环道:

扇区:每个磁道又可以分为一个个扇区,也就是磁道上的一个弧段:

柱面:上下平行的一个个盘面的相同扇区组成的部分,称作一个柱面。

(注:图片来自极客时间-深入浅出计算机组成原理)
磁头:用于从盘面读取数据传输到总线,一个盘面有正反两面,正反两面都会有一个磁头。
传动臂(悬臂):与磁头相连接,通过沿着半径轴前后移动传动臂,可以将磁头定位到每一个磁道上,读取存储的数据。
磁盘是由一个或者多个平行叠放在一起的盘片组成的,将它们封装在一个密封的包装内,整个装置称为磁盘驱动器,也就是我们常说的磁盘。
磁盘以扇区为大小进行数据读写,数据读写的耗时主要有以下几部分:
从数据读取步骤当中可以看出,如果我们将数据进行顺序存放,尽可能将数据放在同一个扇区或者是一个柱面,这样只需旋转一次盘面,进行一次寻道,即可读取出内容,这也是顺序读写比随机读写性能高的原因。
固态硬盘是一种基于闪存的存储技术,由半导体存储器构成,没有移动的部件,不需要像机械硬盘一样进行寻道,所以在顺序写以及随机写的性能上相比机械硬盘都要高,但是它的耐用性缺比较差,接下来就看下SSD硬盘的耐用性为何差。
固态硬盘是有多个裸片叠在一起的:

(注:图片来自极客时间-深入浅出计算机组成原理)
一张裸片上可以放多个平面(Plane),一个平面上又会划分为多个块(Block),一个块的大小通常在几百KB到几MB,一个块里会划分为多个页(Page),一个页的大小通常是4KB:

(注:图片来自极客时间-深入浅出计算机组成原理)
SSD硬盘写入的基本单位为页,按页进行数据写入,但是它不能像机械硬盘一样直接通过覆盖进行写入,如果某一页已经写入过数据,需要被擦除后才可以重新写入数据,而且SSD硬盘是按块进行擦除的,也就是说如果某个页的数据被删掉还不能直接对页进行擦除,需要等待这个页所在的块整个被擦除才可以重新写入数据,而每一个块的擦除次数是有限的,当达到一定的擦除次数容易损坏。
举个例子
假设白色代表这个页未写入过数据,绿色代表这个页写入了有效数据,红色代表之前写入了有效数据后来数据被删除:
首先在某些空白页内写入了一些数据,写入数据的页变为绿色:

删除一部分数据,由于SSD需要按块擦除,所以某个块内的页如果既有有效数据又有删除数据,被删除的那部分数据会先标记为删除状态此时数据并未真正删除:

当某个块内的所有页都被标记为已删除,此时这个块就可以被擦除,这个块内的页就恢复成了白色:

假如删除的数据不连续,分散在各个块内,由于红色的页在被擦除之前不能写入数据,所以这些红色的页看起来类似磁盘碎片,既不能清理又不能写入数据,到达一定程度时可能没有合适的空白页进行数据写入,所以这时候需要做一次类似于磁盘碎片整理的工作,找一个红色页最多的块,将里面绿色页的数据移动到另外一个块中,然后将整个红色页所在的块进行擦除:

总结
机械硬盘可能更适合于写多(顺序写)读少的场景,固态硬盘更适合于读多写少的场景,不过也不能一概而论,最终还是要根据实际的应用场景来定。
参考
《深入理解计算机系统》
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
EC2会在实例停止然后重新启动时为其提供新的IP地址,因此我需要能够自动管理route53记录集,以便我可以一致地访问内容。遗憾的是,sdk的route53部分的文档远不如ec2的文档那么健壮(可以理解),所以我有点卡住了。到目前为止,从我所看到的情况来看,似乎change_resource_record_sets(link)是可行的方法,但我对:chages需要什么感到困惑>因为它提到了一个Change对象,但没有提供指向所述对象描述的链接。这是我的代码目前的样子:r53.client.change_resource_record_sets(:hosted_zone_id=>'MY_
Asitcurrentlystands,thisquestionisnotagoodfitforourQ&Aformat.Weexpectanswerstobesupportedbyfacts,references,orexpertise,butthisquestionwilllikelysolicitdebate,arguments,polling,orextendeddiscussion.Ifyoufeelthatthisquestioncanbeimprovedandpossiblyreopened,visitthehelpcenter提供指导。11年前关闭。我是一位精通HTML
我们正在开发一个需要推送通知的WP8应用程序。为了测试它,我们使用CURL命令行运行推送通知POST请求,确保它实际连接,使用客户端SSL证书进行身份验证并发送正确的数据。我们确实知道,当我们收到对设备的推送时,这项工作是有效的。这是我们一直用于测试目的的CURL命令:curl--certclient_cert.pem-v-H"Content-Type:text/xml"-H"X-WindowsPhone-Target:Toast"-H"X-NotificationClass:2"-XPOST-d"MytitleMysubtitle"https://db3.notify.live.ne
我有一个适用于Rails中的Mongoid对象的作用域,它在开发时效果很好,但在运行测试时效果不佳。它实际上在测试中根本不起作用。这是一个嵌入式文档。父级:classPersonincludeMongoid::Documentdefself.with_appointmentswhere(:appointments.not=>{'$size'=>0})endembeds_many:appointments,store_as:'Appointments',class_name:'Appointment'end嵌入的child:classAppointmentincludeMongoid::
一些我找到的选项是ActiveCouchCouchRESTCouchPotatoRelaxDBcouch_foo我更喜欢GitHub上的项目,因为这让我更容易fork和推送修复。所有这些都符合该要求。我习惯了Rails,所以我喜欢像ActiveRecord模型一样工作的东西。另一方面,我也不希望我和Couch之间太多--毕竟我使用它作为我的数据库是有原因的。最后,它们似乎都得到了相当积极的维护(couch_foo可能是个异常(exception))。所以我想这归结为(不可否认和不幸的)主观:有没有人对他们有过好的或坏的经历? 最佳答案
根据YAML文档,可以传递hashofoptions到.to_yaml方法。目前,当我按照文档中的建议传递选项时,它不起作用,哈希被忽略。irb(main):001:0>require'yaml'=>trueirb(main):002:0>user={"1"=>{"name"=>"john","age"=>44}}user.to_yaml=>"---\n\"1\":\nname:john\nage:44\n"现在,传递一些选项:irb(main):014:0>user.to_yaml(:Indent=>4,:UseHeader=>true,:UseVersion=>true)=>"--
这段代码:deffunc*;end[func"hello"]在Ruby1.8.7中解析没有错误,但返回语法错误:syntaxerror,unexpected']',expecting'}'在Ruby中>=1.9。我浏览了WhatisthedifferencebetweenRuby1.8andRuby1.9,但找不到对此的引用。有谁知道是什么变化导致了这种情况? 最佳答案 这是为了避免歧义。请考虑以下事项:deffoo(a,b=1)#footakesanoptionalsecondargumentend[foo1,2]这可以解释为[(
我正在使用Ruby的正则表达式引擎。我需要编写一个执行此操作的正则表达式WIKI_WORD=/\b([a-z][\w_]+\.)?[A-Z][a-z]+[A-Z]\w*\b/但也可以使用除英语以外的其他欧洲语言。我认为字符范围[a-z]不会涵盖德语等的小写字母。 最佳答案 WIKI_WORD=/\b(\p{Ll}\w+\.)?\p{Lu}\p{Ll}+\p{Lu}\w*\b/u应该在Ruby1.9中工作。\p{Lu}和\p{Ll}是大写和小写Unicode字母的简写。(\w已经包含下划线)另见thisanswer-您可能需要在UTF