04 2013 档案
摘要:QA同学反映,对TFS进行压力测试时,网卡一直压不上去,看了下他们的测试环境,发现在测试时客户端的日志都是往屏幕打印的,将日志重定向到文件,压力马上上去了。日志打印到屏幕其实是个非常耗时的事情,打印到屏幕会影响到客户端的请求并发;这个问题解决了,QA同学又反映另一个奇怪的现象。如下图所示,client1和client2的请求分别被定向到server1和server2。 (4台独立的物理机)单个客户端case1:只启动client1,client1不打印日志,server1的网卡能跑到110M/S左右(千兆网卡,接近满)case2:只启动client1,client1打印日志,server1的网
阅读全文
摘要:使用gdb调试时,有的函数只在某些路径上会执行到,而触发这些路径执行的条件构造起来比较麻烦,比如某个server在接收到READ请求时,会调用do_read进行响应,这时如果我们想调试do_read函数,就必须在客户端构造一个READ请求来触发。
int do_read(const ReadRequest& req); 假设我们知道do_read调用时参数ReadRequest的具体内容,能否直...
阅读全文
摘要:block标识
TFS每个block有一个唯一标识,目前的实现是一个uint32_t的整数id,每次新增一个block,就会为其分配新的id,具体实现方式是保存一个全局global_block_id的值,每次分配时就直接将这个值加1做为新的blockid;代码实现大致如下,每次需要分配时就调用generate函数。
class BlockIdFactory {
public: uint32_...
阅读全文
摘要:去年写过一篇tbnet的分析文章,主要介绍tbnet(获取源代码)框架结构及基本使用方法,最近又重读了下源码,有一些新的收获。
连接是核心
tbnet框架围绕网络连接(对应Connection类)展开,Connection主要包含如下成员。
class Connection { bool _isServer; ...
阅读全文
摘要:近半年在做分布式系统开发的同时,也做了不少的测试工作,软件工程教科书上描述软件项目的流程,基本上都会提到单元测试、集成测试、压力测试等名词,但对这些词汇一直停留在理论认识阶段。研究生阶段做的项目,因为要求不高,基本上也没做什么测试工作;去年在实习的时候,因为时间有限,主要接触单元测试和系统功能测试;直到现在才把这些词汇都近距离的感受了一下。
单元测试
分布式系统的开发工作通常会被划分成多个模块,由...
阅读全文
摘要:最近写博客的频度远不如以前,主要是想要求自己尽量保证每篇博文的质量,每次想写博客的时候,就发现想写的内容很简单(浅薄),根本不值一写,于是就搁置了。平时关注互联网的内容也比较多,没有明确的主题,单独写出一篇博客的确不值,所以就准备把零散的想法组织到一起记录下来,今天就先从微信公众平台说起。
微信公众平台
微信刚火起来那会,大家都用微信发语音短信,那会我没有智能手机,只能在一边羡慕嫉妒恨,当时对微信...
阅读全文
摘要:使用wordpress一年多了,各种折腾,虽离预期有距离,但目前简洁的主题加上一些常用的插件,已经基本满足我的要求,今天将我使用的一些插件介绍给大家,并分享一些使用经验。
封杀广告评论
akismet,这个必须有,不然每天会有一大堆的评论出现在你的文章里,按理说文章评论多应该是好事呀,但可惜这些都是垃圾评论,里面大都是一堆广告链接,如果任由这些广告评论猖獗下去,你的博客就会变得“你自己都看不下去了...
阅读全文
摘要:Blobstore是twitter的图片存储系统,主要参考twitter员工博客及其译文,译文基本是按照字面进行翻译,部分地方理解有些问题,比如文中提到的“每秒上千万张吞吐量的图片请求”,而英文原文是hundreds of thousands of,翻译为上千万显然是很误导读者的;本文主要谈谈我对blobstore的理解,如有问题请指出。
相比facebook的haystack、以及taobao的...
阅读全文
摘要:春节回家,发现网络这个词被提起的频率越来越高了,年前就准备写一篇农村与互联网相关的博文,但由于家里没有网络,一直拖到今天上班,刚在微博上看到腾讯科技的特别策划对话另一个世界-三四线地区人群互联网真实状态调查。看了几篇文章,发现腾讯的工作人员做了很多工作,深入三四线地区进行实地采访,非常有意义的策划活动,让更多的人了解到“他们的世界”。
基本现状
他们的世界跟我了解到的差不多,在我的家乡(典型的贫困...
阅读全文
摘要:HTTP推荐阅读资料 HTTP权威指南:详细介绍HTTP协议相关的细节,非常值得一读。
HTTP wiki:维基百科你懂的,该页面还提供了很多相关链接扩展阅读。
HTTP协议详解:快速了解HTTP协议基本知识。
理解HTTP协议:内容同上,但讲解更加详细具体。
HTTP cookie:全面解读HTTP cookie
HTTP协议之代理:解析HTTP与代理,很多配图,挺生动。
CGI/FAST C...
阅读全文
摘要:昨天下午线上辅集群加机器扩容,扩容的机器在运行一段时间后线上有block lost的告警,从Nameserver(NS)的日志上发现,扩容的新机器上有多次加入集群和退出集群的记录,最初我怀疑是扩容后,集群做容量负载均衡,大量数据往新加入的节点迁移,导致新机器负载高,从而出现心跳信息没有及时到达NS的情况,此时NS认为Dataserver(DS)宕机,如果有一个block的多个副本都被迁入到新扩容的...
阅读全文
摘要:12月03日03:50左右,有多台Dataserver(DS)内存占用飙升,如10.246.70.71 dataserver 3,常驻内存突然飙升到21G,并且一直没有释放。查看dataserver的日志,发现大量的read v2失败 ,返回值主要是-8025(block不存在), -8016(文件被删除或隐藏)。但这些失败信息从0点开始一直很多,而且这两种失败不会导致DS分配很多内存,所以应该跟内存问题没关系。在3:50左右5分钟内,发现readv2 success的日志很多,主要集中在3:48,3:49,3:50这3分钟内,3分钟的readv2请求超过4w,平均每秒200+,每个文件请求都
阅读全文
摘要:linux socket使用16bit无符号整型表示端口号,最大到65535。关于端口号,有一个经典的误解就是,因为端口号有限,所以一个客户端最多建立65536个socket连接,但实际上并不是这么回事,端口是可以复用的。 一个socket连接是一个[srcip, srcport, destip, destport]组成的四元组,如果再算上协议(tcp、udp、rawsocket等)就是五...
阅读全文
摘要:google开源的gflags是一套命令行参数解析工具,比getopt功能更强大,使用起来更加方便,gflags还支持从环境变量、配置文件读取参数(可用gflags代替配置文件)。本文简单介绍gflags的使用,内容主要译自 http://gflags.googlecode.com/svn/trunk/doc/gflags.html 。 定义参数 使用flags需要包含头文件 #i...
阅读全文
摘要:2012年,结束了长达19年的校园生活长跑,走上了工作岗位,开始人生一个新的起点。我的工作其实跟在实验室差不多,依然是分布式存储领域,公司简单的同事关系就跟在学校同学一般纯真,每天上班依旧是一辆破自行车,甚至连距离都跟宿舍去实验室差不多,还有在学校的同学雷雷、小鳄、宝仔在同一个组工作。 新人学习 入职后加入TFS(Taobao File System)项目组...
阅读全文
摘要:SNIA的云存储标准(Cloud Data Mamangement Interface,CDMI)出来有一段时间了,目前云存储战场竞争激烈,标准的到来给云存储服务提供了指导作用,期待未来有美好的一天,所有的云存储提供商都遵循这个标准,让标准真正的发挥作用,让互联网用户受益。 理想很丰满,现实很骨感,制定标准跟标准落地还有很长的一段距离,标准的合理性首先需要得到检验并不断的改善,而...
阅读全文
摘要:WeiboFS是基于新浪微博的文件系统,它将新浪微博虚拟成一个linux本地文件系统,用户像使用文件系统一样来看微博,发微博。
WeiboFS的开发需要用到FUSE, fusepy, sinatpy2.x FUSE是指用户空间文件系统,通过FUSE,开发人员通过实现一组用户空间的接口即可实现一个文件系统。 fusepy是FUSE的python-binding工具,通过fusepy,开发人员可以...
阅读全文
摘要:马上要做毕业论文的测试,需要自己写测试程序、生成数据、作图,最简单的方式莫过于使用excel根据数据生成图标,这就需要在linux下通过C/C++写excel文件,使其能被ms excel打开,本文总结了三种方式。 普通文本,以\t分隔列 建立文本文件如下,在同一行的数据以tab(\t)进行分隔,使用excel打开。 a b c d e f a b c d e f
...
阅读全文
摘要:学习篇 1.科研方面基本没接触新的内容,仍然把学习重点定在分布式技术及应用方面。把经典的几篇论文(GFS、Bigtable、Dynamo、Zookeeper …)重新研读了几次,结合网上技术博客的分析,对分布式系统的理解稍稍有些加深。 2.项目方面根据Spyglass和Meggllan两篇论文的思路,实现了一个元数据检索系统原型,后将其扩展并作为我毕业论文的课题。 3.持续关注Nosql方面...
阅读全文
摘要:本地文件系统如ext3,reiserfs等(这里不讨论基于内存的文件系统),它们管理本地的磁盘存储资源、提供文件到存储位置的映射,并抽象出一套文件访问接口供用户使用。但随着互联网企业的高速发展,这些企业对数据存储的要求越来越高,而且模式各异,如淘宝主站的大量商品图片,其特点是文件较小,但数量巨大;而类似于youtube,优酷这样的视频服务网站,其后台存储着大量的视频文件,尺寸大多在数十兆到数吉...
阅读全文
摘要:最近几天在做一个集群间数据迁移的任务,要做的事很简单,就是给定一个任务文件,文件中每一行对应一个source:dest形式的迁移任务(source和dest均为文件名),任务数在千万级别。要做的事情其实很简单,读取每一行,解析出source和dest,并根据给定的集群信息从源集群读取source,并写到目标集群的dest。经历了写程序、执行任务、分析日志、改程序、再执行子任务...等多次折磨之后,...
阅读全文
摘要:TBNET是淘宝的开源异步网络框架,源码见:http://code.taobao.org/p/tb-common-utils/src/trunk/tbnet/ TBNET主要类之间的联系如下,其中框架的使用者需要关注红色部分的类或接口。 关于每个类接口介绍,请参考@淘宝立德 总结的文档:http://vdisk.weibo.com/s/1UzQB/1326963540 ...
阅读全文
摘要:TFS客户端是用户访问TFS的入口,目前TFS已支持C/C++、java、php、python等语言的客户端,本文主要分析C++客户端的实现逻辑。
TfsClient类是提供给tfs客户的原生C++接口类,其依赖TfsClientImpl代理负责具体实现,另外,在TfsClient上又封装了一套C客户端接口。
TfsSession类负责处理与nameserver相关的工作,包括获取block信息,...
阅读全文
摘要:TFS主要用于小文件存储,其将多个小文件存储在大的block中,并为这些小文件建立in-block索引,优化了文件的存储空间和寻址过程。TFS为了保证用户数据的安全性,为每个block在不同的数据服务器(dataserver,ds)上创建多个副本,另外,TFS还支持多集群数据同步。 TFS提供给用户使用的基本接口类似于vfs提供的文件系统,主要包括open、read/write、close、ls...
阅读全文
摘要:TFS数据服务器(DS)通过在物理块的头部存放一个BlockPrefix结构来记录逻辑块与物理块的对应关系,在DS时,会读取每一个已经使用的block,并读取block头部的信息,汇报给NS,NS通过这些信息建立逻辑块到DS的映射关系。最初,TFS使用300G的小盘,按照每个主块64M,每个扩展块2M计算,物理块的总数接近1500个,即使这些块全部使用全部使用了(正常状态下扩展块的利用率不会太高)...
阅读全文
摘要:当你的系统发布时,你需要告诉用户如何去使用,通常你会写一份示例代码放在文档中,让用户能通过这个例子快速知道该如何使用,这个实例代码对用户会有多大影响呢? TFS是淘宝的分布式文件系统,主要用于小对象的存储(如图片、交易快照等),在TFS的开源wiki上,也有一个简单的实例。具体的说,TFS客户端提供了基本的open、read、write、close接口,用户在读写前,需要先根据对应的模式open...
阅读全文
摘要:TFS没有采用目前流行的3副本策略,而是使用集群内配置2个副本,并把数据同步到一个辅集群,辅集群同样配置2个副本;这种方式对于实现异地机房容灾很方便,辅集群的数据同步是由主集群的数据服务器在后台发起的;目前主集群可读写,辅集群只读,双集群同时读写功能已开发完成,但没有在线上使用。 由于数据同步到辅集群是异步操作,当某次读文件的操作落到辅集群上时,可能该文件的同步尚未完成,此时在辅集群上读不到数据...
阅读全文
摘要:集群数据对比功能的添加对TFS DS做了修改,在把DS上到日常测试环境前对其进行了一次回归测试,测试用例都通过,但checkserver检查到有大量block未同步到辅集群,查看dataserver的日志发现同步队列已经阻塞住了,一直重复retry。 主备集群的数据同步是由主集群的DS在后台进行,其将成功的写、删等操作记录在本地日志,并启动后台线程将日志重放到备集群,DS没重放一条日志,如果失败...
阅读全文
摘要:在早期,应用要使用TFS,需要知道TFS名字服务器的地址才能访问TFS,然后调用读写接口存取文件,当应用比较少时,这种方式不会引发什么问题,但目前在淘宝内部,有200多个应用使用TFS做为后端的存储系统,必须要对应用的存储资源进行统一的管理与运维。 TFS做为一个应用存储平台,缺乏统一管理至少存在如下问题: 多集群管理:多集群访问控制、切换、容灾等。 访问控制:应用只要...
阅读全文
摘要:TFS目前使用扩展块来解决文件写、更新问题。扩展块的数量由磁盘可用空间、主块大小、扩展块大小、Dataserver(DS)配置项block_ratio决定。TFS主块和扩展块的数量在文件系统格式化的时候就已经确定,并且预先分配了所有块的存储空间。DS周期性的汇报存储空间使用率给Namserver,DS根据主块和扩展块使用率中的较大值做为DS储存空间的使用率。 扩展块使用率引发的问题 ...
阅读全文
摘要:TFS数据服务器的block是在DS第一次启动前格式化的,所有block的空间是预先分配好的,而物理块对应的index文件,则是block被分配使用时创建的。Index文件的大小是根据block中文件数目增加而增长的,为了提高性能,将整个index文件都mmap到内存直接访问。 在初次mmap index文件时,会计算block中预期的文件数,计算出index文件的理论大小index_s...
阅读全文
摘要:上周末ADC,@明俨 主持TFS开源主题的讨论,居然有TFS外部用户到现场咨询使用过程中的问题,感觉这些小公司维护大系统挺不容易的,尤其是在对内部实现不清楚的情况下。期间有人分享自己公司的做法,存文件的时候,存到多个server上,然后把文件跟server的对应关系记录到文档(不能丢,方便查找),当出现异常时,人工介入拷贝文件以增加文件副本数,然后更新文件跟server的对应关系;做法看起来很土,...
阅读全文
摘要:Jerasure库提供Reed-Solomon和Cauchy Reed-Solomon两种编码算法的实现. Reed-Solomon编解码接口 1. 编码矩阵生成 // generate matrix, last m rows matrix = talloc(int, m*k); for (i = 0; i < m; i++) { for (j = 0; j < k...
阅读全文
摘要:英文原文:http://www.theserverside.com/tip/A-return-to-Good-Code 中文译文:http://www.aqee.net/a-return-to-good-code/ 文章作者认为,函数应该是单出口的,即只在结束时return;读书期间,我写代码的风格是多return的,使代码尽量简短。在百度和淘宝工作期间,我们的代码规范都是要求函数单出口,刚开始写...
阅读全文
摘要:系统架构师大会分享 View more presentations or Upload your own. 管理员在2009年8月13日编辑了该文章文章。 --> -->
阅读全文
摘要:配置参数 在工程实践中,我们通常把一些需要测量才能确定最佳取值的参数以可配置的形式处理,但实际上大部分的参数可能只是一个可行值,而不是一个最佳值。 1. DS与NS之间的心跳间隔设置:NS通过心跳来确定DS的状态,心跳间隔太短,NS容易出现误判,有时短暂的网络断开也会被NS认定为DS宕机;而心跳间隔过长,NS就不能及时发现宕机的DS,导致的问题是,NS复制丢失block的时间点会被延迟,影响系...
阅读全文
摘要:昨日线上一台机器上的nginx rt飙高,@明俨 调查发现这台机器上的metaserver内存占用很高,同时还有个奇怪的现象,df发现/home的空间占用在增长飞快,但metaserver和nginx的日志文件增长都很慢,通过du -sh /home统计home下文件的总大小,发现跟df命令/home占用的空间小10+g,到底谁占用了我的磁盘空间? 后来把nginx进程都停掉后(当时应该先通过ls...
阅读全文
摘要:core文件对问题查找非常有帮助,大部分时候我们能根据core文件直接定位到问题,但当出现内存乱掉的情况时,core的backtrace可能也不能指出问题源头。最近线上问题较多,针对dataserver出现的问题做个总结:1. 如果在read/write时coredump,则多是因为磁盘故障(或是文件系统崩溃),IO的一些严重问题可通过dmesg查看,如果出现Medium Error,EXT4-fs error(device sdx), Device offlined, I/O error, rejecting I/O to dead device之类的关键字,就说明磁盘已经出问题了,如果是文
阅读全文
摘要:分布式文件系统主要用于解决海量数据存储的问题,如Goolge、Facebook等大型互联网企业都使用分布式文件系统作为数据存储的基础设施,并在其上构建很多服务,分布式文件系统通常采用三副本的策略来保证数据的可靠性,但随着应用数据量的不断膨胀,三副本策略为可靠性牺牲的存储空间也越来越大,如何在不降低数据可靠性的基础上,进一步降低存储空间成本? Facebook将erasure code应用到内部HDFS集群中,该方案使用erasure code代替传统的三副本策略,在保持集群可用性不变的情况下,节省了数PB的存储空间,Facebook的实现方案(HDFS RAID)目前已贡献给开源社区。Eras
阅读全文
摘要:Nameserver(NS)是TFS的总控节,NS的主要职责包括为写分配block、为读查找block、管理block与dataserver对应关系、管理dataserver、备NS状态,执行后台复制、均衡、压缩任务,以保证整个集群良好的工作。Block分配NS接收到客户端的写请求,会分配一个可写的block,如果没有可写block,则会创建一个新的block,每个block由一个id标识(uint32_t,后续会将该值提升至uint64_t),blockid不能重复,且不复用,新创建的block,在当前id的基础上递增,产生新的blockid。为了保证产生不重复的blockid,必须将blo
阅读全文
摘要:写了一个测试磁盘寻道(+旋转)时间的程序,方法如下:创建一个大文件(如果太小,文件所有内容都在一个磁道上),使O_DIRECT打开文件,随机选择一个位置(4k的倍数),读取4K(文件系统块)大小的数据。测试程序分别执行1、10、100、1000、10000次随机读文件操作,结果发现在1000次以内,消耗的时间总是1-3ms,超过10000才会略有大的增长,但也在1s范围内。发现DIRECTIO根本没有生效,百思不得其解。仔细阅读了man手册上关于O_DIRECT的说明:Try to minimize cache effects of the I/O to and from this file.
阅读全文
摘要:注:上图由XMind软件绘制,向大家强烈推荐,http://www.xmind.net/ 管理员在2009年8月13日编辑了该文章文章。 --> -->
阅读全文
摘要:安装与使用参考 【1】http://clewn.sourceforge.net/install.html 【2】http://sourceforge.net/projects/clewn/files/vimGdb/ 【3】 http://easwy.com/blog/archives/advanced-vim-skills-vim-gdb-vimgdb/ 【3】中使用的是7.1版本的...
阅读全文
摘要:B树实现的非回溯算法参考:http://blog.chinaunix.net/space.php?uid=20196318&do=blog&id=3030529 回溯的方式实现B树与非回溯算法相比,理解起来更为直观,而且插入时/删除时,需要分裂/合并的次数比非回溯算法要少,因为只有到必须分裂或合并的时候回溯算法才执行分裂或合并。当回溯算法从根向叶子下降后,还要向上回溯至根节点。如使用B树(B...
阅读全文
摘要:B树的定义 假设B树的度为t(t>=2),则B树满足如下要求:(参考算法导论) (1)每个非根节点至少包含t-1个关键字,t个指向子节点的指针;至多包含2t-1个关键字,2t个指向子女的指针(叶子节点的子女为空)。 (2)节点的所有key按非降序存放,假设节点的关键字分别为K[1], K[2] … K[n], 指向子女的指针分别为P[1], P[2]…P[n+1],其中n为节点关键字的个数。...
阅读全文
摘要:VISIO原图:rpc流程图.rar 管理员在2009年8月13日编辑了该文章文章。 --> -->
阅读全文
摘要:fuse-based文件系统一个请求(以getattr为例)经历的路径,附件为visio版原图:fuse流程图.rar 管理员在2009年8月13日编辑了该文章文章。 --> -->
阅读全文
摘要:K维检索树类似于二叉检索树,不同的是,它能同时提供多维度属性的检索。K维(从0开始计维数)检索树的定义:
K维检索树是一个n层的二叉树(根节点为第0层,依次往下为第1,2..n-1层),对于树中第n层的每个节点,其左子树所有节点的第n%k维属性小于或等于该节点的第n%k维属性;其右子树所有节点的第n%k维属性都大于或等于该节点的第n%k维属性。通俗的讲,就是将整个树的层数循环标记为0到k-1,在第...
阅读全文
摘要:从去年年底开始感觉在实验室的进步越来越缓慢,没有刚实验室那股劲,后来的项目因为没有迫切的需求,进展比较缓慢,把大部分的时间花在课外学习上了,研究主题主要在搜索引擎、key/value存储上,C++&设计模式上,虽然这样接触了很多新的东西,但理解还是比较肤浅,故一直希望暑假找个地方实习,看看在公司大家是怎么做事的。于是从5月开始投了百度、腾讯、阿里、淘宝、支付宝等公司系统研发的职位(之前的博客中写了...
阅读全文
摘要:http协议 网络通信领域,协议是指通信双方约定的规则,彼此按照规则交互,才能理解对方。http是超文本传输协议,之所以需要这样一个规则,是因为现实世界中,C/S请求应答模式的应用占据绝大部分,如果每一种服务都定义自己的格式,世界就会开始变的混乱了,每个人在开发服务器的时候都需要开发对应的客户端,而这个工作显然是不必要的。而为什么选择http而不是其他的规则呢,因为其简单、无状态,能满足应用需求...
阅读全文
摘要:线程池服务模型是single thread 与 request per thread两种模型的折中方案,其在实现时通常需要借助任务队列,主线程往任务队列尾添加任务,线程池中的服务线程不断从任务队列头取任务并服务,如下图所示: 对于主线程和服务线程来说,任务队列是临界资源,需要加锁进行保护。主线程往任务队列添加任务时需要加锁,服务线程从任务队列取任务也许加锁,当服务线程发现任...
阅读全文
摘要:网络服务器的实现不外乎两种情况,一是为某个业务单端开发服务器,二是实现通用网络服务器框架,前者的设计可能很大程度的受业务需求的影响,而后者则要保证简单易用,稳定服务,最好还有不错的性能。 服务器框架的优势在于让使用者快速的进行开发,只需要做很少的事情即可完成服务器的开发。在整个服务模型中,只有对请求任务的处理是预先不可知的,其他的逻辑基本上是固定的,故在实现框架时,将实际的处理部分以回调的形...
阅读全文
摘要:多线程在网络编程中作用重大,由于创建/销毁线程、线程间通信的开销小,目前很多网络服务器都是用多线程(线程池)的模式对外提供服务。linux上开发多线程程序多使用pthread库,本文主要讨论使用C++封装pthread库时可能出现的问题。 封装pthread库主要有两种思路,第一种是简单的封装接口,如下所示: class simple_thread_t {
public:
int star...
阅读全文
摘要:循环read(write) 在网络应用程序中,通常需要重复的调用read/write来读取到指定数量的数据,如下例: int wrapper_read(int fd, char *buf, int
size) { int ridx = 0; int rlen = 0; while(ridx <
size) { rlen = read(fd, buf + ridx, size
– ri...
阅读全文
摘要:linux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
int poll(struct pollfd *fds,...
阅读全文
摘要:关于listen的backup参数
listen的第二个参数,在网上有各种版本的解释,有人说是三次握手成功等待被accept的请求队列长度,有人说是尚未成功建立连接的队列长度,有人说是二者队列长度之和。 #man listen # man tcp 从man手册可以发现:从linux 2.2开始,backlog是指已经建立连接等待被accept的队列长度,而未成功建立连接的队列长度由tc...
阅读全文
摘要:关于hash函数 hash函数主要用于将“大范围”映射到“小范围”,如MD5将任意长度的数据计算出128bit的签名值,RSHash等函数将任意长度的数据转换成32bit的无符号整型,好的hash函数拥有高性能以及低hash冲突。 hash函数主要通过加减乘除及移位等操作来计算最终结果,hash函数的分类参考: http://nicoleamanda.blog.163.com/blog/...
阅读全文
摘要:有m个server、n个client,client发出的请求被随机发送到某一个server上,client的请求为串行模式,即每个请求被处理完后才能发送下一个请求,server处理每个请求的时间为T,server每次只能处理一个请求,其他的请求将排队等待。求当client发送请求无限多时,每个请求的平均服务时间? 请求次数无限多时,可以认为请求被均匀分不到各个server上: (1...
阅读全文
摘要:趁着京东商城做活动,买了几本一直想看的书,其中包括《复制互联网-2011年全球最值得模仿的100个网站》,虽然网易科技有“每日一站”专栏,但我还是想买本书收藏一下。 本书主要从“web 2.0网站”,“搜索引擎”,“电子商务”,“移动互联网”,“多媒体服务”,“网络营销”,“网络工具及其他”等七个领域进行分类介绍,本文是我阅读该书的一点总结。 web 2.0网站 该类目下主要介绍一些...
阅读全文
摘要:step1 安装xampp(包含apache、mysql、php、perl等组件,并提供统一的管理) step2 打开xampp control panel,启动apache服务(如果不能成功启动,查看http:80端口以及https:443端口是否被占用,如果被占用则关闭对应的服务)。 step3 ...
阅读全文
摘要:典型情况:三个副本构成一个group 1.强一致性:所有的副本更新成功才返回。 如上图C表示Client,【P、S1、S2】构成一个同步组,P表示Primary node,S1,S2是两个secondary node,强同步模型的工作流程为C向P写数据,P向S1,S2转发,只有3个都写成功,才向C返回成功,否则写失败。这种模型对于append操作很容易实现,如果副本没有...
阅读全文
摘要:TCBDB是tokyo cabinet的一部分,实现了基于B+树的key/value存储,本文简单介绍TCBDB中分支及叶子节点的存储结构。 分支节点(非叶子节点)的结构 typedef struct { // type of structure
for a page index uint64_t pid;
// ID number of the referring page ...
阅读全文
摘要:TCTDB是tokyo cabinet家族中的表格数据库(如上图),其实现基于TCHDB(hash
database)和TCBDB(B-tree database)。 TCHDB参考:http://blog.chinaunix.net/space.php?uid=20196318&do=blog&id=327754 TCBDB的代码没有读过,有时间也阅读一下,其结构如下图所示。 TC...
阅读全文
摘要:1.What is zookeeper? ZooKeeper, a service for co-ordinating
processes of distributed applications.Since ZooKeeper is part of critical
infrastructure, ZooKeeper aims to provide a simple and high perfo...
阅读全文
摘要:screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。 1. 创建新的screen会话 screen
[command] [-S name] 2. Detach 会话 screen –d
[screen name] 3. Reattach 会话 screen –r screen-name 4. 查看所有的screen会话 screen –ls 进入scre...
阅读全文
摘要:Kafka[1]是linkedin用于日志处理的分布式消息队列,linkedin的日志数据容量大,但对可靠性要求不高,其日志数据主要包括用户行为(登录、浏览、点击、分享、喜欢)以及系统运行日志(CPU、内存、磁盘、网络、系统及进程状态)。 当前很多的消息队列服务提供可靠交付保证,并默认是即时消费(不适合离线)。高可靠交付对linkedin的日志不是必须的,故可通过降低可靠性来提高性能,同时通...
阅读全文
摘要:svnadmin与svnserve建立代码仓库 1. 假设当前目录为/data/ 2. 建立文件夹: mkdir repos 3. 创建仓库:
(1) cd /data/repos/
(2) svnadmin create myproj 4. 启动svn server:
svnserve -d -r /data/repos/ 5.客户端check out:
svn co svn://1...
阅读全文
摘要:以前学C++时记的比较,因最近开发用C++较多,把笔记翻出来复习了一下,跟大家分享一下。类的声明及定义 1. class、struct、union保留字都可以用来声明和定义类。class中成员默认为private类型,struct、union与C语言兼容,成员默认为public类型。 2. 只有当类没有显式的定义构造/析构函数时,C++才会提供默认的构造/析构函数;默认的构造函数只负责创建...
阅读全文
摘要:目前机器上vim的配置为: Vim + ctags + taglist + omnicppcomplete + MiniBufExplorer +BufExplorer +
NERD_tree + DoxgenToolkit 1. taglist插件:用于显示文件的tag,需要ctags的支持 下载:http://vim.sourceforge.net/scripts/script....
阅读全文
摘要:micro_httpd是一个轻量级的http服务器 (http://www.acme.com/software/micro_httpd/),micro_httpd从xinetd运行,性能较差,但对于负载较小的网站,micro_httpd是能胜任的,其实现了http服务器的一些基本特征功能:
1. ..文件名探测以保证安全;
2. 常用MIME类型识别;
3. Trailing-slash重定向;...
阅读全文
摘要:libevent提供一种当特定事件发生、超时或信号到达时执行回调函数的机制,看了libevent的代码,里面包含了对普通事件、超时事件的处理;libevent-0.1(2000年发布)使用select来进行IO轮询,最新的libevent版本使用epoll。(http://monkey.org/~provos/libevent/) libevent的实现框架(三个主体 — 事件、队列、处理):
...
阅读全文
摘要:问题描述:在编译程序时,提示一个错误和一个警告。
error:storage size of tz isn’t know; 其中tz是struct timezone类型的变量。
warning:implicit declaration of function lstat; 使用man手册查了一下,发现tz需要加上sys/time.h头文件,lstat需要加上sys/lstat.h头文件,但这两...
阅读全文
摘要:TCFDB是Tokyo Cabinet中的fix length定长数据库的实现,key由整数id标示,所有value的长度都在某一个长度范围内,TCFDB为某个记录分配固定宽度的区域。TCFDB的设计与实现是KISS(Keep it simple & stupid)原则很好的一个体现。 TCFDB将存储区域分为两部分,头部和记录区,头部包含TCFDB的一些全局信息(长度固定),记录区依次存储多个...
阅读全文
摘要:今天早上到实验室,发现昨天的博客没有发表成功,有点莫名其妙,昨天还看过发表的文章呢,重发一次。 早上提前一刻钟赶到集合地点西十二东门,发现已经很多人在那里等了,我还以为我去的很早呢,有很多同学还是从江夏、汉口赶过来的,据说早上五点多就起床了。 集结完毕就一起奔向西体做一些素质拓展活动,到西体大概等了20分钟,CVT的招聘人员才赶到,活动之前还声明说大家今天来到这里还是来面试的。 最开始就是...
阅读全文
摘要:今天下午参加CVT二面,24个应聘者被8个面试官群P,历时三小时十七分钟。 某天在群邮件里发现了CVT招暑期实习生的消息,大致看了下邮件,也没有发现很有吸引力的地方,直到看到了一些关于CVT的一些比较BT的一些消息(网上有个文档),我才开始关注CVT,发现CVT的招聘流程还真的是别具一格,首先要进行一个职业测评和一个专业测评,通过了测评才能下载CVT的简历,然后参加一面、再笔试、再二面、外加一个...
阅读全文
摘要:Bitcask和Tokyo Cabinet的TCHDB都是基于hash的key-value存储系统,本文从两者的实现机制上进行简单的对比。 Bitcask: http://blog.chinaunix.net/space.php?uid=20196318&do=blog&id=154750
Tokyo Cabinet: http://blog.chinaunix.net/space.php?ui...
阅读全文
摘要:TC(Tokyo Cabinet )是日本人平林幹雄开发的一款 Key-Value 键值数据库。Tokyo Cabinet实现的数据库类型分为:TCHDB 哈希数据库、TCBDB B+Tree数据库、TCFDB 定长数据库、TCTDB 表格数据库、TCMDB 内存哈希数据库、TCNDB 内存B+Tree数据库。 下载了TC-0.2.9的源代码(比较老的一版,只实现了TCHDB),简要的了解...
阅读全文
摘要:中国大的视频服务网站主要有优酷、土豆、酷六、还有几大门户(腾讯、新浪、搜狐等),他们都是以提供视频发布及观看、视频搜索(目录分类及导航)为主,网站上提供视频的主要是由专门的娱乐、体育类的网络编辑整理并发布到网站上的,视频大都来自于各大电视台、还有电影公司、当然还会有一些热心的拍客会上传他们的作品(有的拍客是把视频网站当做一个广告平台来宣传自己的)。 有些视频网站也会做一些特别的策划,在所有的视...
阅读全文
摘要:位图主要用于快速检索关键字状态,通常要求关键字是一个连续的序列(或者关键字是一个连续序列中的大部分), 最基本的情况,使用1bit标示一个关键字的状态(可标示两种状态),但根据需要也可以使用2bit(标示4种状态),3bit(标示8种状态),当一个状态标示需要的位数达到32bit时,就演变成来一个整型数组了。 位图的主要应用场合:标示连续(或接近连续,即大部分会出现)的关键字序列的状态(状态数/...
阅读全文
摘要:今天经历了迄今为止最长的一次面试,历时两个半小时,百度工程师GG不厌其烦的问着各种问题,很有耐心,并不断的给予指引。系统设计、算法设计、智力题等各种题目扑面而来,整个面试下来,受益匪浅,发现了很多不足,也学到了很多知识。 昨晚接到百度的面试通知,今天上午十点半到珞珈山国际大酒店面试,不到十点就赶到面试地点了,等到十点半左右,面试官出来说上一个面试的还没完,让我再等一会,对面试官GG的第一印象很好...
阅读全文
摘要:当Web服务器、文件服务器、游戏服务器等的用户数不断增加时,单服务器模型肯定不能完全满足服务的需求,集群服务模式已经逐渐普及,使用服务器集群做后台,一个主要的问题就是要解决负载均衡问题。 负载均衡算法主要分为两种,持续性和非持续性的负载均衡,持续性是指特定客户端发出的请求将由同一服务器服务。持续性算法主要基于随机理论,即其默认客户的访问时随机的,从而服务器的选择也是随机的,以此来实现负载均衡。...
阅读全文
摘要:1. linux提供opendir、readdir(readdir_r)、closedir和scandir等接口实现对目录的读取;2. readdir返回指向下一个目录项的指针,如果要自己传入缓冲区存储目录项,应使用readdir_r代替。readdir的结果中包含当前目录和上一级目录的目录项信息。3. 在遍历过程中,进程的工作目录不会改变,在递归遍历的时候,需要改变工作目录(chdir)以识别相对路径,或者每次都限定全局路径。4. 深度优先遍历目录树采用递归实现易编码(参见如下代码),广度优先遍历则需借助队列实现。当目录下的文件数量较少时,采用广度优先遍历效率会更高,因目录下的目录项基本都是
阅读全文
摘要:这两天先后参加百度腾讯的实习生招聘笔试,不幸的是,昨天肚子不舒服,后来引发高烧,百度的笔试是在高烧39度的情况下完成的,题目一做完我就立马撤回宿舍睡觉了。由于今天要参加腾讯的笔试,怕高烧不退,昨晚去校医院检查了下,吃了点药,今早除了胃口不大好,其他都还不错,运气还不算很差。 参加完两大巨头的笔试,发现两者笔试风格迥异,百度全部是主观题,而腾讯则全是客观题(除最后的附加题外)。笔试题目出得还是相...
阅读全文
摘要:最近遇到一个问题:大批量的文件,每个文件除了拥有类似于linux中struct stat中的一些基本的元数据外,还存在一系列的key/value对的扩展属性,现在的需求是,根据用户提供的key/value对,快速检索出匹配的文件集。 对于搜索来说,暴力搜索无疑是万能的,遍历所有的目标并逐个进行匹配,肯定能得出结果,比如linux下的find工具就是采用这种方式找出特定文件的。在匹配的过程中,查...
阅读全文
摘要:从第一次接触linux到现在也有三四年的时间了,小雅姐最近发起了一个linux技术征文比赛,为了表示对她工作的支持,把这些年自己在使用linux过程中的一些小技巧跟大家分享一下,希望对linux爱好者们有帮助。(注:本人常年使用Fedora) 1. 为了系统数据的安全,不要使用root用户登录,应创建自己的账户,一般的工作都用普通账户完成,当需要执行管理员权限的工作时,再切换到root。
2. ...
阅读全文
摘要:Linux环境下,在内核写程序限制很多,相比用户态程序:
n 不能使用C库
n 不能使用系统调用
n 理解内核各个部分的实现原理及相关函数的机制及作用
n 熟悉内核使用的锁机制并仔细处理跟锁相关的细节 之前做过将一个用户态的加密库(包括AES和RSA的实现)移植到内核态使用,主要涉及调试消息的打印,内存空间申请与释放,数据类型的转换,随机数的生成等问题。 没有printf,如何打印消息?
内...
阅读全文
摘要:Protocol buffer是google开源的又一利器,主要用于结构化数据存储与数据交换,类似于XML,但相比XML,它更小、更快、也更简单,只需使用protobuf对数据结构进行一次描述,即可利用各种不同的语言(包括C++、java、python等,同时还包括很多种语言的绑定插件)从各种不同的数据流(文件、字符串流等)对结构化数据轻松读写。但由于其使用二进制存储,相比XML,其可读性差。 ...
阅读全文
摘要:Slab分配器把对象分组放进高速缓存(cache),以避免重复初始化对象。slab分配器并不丢弃已分配的对象,而是释放并把它们保存在内存中。当以后又要请求新的对象时,就可以从内存直接获取而不用重复初始化。 对象高速缓存的组织如下图所示,高速缓存的内存区被划分为多个slab,每个slab由一个或多个连续的页框组成,这些页框中既包含已分配的对象,也包含空闲的对象。 FQL同学问了个问题,说...
阅读全文
摘要:2011级新生培训.rar 主要内容:学习建议 + 文件系统 + FUSE
祝各位师弟师妹学有所成! 管理员在2009年8月13日编辑了该文章文章。 --> -->
阅读全文
摘要:截至2011年4月11日12:18:08,淘宝招聘的微博粉丝已达12681人,据不完全统计,我身边没多少人天天上新浪微博,以我身边约1比8的使用概率算,这次专注淘宝招聘的人应该有10w左右,而招聘名额是500人(包含非技术岗)。 我于2010年3月27日下午参加淘宝的笔试,一直到昨天下午才收到面试通知,而且是在四天之后,期间淘宝招聘团队在各地举行宣讲会,去食堂的路上都经常能听到一堆人聊淘宝实习...
阅读全文
摘要:当你在互联网的世界中遨游是,忽然看到这样一则消息,说中兴成为世界第五大手机厂商,你会做何感想。可能大部分人会对这条消息的真实性表示怀疑吧,觉得中兴的手机业务发展不可能这么快吧,但同时也会想,消息都出来了,肯定也不会太假,于是下次买手机的时候你除了关注诺基亚、三星、多普达等,你也许会多看一眼带有ZTE标签的手机。作为一个普通的网民,你可以选择相信或者不相信这条消息,但有一件事,你肯定不会去做,那就...
阅读全文
摘要:问题:给定一个有序序列1~n,要你将其完全打乱,要求每个元素在任何一个位置出现的概率均为1/n。
解决方案:依次遍历数组,对第n个元素,以1/n的概率与前n个元素中的某个元素互换位置,最后生成的序列即满足要求,1/n的概率可通过rand() % n实现。见如下程序:
void swap(int* p, int* q)
{ int tmp = *p; *p = *q; *q = tmp;
}
...
阅读全文
摘要:4月1号在火车上收到快递公司的电话,cublog的礼物送到了,开始以为只是很普通的衬衣,然后印上CU的标志,昨天看到礼物发现居然是cerruti,质量很不错,小雅姐果然很给力。 这次参加“蓦然回首,博客五年”的博客征文活动,其实给CU写的意见博文是在征文活动之前,因为我很早就在关注CU博客系统升级的消息,所以在第一时间就体验了一下新的博客系统,并提了几点意见,所以说这次能拿到奖品也完全是小雅姐的...
阅读全文
摘要:在google搜索框中输入“开放平台”,搜索结果中包括百度开放平台、淘宝开放平台、腾讯开放平台、人人开放平台、新浪微博开放平台等,都是国内数一数二的大公司,那么到底什么是开放平台呢,这些IT大佬们为什么都要做开放平台呢。 开放平台在百度百科中的定义是:开放平台是指软件系统通过公开其应用程序编程接口(API)或函数(function)来使外部的程序可以增加该软件系统的功能或使用该软件系统的资源,...
阅读全文
摘要:昨天参加阿里巴巴的笔试,有一道题目要求从N个面试的人中挑选出M个成绩最好的人(M<=N, 并假定M个人的成绩都不一样),求挑选程序的最优时间复杂度()。
选项包括:O(NlogN), O(N*min(M, logN)), O(N*logM), O(N)。 O(NlogN)的算法是完全有可能的,使用堆排序,快速排序等将N个元素排序,选取前M个元素即可。 O(N*logM)的算法也是有可能的,将前...
阅读全文
摘要:fuse内核模块被加载时,以下初始化例程会被调用,见fuse_init函数<inode.c>。
1. fuse_fs_init(); 注册fuse文件系统,创建fuse_inode高速缓存。
2. fuse_dev_init(); 创建fuse_req高速缓存,加载fuse设备驱动,用于用户空间与内核空间交换信息。
3. fuse_sysfs_init(); 在/sys/fs目录下增加fuse节点...
阅读全文
摘要:1. 打印错误信息
如果程序的执行必须要求某个宏被定义,在检查到宏没有被定义是可以使用#error,#warning打印错误(警告)信息,如:
#ifndef __unix__#error "This section will only work on UNIX systems"#endif
只有__unix__宏被定义,程序才能被正常编译。 2. 方便调试
__FILE, __LINE, __...
阅读全文
摘要:xinetd是inetd超级服务器的升级版,相当于inetd + tcp wrapper,将服务管理与访问控制结合在一起。在介绍inetd之前,先看一个xinetd的实例(我的机器上只有xinetd,关于inetd的配置参考UNP 325页)。 xinet配置实例 为xinetd添加myecho服务(将客户端发来的请求消息回送给客户端)。 1. 在/etc/services中添加myec...
阅读全文
摘要:getaddrinfo是在gethostbyname系列函数不支持Ipv6的情况下逐渐催生的,其能够处理名字到地址以及服务到端口这两种转换,返回一个sockaddr结构的链表,这些sockaddr地址结构随后可有套接口函数(socket、bind、connect、listen等)直接调用,将协议相关性隐藏在该函数内部。应该尽量选择使用getaddrinfo函数代替之前的getxx函数族,就像应该使...
阅读全文
摘要:1. 重用已使用的地址 问题描述:在刚刚关闭了测试程序后,再启动服务器时提示bind失败,返回错误EADDRINUSE。 原因分析:套接字(主动关闭一端)在关闭套接字后会停留在TIME_WAIT状态一端时间,由于我在同一机器上同时运行客户端与服务器,故服务器在重新启动执行bind时,可能上次关闭连接还没有完成,连接依然存在,故bind失败。通过设置套接口的SO_REUSEADDR可重用已绑定的...
阅读全文
摘要:实线:表示客户的正常状态转换 虚线:表示服务器的正常状态装换 应用:表示状态转换在应用进程发起操作时发生 接受:表示状态转换在接受到分节时发生 发送:表示这个转换发送什么 三次握手建立连接 服务器调用socket、bind、listen来完成,即执行被动打开,准备好接受外来的请求。 1.客户端发调用connect发送SYN分节(同步),它告诉服务器客户将在连接中发送的数据的初始...
阅读全文
摘要:1. read系统调用 测试程序:客户端向服务器端(tcp)发送一个”hello”字符串,服务器端读取并echo到客户端。 服务器端主要代码: char buf[4096]; int r = tcp_readn(sock, buf, 4096); int w = tcp_writen(sock, buf, r); 客户端主要代码: char buf[4096]; int w...
阅读全文
摘要:Tair是由淘宝开发的一个key/value存储系统。 参考:http://rdc.taobao.com/blog/cs/?p=302 在数据分配方面,Tair使用了对照表,对照表由于数据路由功能,由配置服务器(configserver负责维护),configserver周期性的初始化各个数据节点的信息,并通过Heartbeat来管理数据节点的状态。对照表通常包含多个slot(应远大于数据...
阅读全文
摘要:Bitcask来自于riak,是一个日志(log-structured)存储系统。用在riak的分布式数据库的底层key/value的存储。 Bitcask的一些基本特征: 1.
key/value以日志的形式按顺序存储,只能追加(append-only)写入key/value,每次写操作都是顺序写入。当某个key所对应的value发生变化时,新的key/value被追加到文件末尾。 2...
阅读全文
摘要:1. 与日志相关字段的初始化
<super.c>
static int parse_options (char *options, struct super_block *sb, unsigned long *inum, unsigned long *journal_devnum, ext3_fsblk_t *n_blocks_count, int is_remount)
{ … ca...
阅读全文
摘要:内核线程是直接由内核本身启动的进程。内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程“并行”执行(实际上,也并行于内核自身的执行),内核线程经常被称为内核“守护进程”。它们主要用于执行下列任务: l 周期性地将修改的内存页与页来源块设备同步。 l 如果内存页很少使用,则写入交换区。 l 管理延时动作 l 实现文件系统的事务日志。 内核线程主要有两种类型: 1. 线程启动...
阅读全文
摘要:linux系统中每个进程由一个进程id标识,在内核中对应一个task_struct结构的进程描述符,系统中所有进程的task_struct通过链表链接在一起,在内核中,经常需要通过进程id来获取进程描述符,最简单的方法可以通过遍历task_struct链表并对比id的值来获取,但这样效率太低,尤其当系统中运行很多个进程的时候。 linux内核通过PID散列表来解决这一问题,能快速的通过进程I...
阅读全文
摘要:内核中很多地方都需要跟踪记录C语言中结构的实例。尽管这些对象的用法大不相同,但各个子系统的某些操作都非常类似,如引用计数,内核为了减少代码复制,采用了一般性的方法来管理内核对象。所引入的框架并不只是为了减少代码复制,同时也为内核不同部分管理的对象提供了一致的视图。 一般性的内核对象机制可用于执行下列对象操作: 1. 引用计数; 2. 管理对象链表; 3. 集合加锁; 4. 将对象属性...
阅读全文
摘要:有限状态机是文本处理的利器,关于有限状态机的理论比较复杂,但在实际文本处理应用中,
只需要对有限状态机的模型有所了解,搞清楚状态转移关系即可快速的写出程序。 如对网络配置文件进行解析(与/etc/sysconfig/network-scripts/ifcfg-eth0文件类似的格式)
格式如下:(其中以#开头的行为注释行,有效的配置字符为数字,字母和点号) #this is a net wor...
阅读全文
摘要:115优盘(http://u.115.com)
115优盘是由雨林木风最新推出具有存储容量大、免费、高速、稳定、易用,安全等特点的免费网络硬盘,即免费网络存储空间服务。115优盘初始提供3G的永久存储空间以及5G的临时存储空间,支持文件共享,支持外链,并提供了客户端工具。 联想网盘 (http://www.lenovodata.com)
联想网盘为用户提供了5G的“免费”存储空间,但我最近登录时...
阅读全文
摘要:在HDFS中,NameNode用来管理文件系统的命名空间,其将所有的文件和文件夹的元数据保存在一个文件系统树中,这些信息会在硬盘上保存为fsimage(命名空间镜像)和edits(修改日志)文件;其还保存了文件包含哪些数据块,分布在哪些数据节点上,但这些数据并不保存在硬盘上,而是在系统启动的时候从数据节点收集而来的。DataNode是文件系统中真正存储数据的地方,其周期性的向元数据节点回报期存储...
阅读全文
摘要:1. 创建java运行环境 l 下载jdk for linux: jdk-6u22-linux-i586.bin http://www.java.com/zh_CN/download/manual.jsp l 安装jdk:chmod a+x jdk-6u22-linux-i586.bin; ./ jdk-6u22-linux-i586.bin l 设置环境变量 #vi /etc/pr...
阅读全文
摘要:日志文件系统的目标是避免对整个文件系统进行耗时的一致性检查,ext3日志文件系统的思想是对文件系统进行的任何高级修改都分两步进行。首先,把待写块的一个副本存放在日志中;其次,当发往日志的I/O数据传送完成时(把数据提交到日志后),待写块就被写入文件系统。当发往文件系统的I/O数据传送终止时(把数据提交到文件系统后),日志中的块的副本就被丢弃。 当从系统故障中恢复时,e2fsck程序区分以下两种情...
阅读全文
摘要:HayStack是Fackbook用于存储照片的系统,其存储照片的数量在千亿数量级,本文简要分析HayStack的设计与实现原理。 图片存储的几个关键点: 1.
Metadata信息存储。由于图片数量巨大,单机存放不了所有的Metadata信息,假设每个图片文件的Metadata占用100字节,260
billion图片Metadata占用的空间为260G *
100 = 26000GB。...
阅读全文
摘要:我是一个学习计算机专业的理想主义者,我的研究兴趣为网络存储与分布式系统,我对很多的优秀软件的设计极为钦佩,我梦想着有一天我自己设计了一个系统,她有着近乎完美的架构、良好的性能和容错性、她能满足用户的一切需求,我和我优秀的同事们一起为实现这个系统编写了一行行优雅的代码,并进行测试和部署。 在实验室,我每天阅读计算机方面的书籍,只要我觉得会对我有帮助的我就会读,因为我觉得,只有打好了坚实的基础,...
阅读全文
摘要:进程是操作系统运行的基础,本文以比较粗犷的角度闲侃linux进程方面的知识。 用户态的每个进程在内核中对应一个task_struct结构的进程描述符,描述符中包含进程的状态和执行信息、虚拟内存信息、打开文件信息、以及文件文件系统信息,信号相关信息等(进程使用的资源时有限制的,如打开文件数,使用的物理页,文件大小等,其值包含在描述符中task_struct->signal->rlim字段中,也...
阅读全文
摘要:什么是 XML?
1. XML是一种可扩展的标记语言 (Extensible Markup Language)。 2. XML的标记 (tag) 没有被预定义,用户可以自行定义标记来描述数据。 3. XML主要用来描述和存储数据。 4. XML具有自我描述性。 5. XML是树状结构的文档,是个结构化的文档。 6. XML文档是个文本文件。 XML 的优点
1. 易携带和传输: XML...
阅读全文
摘要:马上一年又过去了,研究生生涯也算过去了一大半了,发现这两年也读了不少的专业书籍,给自己读过,并且还有点印象的书写个书评,志同道合者可以借鉴下我的意见,仅供参考。计算机领域的专业书籍非常之多,好多经典之作,这些书值得好好品味;很烂的书也很多,这些书就不值得去浪费时间了。好读书,读好书。 书名 评价 说明 C专家编程
C陷阱与缺陷
C和指针 ★★★★★ 搞C语言开发的,非常值得...
阅读全文
摘要:Lucene支持基于词条的TermQuery、RangeQuery、PrefixQuery、BolleanQuery、PhraseQuery、WildcardQuery、FuzzyQuery,另外lucene提供了功能强大的QueryParse用于从查询表达式中分析出查询请求。 1. TermQuery与QueryParser
单个单词作为查询表达式时,它相当于一个单独的项。如果表达式是由单个...
阅读全文
摘要:花了点时间研究lucene的索引格式,测试的时候我使用的是2.9.3版本的,但由于后来版本的索引相对较复杂,我就学习了下1.4版本的索引格式,主要是参见lucene官方网站上的文档(http://lucene.apache.org/java/1_4_3/fileformats.html)。 1. Lucene中的基本概念 Lucene中基本的概念包括索引,文档,域,和词条。
l 索引(inde...
阅读全文
摘要:很多应用需要客户首先进行注册,然后使用用户名、密码进行验证,之前在为一个分布式系统添加认证模块的时候,遇到一个问题,这里进行简要的分析。认证的两种主要形式:1. 单机登录认证:如windows、linux系统用户登录,这种应用的程序代码通常是不公开的,用户要正常的使用系统,必须越过这一障碍。2. 网络登录认证:如QQ、飞信等聊天软件的用户登录,这种应用的代码可以是开源的,因为即使即使代码开源,hacker去掉了客户认证的代码,重新编译运行,服务器发现记录客户端的登录状态为未登录,客户端还是不能继续工作。项目中遇到的问题:客户端通过挂载后,像使用本地文件系统一样使用远程文件系统。登录认证在挂载的
阅读全文
摘要:对于很多服务来说,在同一个服务器上只能运行一个实例,那么通过什么方法来保证程序同一时刻只有一个实例运行呢?通过编写shell脚本来管理程序的启动、停止是个不错的方法。在启动时,shell脚本会创建进程标识文件(存储正在运行实例的pid)以表明已经有实例在运行,如果文件已存在,则说明已有实例在运行,不需要做任何事;在退出时,shell脚本会删除进程标识文件,表明没有实例运行。shell脚本管理方法在应用程序之上再包了一层,那么能不能直接在程序开始运行时自己判断是否有实例在运行呢,答案是肯定的。原理其实差不多,还是要借助公用资源---文件,当然不仅仅是文件而已,还需要文件锁的支持。大致思路是这样的
阅读全文
摘要:实现linux登录验证的程序,要考虑两个部分,第一是用户名、密码的输入;第二是用户、密码的验证,关于第二部分的机制已经在http://blog168.chinaunix.net/space.php?uid=20196318&do=blog&id=94771中讲到。而第一部分的难点则在于如何在输入密码时不回显输入的字符,这就需要更改终端的属性,涉及终端IO的编程,主要用到tcgetattr和setattr两个函数,通过取消终端的ECHO标记,即可禁用终端回显,在密码输入处理之后,要记得恢复终端原来的属性,避免影响到其它的进程。终端IO处理大致过程如下:structtermios
阅读全文
摘要:在linux系统下创建守护进程的原理及步骤在文章(链接如下)中介绍过。http://blog168.chinaunix.net/space.php?uid=20196318&do=blog&id=28738其实,linux提供了daemon函数用于创建守护进程,实现原理与上文中介绍的是一样的。#include <unistd.h>int daemon(int nochdir, int noclose);1.daemon()函数主要用于希望脱离控制台,以守护进程形式在后台运行的程序。2.当nochdir为0时,daemon将更改进城的根目录为root(“/”)。3.当
阅读全文
摘要:本文更正http://blog168.chinaunix.net/space.php?uid=20196318&do=blog&id=28742中出现的几个错误。错误1:对salt的描述;错误2:密码验证方式。花了点时间研究了一下linux的密码认证机制,当系统启动出现login时,用户登录的过程是如何得到验证的。首先linux系统里管理用户及密码的两个重要的文件,/etc/passwd, /etc/shadow。/etc/passwd包含各个用户的信息,linux平台包含七个字段,各个字段间用冒号隔开,分别是:用户名:密码:用户id:组id:用户描述:用户家目录:用户的登录s
阅读全文
摘要:ldd查看应用程序链接了哪些动态库。 nm列出目标文件中包含的符号信息。size列出各个段的大小及总的大小。strings列出文件中的字符串。readelf读取elf文件的完整结构。objdump导出目标文件的相关信息(elf文件相关工具的源头)。gdb对文件的执行过程进行调试分析,设置断点(b)、单步执行(n)、函数调用追踪(bt)、反汇编(disassemble)。strace跟踪程序中的系统调用及信号处理信息。LD_DEBUG通过设置这个环境变量,可以方便的看到 loader 的加载过程(包括库的加载,符号解析等过程),使用【LD_DEBUG=help 可执行文件路径】可查看使用帮助。L
阅读全文
摘要:上周在做测试的时候,我的VirtualBox的磁盘文件不幸损坏,不能打开了,又没有做备份,所以只好放弃VB。改用以前用的VMware,结果用了两天除了意想不到的问题,VMware产生的文件居然占据了整个分区,每次都提示系统没有足够的空间,VMware不能启动,分区有40+G,被占满主要是做了多次快照(后来删除了快照,相关的文件没有清理掉,VMware一直卡在那里),额外建立了几个磁盘(配置MD时新建的,并且所有的磁盘的空间都是创建时分配的,而不是动态增长)。在解决问题时误删了一些文件,系统提示找不到启动必须的文件xxx,其实应该删除后来新建的磁盘的,可惜当时有点急,那是已经是周三了,周四有事,
阅读全文
摘要:今天使用了cublog新的博客系统,没有想象中那么满意,甚至有一点点后悔直接升级到新的系统了。最近在实验室做的东西也涉及到用户体验,所以我就花点时间比较一下新旧博客系统的用户体验。 1. 在宣传方面,新博客系统上线了N多天,我这个经常泡博客的用户才知道,只能说新博客上线工作的宣传做得不到位。要想新博客达到预想的目标,必须把老用户完全迁移过去,但估计没多少老用户知道这回事,至少可以在他们仍然登录博...
阅读全文
摘要:Man page of xargs
xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines, and executes the command (default is...
阅读全文
摘要:以前在做项目的时候简单的研究过一致性hash,后来看Dynamo的实现原理时,对里面的虚拟节点不是很理解,也一直没有找到好的资料解释这个问题,昨天在光谷书城偶然看到一本讲网络爬虫的书上分析了这个问题,今天再在网上找了些资料,加深了对这个问题的认识。 一致性hash原理:http://blog.csdn.net/sparkliang/archive/2010/02/02/5279393.aspx
...
阅读全文
摘要:最近几天看了些搜索引擎方面的书,主要阅读了《自己动手写搜索引擎》、《自己动手写网络爬虫》、《搜索引擎技术实践》、《搜索模式》、《瞬间之美》等书,都很不错,也学到了不少知识,本文谈一下我对构建搜索引擎的认识。 要构建一个搜索引擎,首先要确定搜索源,也即被搜索的对象。被搜索的对象可以是一堆文档,用户需要确定包含某关键字的文档集合;可以是一系列网页,用户需要确定跟关键字内容相关的网页;或是一系列的图片...
阅读全文
摘要:腾讯的纯真IP数据库收集了包括中国电信、中国移动、中国联通、长城宽带、聚友宽带等 ISP 的最新准确 IP 地址数据,包含了IP地址与国家/地区的对应关系,其信息保存在QQWry.dat文件中。 IP数据库应用的场合较为广泛,下面举几个常见的例子:
1.根据客户的IP地址确定客户来源,为后期的客户行为分析提供基础,例如需要统计学生群体的访问特点,这时我们就是通过分析来自教育网的IP地址的那些请...
阅读全文
摘要:最近两个月都在研究元数据组织与检索的问题,没有方向、没有借鉴,没有取得任何进展。在调研的过程中,发现自己很out,win7的强大是我之前没有想到的,以为Win7只是界面绚丽了一些,用户体验好了一点点,但没有发现Win7的库那么强大,据我所知,很多Win7的用户并不使用库。 Win7的库是建立在文件系统之上,按照文件的属性/标签(可设置)建立索引(以文件的形式),通过库能很方便的管理系统的文档、...
阅读全文
摘要:Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能,Lucene的目标是为各种中小型应用程序加入全文检索功能。(参考http://www.chedong.com/tech/lucene.html)
Lucene包含分词,索引,搜索等几个模块,支持单个关键字查询、范围查询、短语查询等,为构建全文搜索引擎提...
阅读全文
摘要:FAT文件系统分为三个部分:保留区、FAT区和数据区,如下所示:
|--- 保留区 ---|--- FAT1 ---|---FAT2---|---数据区 ---| 1. 保留区中包含文件系统的一些总体信息,类似于unix文件系统里的超级块信息。
2. FAT区包含文件的分配表链。
3. 数据区存放实际的文件数据(目录的数据为目录项列表)。 本人电脑C盘的空间约为40G,簇大小为32k(簇类似...
阅读全文
摘要:为了使问题简单化,在根目录下创建文件dnfs-server.conf,由于根目录的inode节点为2(ls –i –l –d /),且第一个块组的inode table起始块号为483),查看根目录的索引节点信息。
(参考http://blog168.chinaunix.net/space.phpuid=20196318&do=blog&id=31362)
hexdump /dev/sda1 -...
阅读全文
摘要:/dev/sda1为ext3格式的分区,使用dumpe2fs /dev/sda1可查看文件系统的总体信息。
#dumpe2fs /dev/sda1 Filesystem OS type: Linux
Inode count: 491520
Block count: 1965402
Reserved block count: 98270
Free blocks: 1020744
Free ino...
阅读全文
摘要:递归是指函数在执行的过程中调用到自身已完成需要的功能,用递归能解决的问题通常能将问题不断缩小为性质相同但规模更小的问题(递归情况),直到问题足够小能够直接解决(基本情况),如下面简单的例子:
#include<stdio.h>
void f(int n)
{ printf("Level %d:n location %p\n",n,&n); /* 语句1 */ if(n < 3) f(n+1)...
阅读全文
摘要:2010级文件系统知识培训PPT 祝各位师弟师妹学有所成! 管理员在2009年8月13日编辑了该文章文章。 --> -->
阅读全文
摘要:MooseFS通过检查缓存的文件是否被其它的客户端修改,来决定缓存是否有效,感觉与我实现的那个版本的DNFS缓存机制一模一样,客户端在判断缓存是否有效时,需要连接元数据服务器进行确认,以下详细的说明在集中情况下对缓存的处理。 场景1:
机器A读取文件X,(X的元数据被加入到机器A的缓存)
机器B读取文件X
此时,机器A欲读取/修改文件X(cache有效,因为文件没有被修改过) 场景2
机器A读...
阅读全文
摘要:学习分布式文件系统时,曾经download了moosefs的源代码,做了简单的测试,发现moose的实现效率还不错,在阅读器源代码时,发现了其封装了C socket接口,于是把相关的文件保存下来了。昨天闲着没事,想测试一下这个socket接口,在测试udp时,发现服务器接收到数据后,不能正确的向客户端返回信息。 阅读了代码发现问题在udpread函数上,udpread的实现如下: int ud...
阅读全文
摘要:对于单元数据服务器的集群,单元数据服务器会造成瓶颈,很多分布式文件系统通过采用元数据服务器集群的模式进行扩展,首先要解决的问题就是系统的元数据以什么方式分布在元数据服务器集群中。目前一些主流的分布式文件系统中使用的方案主要包括Table-Based Mapping,Hashing-Based Mapping,Static Tree Partitioning,Dynamic Tree Part...
阅读全文
摘要:1. TaggedFrog特性分析(http://lunarfrog.com/) TaggedFrog特点:
1. 导入文件时添加标签(不支持动态标签设置)。
2. 标签以标签云的方式呈现,支持标签搜索。
3. 支持扩展的元数据分析,音视频分析等(需要下扩展包)。
4. 支持对标签进行分组管理。
5. 支持导入/导出标签元数据。 2. TaggTool特性分析 (http://www.tagg...
阅读全文
摘要:1. Linux系统调用的作用?
系统调用是操作系统为用户态运行的进程与系统内核、硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口,在应用程序和硬件之间设置一个额外层的优点包括:
1. 用户编程更加简单,不必学习硬件设备的低级编程特性;
2. 提高了系统的安全性,内核在试图满足某个请求前在接口级可以检查请求正确性。
3. 这组接口使得程序具有可移植性,只要内核所提供的接口相同,使用这些接...
阅读全文
摘要:1. 内核与普通进程获取内存时有何不同?
内核是操作系统中优先级最高的成分,如果某个内核函数请求动态内存,则其必定有正当的理由发出那个请求,内核的内存请求应该立即被满足;内核信任自己,所有的内核函数都被假定是没有错误的,内核函数不必考虑编程错误的保护措施。
而当用户态进程请求分配内存时,进程对动态内存的请求被认为是不紧迫的,当进程的可执行文件被装入时,进程并不一定立即对所有的代码页进行访问,同样的...
阅读全文
摘要:同一硬件高速缓存行可以映射RAM中多个不同的块,相同大小的对象倾向于存放在高速缓存内相同的偏移量处。在不同slab内具有相同偏移量的对象最终很可能映射到同一高速缓存行中。而使用slab分配器的对象通常是频繁使用的小对象,高速缓存的硬件可能因此而花费内存周期在同一高速缓存行与RAM内存单元之间来来往往的传送两个对象。 如下例:假设cache行为32Bytes,CPU包含512个cache行(缓存大...
阅读全文
摘要:1. linux的内存管理的单位?
linux操作系统使用分页内存管理的机制,将内存空间划分成多个页面(页框,大小通常为4K),内核使用struct page结构的页描述符来保存一个页框的状态信息,所有的页描述符存放在全局的mem_map的数组中,每个page结构体大小为32B,故mem_map所占的空间小于整个内存空间的1%(页面大小按4K计算)。 2. 如何标识一个页面是否空闲?
页描述符中...
阅读全文
摘要:经常有网友问到关于fuse内部实现原理方面的问题,下面的内容是给一个网友的回复,简单的讲述了fuse的原理,并分析了一个特定请求的处理过程。 fuse主要包含3个模块:
一个fuse文件系统模块(1),一个设备驱动模块(2),一个用户空间模块(3) fuse文件系统这一部分跟其它的文件系统实现差不多,实现了一个文件系统应该提供的借口(如read,write,open等),这就是为什么你挂在了用...
阅读全文
摘要:1. 用户空间文件系统 用户空间文件系统位十内核之外,实现为一个用户进程或者一个运行库。在用户空间开发文件系统的主要原因是,开发工作相对比较简单。这种方法避免了内核编程的复杂性,极大的简化了开发工作。用户级文件系统的另一个优点是,文件系统可以由用户自己安装,不需要系统管理员的参与,这给用户使用文件系统提供了很大的灵活性。一个运行在用户空间的文件系统这样与用户进程和操作系统进行交互(以读文件操作为...
阅读全文
摘要:每次逛fuse的sourceforge主页都会有新的收获,今天在Filesystem Based on Fuse列表中,发现了一个fusefile的文件系统,其提供将一个文件挂载到另一个文件上的功能(支持偏移和追加模式),如对于/dev/sda的磁盘文件,通常是不推荐用户直接读写磁盘文件的,一旦不小心破坏了超级块或重要的数据块就麻烦了。此时就可通过fusefile,将/dev/sda的一部分挂载...
阅读全文
摘要:分布式存储系统中,元数据服务器通常是一个集中管理者,通常由它选择(根据一些负载均衡算法)合适的存储节点来存储文件数据,这就形成了文件元数据中的映射元数据部分,映射元数据记录文件数据分布信息。 常用的实现方法为存储节点周期性的向元数据服务器报告状态信息,元数据服务器根据这些节点的信息选择负载最小的存储节点作为本次请求的数据服务者,这就要求元数据服务器为每个文件维护一个数据分布链,当文件很大,而数据...
阅读全文
摘要:#include <iostream>#include <cstdlib>using namespace std;/* 重载new应返回void*类型,如果内存分配请求成功,就返回指向内存的指针;* 如果失败,则遵循规定抛出一个std::bad_alloc类型的异常* 重载operator new需要注意的一些问题,参见:* http://blog.csdn.net/xushiweizh...
阅读全文
摘要:上个月给文件系统添加额外的属性设置接口,但却是完全脱离文件系统实现的,直接使用rpc连接元数据服务器来设置/获取属性,而没有通过文件系统的客户端。当时想着还有一种方法就是在fuse-2.8中支持了ioctl接口,可通过为分布式文件系统实现ioctl接口实现扩展属性的获取与设置。 使用ioctl首先要理解ioctl命令的封装格式,ioctl的命令对应一个32bits的整数,其格式如下: ...
阅读全文
摘要:零长度是指定义数组时,指定其长度为0(如int arr[0];),这样的数组不占用实际的空间,但能通过数组名访问到其指向的地址。如下例所示: #include <stdlib.h>#include <stdio.h>struct device{int num;int count; int reserve[0]; /* * reserve是一个数组名;该数组没有元素;该数组的其实地址紧随结...
阅读全文
摘要:1. 内核符号表 内核符号表是linux内核提供给内核代码的一部分引用,所指的“内核代码”包括内核以及驱动程序等运行在内核内存空间的程序,“引用”包括对变量的引用,对函数的引用等。最常见的内核符号引用如printk打印输出,通常内核符号是由一部分内核代码提供给其他内核代码访问其内部数据的接口。 外部模块只能使用内核或其他外部模块导出的符号。内核或外部模块可通过EXPORT_SYMBOL宏导出符...
阅读全文
摘要:方法1:修改系统调用表(适用于linux-2.4内核) 内核使用sys_call_table数组来存储系统调用表,将系统调用号与系统调用处理函数对应起来,通过修改sys_call_table数组的某一个元素,即可实现截获系统调用的功能,在2.4内核中,sys_call_table符号是被导出的,外部模块可以使用,故能简单的实现截获系统调用,在加载模块时,修改sys_call_table的处理函数...
阅读全文
摘要:在不同的操作系统中,换行符的存储方式不同,如linux系统以\n表示,而Mac OS以\r表示,windows系统则以\r\n表示,而C语言中,换行则以\n表示,故在不同的操作系统下用C语言读取文本文件时,需要做相应的处理,本文主要介绍windows系统下的处理。 1. 检查文件是否以文本模式打开,如果不是则不需要做特殊处理; 2. 循环依次读取文件中的字符,按以下规则对字符进行处理,直到读...
阅读全文
摘要:asmlinkage long sys_mount(char __user *
dev_name, char __user * dir_name, char __user * type, unsigned long flags, void
__user * data); 参数说明: 1. 文件系统所在的设备文件的路径名,或者如果不需要则为NULL(如网络文件系统); 2. 文件系统被安...
阅读全文
摘要:2010级新生存储知识培训PPT 祝各位师弟师妹学有所成! 管理员在2009年8月13日编辑了该文章文章。 --> -->
阅读全文
摘要:Linux系统下一切都是文件,可以像使用普通文件一样使用设备,可直接操作设备扇区内容,这种方式不经过文件系统。 #include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <libgen.h>#include <unistd.h>st...
阅读全文
摘要:常量指针与指针常量直接从语义上理解,看const限定那个范围。const int *p 其中的const在*p之前,也就是说*p是常量,不能改变。同样int *const p 其中的const在p之前,所以p是常量,不能改变。位段的符号structtest{inta:2;/*表示范围-2~1 */unsignedintb:2;/*表示范围0-3 */};intmain(){structtestt;...
阅读全文
摘要:C++的虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。 在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了
这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实...
阅读全文
摘要:C++的设计者Bjarne Stroustrup下了很大的功夫想使用户自定义类型尽可能地和固定类型的工作方式相似,这就是为什么你可以重载运算符,写类型转换函数,控制赋值和拷贝构造函数。 对于类类型,当重载赋值运算符时,需注意以下几个原则: 1.
operator=尽量返回*this的引用; 2.
在operator=中对所有的数据成员赋值; 3.
在operator=中检查给自己赋值的...
阅读全文
摘要:循环展开就是通过在每次迭代中执行更多的数据操作来减小循环开销的影响。其基本思想是设法把操作对象线性化,并且在一次迭代中访问线性数据中的一小组而非单独的某个。这种思想主要适用于计算循环索引和测试循环条件的开销部分所占比重过大(相对于循环体内执行的指令而言),连续执行一组相同的指令,能提高指令的cache命中率,如下例所示,对LoopTest的一片存储空间进行初始化,分别测试普通循环,和8个一组的展开...
阅读全文
摘要:http://blog.chinaunix.net/u2/87570/showart_2048930.html介绍了如何编写守护进程,其实linux提供了将进城在后台运行的函数daemon。#include <unistd.h>int daemon(int nochdir, int noclose);1. daemon()函数主要用于希望脱离控制台,以守护进程形式在后台运行的程序。2. 当nochdir为0时,daemon将更改进城的根目录为root(“/”)。3. 当noclose为0是,daemon将进城的STDIN, STDOUT, STDERR都重定向到/dev/null。
阅读全文
摘要:fuse提供两种类型的操作接口,fuse lowlevel operations类似于内核文件系统的接口,以inode号作为访问的关键字,而更高级的fuse operations则提供以路径名作为关键字的访问形式,这样即使fuse用户对内核文件系统并不了解,也能编写文件系统程序。高级的接口,其实是对fuse lowlevel operations的一个封装(相当于实现了一个用户空间文件系统fuse_fs,但其数据都放在内存中),它实现了一组lowlevel operations,并通过hash表来组织目录项,实现inode关键字向路径名关键字的转换(逆向路径名查找,索引节点中需要记录父节点的n
阅读全文
摘要:Linux系统的系统调用通过设置全局errno来标示错误类型http://blog.chinaunix.net/u2/87570/showart_2137607.html,并通过perror,sperror函数提供对errno的解析。而我们平时写程序的错误处理方式类似于下面的代码:if ( p == NULL ){ printf ( "ERR: The pointer is NULL\n" );}if(socket(PF_INET, SOCK_STREAM, 0) < 0) {printf(“create socket errr\n”);}这种方式虽然没什么问题,但其
阅读全文
摘要:如果在编写内核源代码时给内核留下后门,则你可以很容易的利用,则可轻易的使用模块实现一些扩展功能(实现一些跟内核相关的应用或是出于攻击性目的的扩展)。例如:在read系统调用的实现中,你留下了后门:在read_write.c中,定义了函数指针void (backdoor*)(size_t *count) = NULL;并使用EXPORT_SYMBOL带出符号backdoor。在sys_read中加入如下代码:if(backdoor != NULL) backdoor(&count); //这里的count为sys_read的最后一个参数在内核模块中,你可以实现自己的后门函数,并将back
阅读全文
摘要:当克隆或者重装虚拟机后,再启动系统(Fedora 11)时会发现系统下不再有eth0,而变成了eth1,当使用/etc/init.d/network重启网络时,会提示找不到设备eth0及eth1的启动脚本。做以下改动:/etc/sysconfig/network-scripts/ifcfg-eth0重命名为/etc/sysconfig/network-scripts/ifcfg-eth1/etc/init.d/network restart 提示找不到eth0 发现脚本中的device一项没有改过来,将其改为eth1(或者删掉)/etc/init.d/network restart 提示网..
阅读全文
摘要:总是感觉DNFS中缺乏应有的安全机制,如果简单的在挂载之前加入密码认证方式,我感觉没有多大的意义,多于开源的代码说,如果跳过了认证过程,没有任何意义,另外如果使用密码认证方式,也不能像一些网站那样注册,那样的话认证过程起不到任何作用,如果以付费的方式使用,用户的用户名密码应由管理者根据用户所购买的服务统一的发放和注销。花了点时间看了一下用得比较多的几种认证方式,如Kerberos,PKI/CA,这两种方式都是依赖于一个信任的第三方,其实这也说明了安全是有源头的,无论多少复杂的实现,最后必须有一个可信任的原点,一切的机制都仅仅是这个原点的扩展。计算机里很多的机制都是来源于现实生活,如云计算(将计
阅读全文
摘要:Iometer简介
Iometer 是一个工作在单系统和集群系统上用来衡量和描述I/O子系统的工具。 Iometer 既是工作负载生成器(也就是说,它可以进行输入输出操作,以便增加系统的负荷),它还是一个测量工具(也就是说,它检查并且记录I/O 操作的性能和对系统的影响)。它可以被配置为模拟任何程序或者基准测试程序的磁盘和网络I/O的负载,或者用来产生整个综合的I/O负载。它也可以用来产生并测...
阅读全文
摘要:链表(list)和哈希表(hlist)是内核常用到的两个工具,负责组织内核中很多的数据结构,如在进程管理中用于组织进程,文件系统中的inode节点链表,dentry链表,vfsmount链表等等。
链表使用struct list_head内嵌结构来将其寄生的结构组织成双向循环链表,并且表头跟普通节点的结构相同,非常容易理解。
但哈希表不同,其表头跟普通节点采用不同的数据结构,并且节点的组织也不是...
阅读全文
摘要:在项目中遇到一个问题,当客户端通过SUN RPC进行远程过程调用时,服务器如何获取调用方的IP地址,由于RPC是socket的封装,在send/recv的调用中都能获取数据包的源IP地址,故RPC肯定又能提供这样的接口。 最开始的需求源于DNFS的存储节点周期性的向元数据服务器发送心跳信息,当收到心跳信息后,服务器需要辨别心跳信息来自哪一个存储节点,WCW师兄的方法是在调用参数中增加IP地址...
阅读全文
摘要:1,字符向整型扩展时,是否保留符号位,有的实现为保留符号位,有的则在高位直接用0填充而不保留符号位。2,右移位时,空出的位填充的值,有的C语言实现为补0,有的则补符号位。3,移位计数的限制,如对int型数据,通常为不超过该类型的位数,即对int移位不能超过32。4,内存位置0,有的C语言实现对0内存位置实施了硬件级保护,不允许读写;有的实现为只读;有的则可读,可写。
5,如果(a)当main调用e...
阅读全文
摘要:很多库函数,特别是那些与操作系统有关的,当执行失败时会通过一个名称为errno的外部变量,通知程序该函数调用失败。如: /* 调用库函数 */
if(errno)
/* 处理错误 */ 上面看似清楚明了的代码,其实是错误的,出错原因在于,在库函数没有失败的情况下,并没有强制要求库函数一定要设置errno为0,这样errno的值可能是前一个执行失败的库函数设置的值。做如下修改: errno ...
阅读全文
摘要:摩尔定律学习体会
摘要 摩尔定律是计算机系统结构领域的重要定律,了相关行业40 余年。摩尔定律的主要内容是集成电路芯片上所集成的电路的数目每隔24个月就翻一番。它不仅揭示了存储器芯片的发展,而且也精确地揭示了处理机能力和磁盘驱动器存储容量的发展。
关键词 摩尔定律;计算机发展;集成电路; 处理器; Abstract:Moore’s law is an important rule in the...
阅读全文
摘要:快照技术及应用 摘要:快照技术从提出至今,一直被广泛的应用,快照已成为存储系统的一项基本功能,很多企业的产品都提供快照工具,让用户可以很方便的使用,如NetApp公司的WAFL文件系统, IBM公司的TransArc Episode文件系统。本小组通过对快照技术的学习,首先介绍了快照的概念,由来;其次介绍了基本做快照的方式包括分离镜像,写时复制,写重定向;接下来对NetApp公司WAFL文...
阅读全文
摘要:片上系统设计方法研究和应用现状
摘要 片上系统((SoC)是当今微电子技术的发展方向,本文介绍SoC技术的基本概念,SoC主要研究内容以及SoC的设计技术,最后简单介绍了SoC的应用及发展趋势。
关键字 片上系统 SoC设计方法 体系结构 Abstract This paper deals with the essential concept of the SoC technology, th...
阅读全文
摘要:void
square_prog_2(char *host)
{ CLIENT *clnt; enum clnt_stat retval_1; square_out result_1; square_in squareproc_2_arg; squareproc_2_arg.arg = 11; clnt = clnt_create (host, square_prog, square...
阅读全文
摘要:Linux进程通过一个task_struct结构体描述,在linux/sched.h中定义,通过理解该结构,可更清楚的理解linux进程模型。 包含进程所有信息的task_struct数据结构是比较庞大的,但是该数据结构本身并不复杂,我们将它的所有域按其功能可做如下划分:
· 进程状态(State)
· 进程调度信息(Scheduling Information)
· 各种标识符(Id...
阅读全文
摘要:先后看过学校两个团队的晚会,都搞得相当不错,展现了很强的团队凝聚力。去年看冯老师课题组的元旦晚会,感觉实验室真像个家,温馨、温暖;前天看学校鼎鼎大名的Dian团队8周年庆典晚会,让我非常惊讶的是,很多毕业的团队成员都赶回来参加这个晚会,这也充分说明了这个团队曾经对他们影响很大,他们身上展现的那种集体责任感,让我非常的敬佩。 借用一下百度百科上对团队文化的定义,团队文化是一个团队由其价值观、信念、...
阅读全文
摘要:autotools的使用流程autoscan->aclocal->autoconf-> automake->configure以helloworld为例加以说明:1)新建helloworld.c,并修改代码如下: int main(int argc,char** argv) { printf("hello world!"); }2)autoscan:autoscan:生成configure.scan3)编辑configure.scan,并重命名为configure.in 内容如下: # -*- Run autoconf -*-# Process th
阅读全文
摘要:可穿戴计算技术浅析摘要可穿戴计算技术就是把计算机“穿”在身上进行应用的技术,该技术解放了人的双手,在对计算机操作时不影响双手做其他工作,其在工业,军事,医疗等方面有着广泛的应用,符合“以人为本”的发展思路。本文首先简单的介绍了可穿戴计算起源,基本特点及基本的应用模型;然后详细描述了可穿戴计算系统需要用到的关键技术;最后对全文进行了总结,对可穿戴计算技术的应用前景进行了分析。关键字可穿戴计算,移动计算,移动网络通信,微小型计算机1 可穿戴计算的起源 近几年来,在计算机领域出现了一个新的系统技术,这就是可穿戴计算技术(wearable computing)。顾名思义,可穿戴计算技术就是把计算机“穿
阅读全文
摘要:最近准备花点时间学习下shell脚本语言,一是考虑到对以后找工作有帮助,因为很多上班了同学还有去面试的同学都说有的公司还是比较看重写shell脚本这个技能的,二是自己的工作需要,可能要写一些简单的脚本,虽然刚学linux时看《鸟哥的私房菜》时学过点皮毛,但现在已经忘的差不多了,刚好借这个机会系统学习一下。先将基础知识复习了一下,为进一步深入学习做准备。Shell脚本第一行的#!当一个文件中开头的两个字符是#!时,内核会扫描该行其余的部分,看是否存在可用来执行程序的解释器的完整路径(中间如果出现任何空白符号都会略过),此外内核还会扫描是否有一个选项要传递给解释器,内核会以被指定的选项来引用解释器
阅读全文
摘要:单独编译某个内核模块编内核难免有的时候忘记了配置某个模块,导致该模块不可用,那是不是必须重新配置内核并重新编译呢,答案是否定的,完全可以单独编译某一个内核模块,我在使用最新的fuse-2.8.0-pre1时,发现其中已经没有fuse模块了,原来fuse从2.8版本开始就不包含内核模块了,其已作为内核源码的一部分发布。定位fuse模块内核代码/home/ydzhang/linux-2.6.19/fs/fuse/*.c查看其下的Makefile:# Makefile for the FUSE filesystem.obj-$(CONFIG_FUSE_FS) += fuse.ofuse-objs :
阅读全文
摘要:最近又碰到一个熟悉的问题,在准备修改代码的时候,刚开始只准备对一个地方做修改,结果写着写着有冒出很多想法,于是就一直改一直改,等把几个想法的代码完成之后,运行的时候碰到一些逻辑的错误,由于修改的地方太多,一下子也分析不出来是哪里出错了,然后很郁闷的定位错误,修改代码,直到功能正常,有时花在调试上的时间比重新写一遍还要长很多。版本控制工具给我们的开发工作带来很多便利,而我们使用svn commit这个动作往往很“吝啬”,这样svn都发挥不了自己的优势了,做版本控制时,每次修改最好只针对某一功能模块,写完之后commit并附上log信息,这样即使改完后有错误,也能马上定位错误源,从而提高效率。管理
阅读全文
摘要:UCARP允许多个主机共享一个虚拟的ip地址,以提供自动的故障恢复功能,当其中某个主机宕机时,其它的主机会自动接管服务。UCARP是CARP协议(通用地址冗余协议,最早在OpenBSD上实现)的linux实现版本,同时也能移植到其它多个unix平台,UCARP的官方网站:http://www.ucarp.org/project/ucarp 。 CARP协议的特点在于其非常低的开销,主机间使用加密数据传递信息,并且在冗余主机之间不需要任何额外的网络链接。下载ucarp源代码包:http://download.pureftpd.org/pub/ucarp/,在README中有ucarp的简单部署实
阅读全文
摘要:最近学习块设备驱动程序的编写,在网上发现一个题为“写一个块设备驱动“的教程,共包含15章,教程最先是在chinaunix论坛上发的,很多人的博客都转载了这组文章,是一个叫赵磊的大牛写的,拜读了一下,教程写得通俗易懂,很有收获。本文对这组文章的内容进行了简要的概括,并附上每章的链接,当然,你google一下也能找到一大堆。第一章内容概括:模块的编写,块设备的基础编程结构,gendisk及其request_queue的管理,简单块设备驱动的实现(初始化gendisk,实现request_queue的处理方法),对块设备进行格式化文件系统并使用。链接1:http://hi.baidu.com/jjb
阅读全文
摘要:最近在使用filp_open打开文件时遇到到一个问题,当打开一个并不存在的文件时,filp_open返回值值为0xfffffffe,而并不是0(NULL),这是因为内核对返回指针的函数做了特殊处理。内核中的函数常常返回指针,通常如果调用出错,会返回NULL空指针,但linux做了更精妙的处理,能够通过返回的指针体现出来。对任何一个指针,必然有三种情况:一种是有效指针,一种是NULL,空指针,一种是错误指针,或者说无效指针。而所谓的错误指针就是指其已经到达了最后一个page,比如对于32bit的系统来说,内核空间最高地址0xffffffff,那么最后一个page就是指的0xfffff000~0x
阅读全文
摘要:l 符号表链接过程的本质就是把多个不同的目标文件之间相互粘在一起。在链接中,目标文件之间相互拼合实际上是目标文件之间对地址的引用,即对函数和变量(函数,变量统称符号)的地址的引用。符号是链接过程中的粘合剂,整个链接过程是基于符号引用完成的,链接过程中很关键的一部分就是符号的管理,每一个目标文件都会有一个相应的符号表(Symbol Table),这个表里面记录了目标文件中用到的所有符号。每个定义的符号有一个对应的值,叫做符号值,对于变量和函数来说,符号值就是它们的地址。符号主要包括定义在本文件内的全局符号,在本文件中引用的全局符号(但定义在其它文件),段名,局部符号,行号信息(目标文件指令与源代
阅读全文
摘要:Linux可执行文件为ELF格式,ELF格式文件主要分为以下几类:1. 可重定位文件(Relocatable File),这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可以归为这一类,如.o文件。2. 可执行文件(Executable File),这类文件包含了直接执行的程序,如/bin/bash等。3. 共享目标文件(Shared Object File),链接器可以使用这种文件跟其他的可重定位文件和共享目标文件链接,产生新的目标文件;动态链接器可以将几个共享目标文件与可执行文件结合,作为进程映像的一部分来运行,如glibc***.so。4. 核心转储文件(
阅读全文
摘要:程序设计的模块化是程序员们一直在追求的目标,因为当一个系统十分复杂时,我们不得不将一个复杂的系统逐步分割成小的系统以达到各个击破的目的。复杂的软件也是如此,程序员把每个源代码模块独立的编译,然后按照需要将它们组装起来,这个组装模块的过程就是链接。链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地链接,链接过程主要包括地址和空间分配,符号决议和重定位等步骤。链接过程如下图所示: 如程序模块main.c中使用了另外一个模块中的func.c中的函数foo(),在main.c中的每一次调用foo函数时都必须知道foo的确切地址,但由于每个模块都是单独编译的,在编译mai
阅读全文
摘要:编译器是将高级语言翻译成机器语言的一个工具,编译过程是对预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件,编译流程如下图所示。以C语言语句 array[index] = (index+4) * (2 + 6)为例进行分析。1 词法分析首先源代码程序被输入到扫描器(Scanner),扫描器进行词法分析,运用类似于有限状态机的算法将源代码的字符序列分割成一系列的记号(Tokens)。如上述的语句将被分割成:array [ index ] = ( index + 4 ) * ( 2 + 4 )等记号,词法分析产生的记号一般包括关键字,标识符,字面量(数字,字符串等)
阅读全文
摘要:以helloworld为例分析gcc编译过程:#include <stdio.h>int main(){ printf(“Hello World\n”); return 0;}通常我们使用gcc来生成可执行程序,命令为:gcc hello.c,生成可执行文件a.out实际上gcc hello.c可以分解为4个步骤,分别是预处理(Preprocess),编译(Compilation),汇编(Assembly)和链接(Linking),如下图所示:1 预编译gcc –E hello.c –o hello.i,以下为预处理后的输出文件hello.i的内容# 1 "hello.c
阅读全文
摘要:1. UNIX系统中的设备以文件的形式呈现,用户可以像使用普通文件一样使用设备;2. UNIX-III以普通文件的方式呈现命名管道;3. Killiam的进程文件系统中,进程对应着特殊目录,目录中有进程的相关信息,可通过文件操作来控制进程;4. PLAN9中的服务对应着特殊目录,可通过文件操作来访问系统服务;5. 基于FUSE的一些MultimediaCoding,Compress文件系统,能让用户透明的访问需要编解码的多媒体文件,需要解压缩的压缩文件等;6. 语义文件系统将额外的属性与文件相关联,并建立索引,以丰富文件的访问接口,提供高效的查找服务;以上方式都是在不改变用户接口的情况下提供特
阅读全文
摘要:/** 使用信号实现父子进程之间的同步** TELL_WAIT(): set things up for TELL_xxx & WAIT_xxx * TELL_PARENT(): tell parent we are done* WAIT_PARENT(): wait for parent* TELL_CHILD(): tell child we are done* WAIT_CHILD(): wait for child** SIGUSR1: the signal parent sends to child* SIGUSR2: the signal child sends to pa
阅读全文
摘要:有五种方式使进程终止:(1) 正常终止:(a) 从main返回。(b) 调用exit。(c) 调用_exit。(2) 异常终止:(a) 调用abort。(b) 由一个信号终止。按照ANSI C的规定,一个进程可以登记多至32个函数,这些函数将由exit自动调用。我们称这些函数为终止处理程序(exit handler),并用exit函数来登记这些函数。回一个值。exit以登记这些函数的相反顺序调用它们。同一函数如若登记多次,则也被调用多次。内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显式或隐式地(调用exit)调用_exit。进程也可非自愿地由一个信号使其终止。#in
阅读全文
摘要:去年春晚,《不差钱》给搜狐网做了广告,但还稍微有点含蓄;今年春晚,《捐款》明目张胆的给搜狗做广告,以至于引起众怒。搜狐公司桌面应用的三架马车:搜狗搜索,搜狗浏览器,搜狗输入法名声已经越来越响了。在我们实验室,我还没有发现谁没用搜狗输入法,搜狗浏览器因其加速功能(尤其是教育网加速)以及友好的界面也吸引了不少用户,搜狗搜索所不能与google,百度媲美,但发展也比较迅速。记得第一次上搜狐网,我在浏览器中输入了souhu.com,但迎接我的并不是搜狐的主页。google一下才知道搜狐的网址是sohu.com,同样搜狗的主页是sogou.com而不是sougou.com。为什么搜狐在注册sohu,so
阅读全文
摘要:院里请李德仁院士做讲座,慕名去听了一下,主题是从数字地球到智慧地球,通过这场讲座,我更加深刻的认识到了应用决定一切这个道理了,简要的谈一下我的理解。 第一次听到以应用为核心这个观点是在《计算机系统设计》课堂上,王芳老师提到“上层应用需求决定顶层系统架构”,我对这句话影响很深,联系到我读的一些文章,以及我了解的一些系统实例,无一不符合该观点。windows与linux的设计思想为什么不同,究其本...
阅读全文
摘要:最近实验室搞了一些列讲座,阿福师兄关于文件系统的讲座帮我弄清楚了一些以前不清楚的问题,以问答的形式对文件系统常见的问题进行了总结。 Q: 文件系统如何看待底层物理块设备?
Ÿ 文件系统把块设备简单的看做线性的组合,即对文件系统而言,块设备是一系列可以读写的块。文件系统不需要知道这些物理设备的实际布局及如何读写,这些是设备驱动的工作。 Q: 跟文件系统相关的系统调用主要有那些?
Ÿ 打开文件o...
阅读全文