<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[iceshirley的专栏]]></title><description><![CDATA[千里之行，始于足下]]></description><link>https://blog.youkuaiyun.com/iceshirley</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; iceshirley]]></copyright><item><title><![CDATA[谈谈操作符重载]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/5747498</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/5747498</guid><author>iceshirley</author><pubDate>Mon, 19 Jul 2010 21:15:00 +0800</pubDate><description><![CDATA[重载操作符使得程序员能够为类类型的操作数定义预定义的操作符版本。]]></description><category></category></item><item><title><![CDATA[类的析构函数]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/5729115</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/5729115</guid><author>iceshirley</author><pubDate>Mon, 12 Jul 2010 15:45:00 +0800</pubDate><description><![CDATA[类的析构函数基本知识点]]></description><category></category></item><item><title><![CDATA[类的构造函数]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/5720229</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/5720229</guid><author>iceshirley</author><pubDate>Thu, 08 Jul 2010 09:46:00 +0800</pubDate><description><![CDATA[本节叙述了类的构造函数方面的一些基本知识，这些基础都需要牢记于心的。]]></description><category></category></item><item><title><![CDATA[为何要考虑字节对齐？]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/5691441</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/5691441</guid><author>iceshirley</author><pubDate>Thu, 24 Jun 2010 14:08:00 +0800</pubDate><description><![CDATA[本文讲述计算机为何采用字节对齐的原因]]></description><category></category></item><item><title><![CDATA[C++何时要使用成员初始化列表]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/5688696</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/5688696</guid><author>iceshirley</author><pubDate>Wed, 23 Jun 2010 11:05:00 +0800</pubDate><description><![CDATA[本文阐述了C++中那些情况要使用成员初始化列表。]]></description><category></category></item><item><title><![CDATA[封底计算与费米问题]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/5667066</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/5667066</guid><author>iceshirley</author><pubDate>Sat, 12 Jun 2010 17:00:00 +0800</pubDate><description><![CDATA[    封底计算，英文为back-of-the-envelope calculations (BotEC)，这个术语由物理学家恩里科
·费米创造，指用简单到可以在手边随便的什么小纸片——比如信封的背面上——进行的计算，对复杂的方程作同一数量级内的近似求解。
     ]]></description><category></category></item><item><title><![CDATA[拷贝构造函数调用的时机]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/4152602</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/4152602</guid><author>iceshirley</author><pubDate>Tue, 05 May 2009 18:58:00 +0800</pubDate><description><![CDATA[拷贝函数何时会被调用呢？最明显的就是用一个类对象初始化另外一个对象的时候比如X a=X(); 这句语义上就是先创建X()临时对象，再调用X的拷贝构造函数“初始化”a， 这只是语义上的，编译器完全可能优化掉临时对象 。注意区分初始化和赋值（调用assignment operator）第二种情况是函数按值传参数的时候，包括指针在内都是对原有的值的拷贝 。这种情况容易理解。第三种情况是一个对象以值传递的]]></description><category></category></item><item><title><![CDATA[Linux IO调度层分析-3]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/3997630</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/3997630</guid><author>iceshirley</author><pubDate>Tue, 17 Mar 2009 11:49:00 +0800</pubDate><description><![CDATA[ 我们知道，每个块设备程序都有一个请求队列与之关联。在块设备初始化时，会分配并初始化请求队列。在这个时候，我们便可以为块设备驱动程序指定特定的IO调度算法，默认情况下是强制使用系统默认的调度算法。熟悉块设备驱动的人知道，内核是通过generic_make_request函数来不断转发bio，直到该bio被挂载到物理设备的请求队列中。generic_make_request函数会获取bio所]]></description><category></category></item><item><title><![CDATA[Linux IO调度层分析-2]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/3997618</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/3997618</guid><author>iceshirley</author><pubDate>Tue, 17 Mar 2009 11:47:00 +0800</pubDate><description><![CDATA[ Deadline算法维护5个队列，除了请求队列以外，算法还使用了四个队列。其中两个排序队列分别包含读请求和写请求，这个队列是按照起始扇区数来排序的。另外两个最后期限队列包含相同的读和写请求，只不过它们是根据其“最后期限”排序的。这两个队列的目的是为了避免请求饿死。因为电梯策略优先处理与上一个处理请求最近的请求，因而就会对摸个请求忽略很长一段时间，这时就会发生这个情况。请求的最后期限本质上就是]]></description><category></category></item><item><title><![CDATA[Linux IO调度层分析-1]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/3997560</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/3997560</guid><author>iceshirley</author><pubDate>Tue, 17 Mar 2009 11:35:00 +0800</pubDate><description><![CDATA[ Linux IO调度程序是块设备I/O子系统的主要组件，它介于通用块层和块设备驱动程序之间，所图2-1所示。当Linux内核组件要读写一些数据时，并不是请求一发出，内核便立即执行该请求，而是将其推迟执行。延迟的设定是块设备性能的关键机制！当传输一个新数据块时，内核检查能否通过扩展前一个一直处于等待状态的请求而满足新请求。  图 IO调度层所在系统中的位置       在2.6]]></description><category></category></item><item><title><![CDATA[ MD模块之处理读写过程分析-4]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/3983027</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/3983027</guid><author>iceshirley</author><pubDate>Thu, 12 Mar 2009 10:07:00 +0800</pubDate><description><![CDATA[MD在处理读写错误时是不一样的。写数据发生错误时处理较简单，读发生错误时会比较麻烦，它会把读不出来的数据通过计算出来，然后在重新写回磁盘上。首先先看看如何处理写错误的。1、写数据时发生错误     如果写发生错误，那么回调函数raid5_end_write_request()中bio的BIO_UPTODATE位无效，调用md_error函数将相应的rdev置为Faulty，清除掉In_sy]]></description><category></category></item><item><title><![CDATA[ MD模块之处理读写过程分析-3]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/3849840</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/3849840</guid><author>iceshirley</author><pubDate>Thu, 22 Jan 2009 10:43:00 +0800</pubDate><description><![CDATA[这节我们来分析神奇而又NB的handle_stripe，2.6.21版本的处理raid5和raid6分别用handle_stripe5和handle_stripe6这两个函数，我们这里主要说handle_stripe5，handle_stripe6和handle_stripe5其实差不多，只要你理解raid6的原理并理解了handle_stripe5，那么handle_stripe6自然便明白了。]]></description><category></category></item><item><title><![CDATA[MD模块之处理读写过程分析-2]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/3848982</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/3848982</guid><author>iceshirley</author><pubDate>Wed, 21 Jan 2009 16:03:00 +0800</pubDate><description><![CDATA[这一节讲述raid5模块中处理读写流程。这个过程很复杂，最关键的函数就是handle_stripe，处理一次读或写都会多次调用这个函数才能完成。当然，这个函数也是raid5模块的一个核心函数，他还负责同步，重建，以及扩展的实现。在分析之前，我们需要准备一些预备知识：一、条带：我们知道，raid5是以条带为基本单位来存取数据的。如下图所示：raid5还有其它中数据分布方式，这里只列出一种]]></description><category></category></item><item><title><![CDATA[MD模块之处理读写过程分析-1]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/3838818</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/3838818</guid><author>iceshirley</author><pubDate>Tue, 20 Jan 2009 10:18:00 +0800</pubDate><description><![CDATA[       md可以说是一个虚拟的设备驱动层，它属于块设备驱动，拥有块设备驱动的特点。所以，他实现了块设备操作接口 static struct block_device_operations md_fops ={	.owner		= THIS_MODULE,	.open		= md_open,	.release	= md_release,	.ioctl		= md_i]]></description><category></category></item><item><title><![CDATA[08年工作感受]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/3838698</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/3838698</guid><author>iceshirley</author><pubDate>Tue, 20 Jan 2009 09:34:00 +0800</pubDate><description><![CDATA[      时光飞逝，从步入工作开始到现在已经快一年了，在这近一年的工作学习中，感觉自己收获还是不少的。从一个Linux驱动方面的门外汉，变成了初级学习者，学习了linux内核以及驱动方面的相关知识，把LDD3看了几遍，阅读了linux内核中MD模块，参与了项目的设计-》开发-》调试-》验收过程。一路走来，有困难会与你作对，也有快乐围绕在你身边。不管怎样发生，我们要有一个健康的心态去面对。  ]]></description><category></category></item><item><title><![CDATA[使用emacs作为编辑环境]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/2846977</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/2846977</guid><author>iceshirley</author><pubDate>Fri, 29 Aug 2008 10:37:00 +0800</pubDate><description><![CDATA[        众所周知，在linux下做开发离不开两个常用的编辑器---vi和emacs。vi我用的不多，不好做评价。emacs功能非常强大，扩展能力强。网上有很多插件，可以丰富你的emacs功能。开始使用emacs会觉得很难用，呵呵，一般nb的东西都是这样。。。。如果你上手了，那么你就会体验到它强大的功能了。下面就来讲讲emacs环境的配置。        配置emacs主要就是安装插件，]]></description><category></category></item><item><title><![CDATA[工作了，又开始了一段新的探索]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/2786548</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/2786548</guid><author>iceshirley</author><pubDate>Fri, 08 Aug 2008 11:52:00 +0800</pubDate><description><![CDATA[毕业了，走上了工作岗位，从事了磁盘阵列方面的软件开发，涉及到了linux驱动以及内核方面的知识。以前在学校的时候觉得内核和驱动好难，看了一段时间放弃了。没想工作了又干起来这到我和这东西还真有缘，没办法，不像在学校里那样说不干就不干，只好硬着头皮慢慢摸索。到现在看了MD和raid5已经快2个月了，raid5看的基本差不多了，MD还需要进一步研究。在这个过程中我要感谢knightraincn，在我看M]]></description><category></category></item><item><title><![CDATA[函数返回局部地址的问题]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/2421529</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/2421529</guid><author>iceshirley</author><pubDate>Fri, 09 May 2008 11:51:00 +0800</pubDate><description><![CDATA[当我们的函数返回一个局部地址时,编译器通常会发出一条警告“warning:address of local variable XXXXX returnd”。例如：char * func()...{    char s[200];    return s;}由于s在栈上分配的，其声明周期随这函数的结束而结束，从而错误操作内存。解决方法1、将s声明为static。2、在函数内动态申]]></description><category></category></item><item><title><![CDATA[c/c++函数间动态内存传递问题]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/2421278</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/2421278</guid><author>iceshirley</author><pubDate>Fri, 09 May 2008 11:19:00 +0800</pubDate><description><![CDATA[我们经常能遇到这样一种问题，既是声明一个指针，然后想在相关的函数中对其进行分配空间。这样问题如果操作不当，不仅造成内存泄露，而且得不到相应的结果。先看以下例子void allocMemory(char *p)...{    p=(char *)malloc(sizeof(char)*128);}int main()...{    char *s=NULL;    allocMemory(s]]></description><category></category></item><item><title><![CDATA[c&c++函数调用的一个区别]]></title><link>https://blog.youkuaiyun.com/iceshirley/article/details/2415119</link><guid>https://blog.youkuaiyun.com/iceshirley/article/details/2415119</guid><author>iceshirley</author><pubDate>Thu, 08 May 2008 10:51:00 +0800</pubDate><description><![CDATA[        我们知道，在c语言中，函数的名字是全局可见的。举个例子来说，如果我们在fun.c中引用fun1.c中的一个函数，例如fun1（），哪么，在fun.c中无需声明fun1（）便可以直接引用它。代码如下：fun.h文件#ifndef _FUN_H_#define _FUN_H_#includestdio.h>#endiffun.c文件#inlucde"fun.]]></description><category></category></item></channel></rss>