自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ycnian

这个人很懒,他什么也没有留下

  • 博客(71)
  • 收藏
  • 关注

原创 Goodbye CSDN

折腾了一个月,自己的网站终于建好了。申请域名、找主机空间、搭建网站、最后又将CSDN博客中几十篇文章一篇篇粘过去,类死了。以后CSDN博客就不更新了,欢迎去我的新家做客。http://ycnian.org/

2014-01-25 12:53:22 1558 4

原创 LVM逻辑卷配置

配置过几次LVM,但是由于间隔比较常,每次配置前都需要先上网查资料。好吧,我写在自己的博客中,以后就看这里的配置过程了。LVM是一种逻辑卷,主要解决物理卷(就是磁盘)空间划分的问题。由于我们在安装操作系统时不可能准确预见各个目录需要多少空间,因此系统长时间(比如运行了几年)运行后可能出现某个目录空间不足的情况。举个最简单的例子,假设机器上硬盘容量是200G,全部划分给根目录(这是最省心的一种办法)

2013-11-16 11:13:28 2117

原创 dlmalloc(四)

这篇文章我们来讲讲释放内存的过程,也就是free()的代码流程。对于应用程序来说释放内存很简单,直接调用free(ptr)就可以了,参数是要释放的内存块指针。那么,释放内存时dlmalloc做了哪些工作呢?

2013-10-28 11:03:40 2649

原创 dlmalloc(三)

有了上篇文章的基础,现在可以详细分析malloc()申请内存的流程了,代码如下:void* dlmalloc(size_t bytes) { /* Basic algorithm: 算法描述 If a small request (< 256 bytes minus per-chunk overhead): 1. If one exists, us

2013-10-25 15:53:23 4216

原创 dlmalloc(二)

dlmalloc

2013-10-24 16:43:57 4216

原创 dlmalloc(一)

我们写过很多C程序了,经常会分配内存。记得刚学C语言时老师说过,可以向两个地方申请内存:一个是栈、一个是堆。小块内存向栈申请,函数调用结束后程序会自动释放内存。大块内存向堆申请,记得一定要自己释放,否则会造成内存泄漏。向堆申请内存直接调用malloc()就可以了,参数是你申请的内存量。释放内存时直接调用free()就可以了,参数是内存块指针。看似平静的海面,海底则波涛汹涌。当时还没有学操作系统

2013-10-23 15:37:26 10110 3

原创 字符串处理函数

这篇文章中我想讨论下strlen()的问题。strlen()的作用是计算一个字符串的长度,最简单的代码如下:size_t strlen(const char *str){ const char *s; for (s = str; *s; ++s) ; return (s - str);}

2013-10-22 17:04:46 964

原创 数学函数库(三)

上一篇文章中我们以truncf()为例讲解了数学函数的处理过程,可以看出处理过程还是很麻烦的。而且需要注意的是我们挑选的是一个很简单的函数,其他数学函数的处理过程更麻烦。因此一些处理器集成了浮点运算单元,通过硬件计算数学函数,从而加快了数学函数的处理过程。这篇文章中,我想以X86架构为例说明硬件处理数学函数的过程。

2013-10-21 18:04:41 1323

原创 数学函数库(二)

上一篇文章中我们熟悉了浮点数在内存中的存储方式,这篇文章中我们来分析一下数学库中提供的函数。数学库中包含了很多函数,比如取整函数、三角函数、指数对数函数、贝塞尔函数、伽马函数等等,很多函数是对具体一个算法或数学问题的描述。我们从中挑选了一个简单的函数,目的是分析清楚数学库中浮点数的处理过程,同时又不要陷入数学问题当中。我们挑选的函数是truncf(),这个函数声明如下:float truncf

2013-10-21 16:12:48 1171

原创 数学函数库(一)

首先来看下面这个小程序#include int main(){ float var1 = 33554434.0; float var2 = 33554433.0; printf("%f\n", var1 - var2); return 0;}程序很简单,那么这段代码的输出是什么呢?遗憾地告诉大家:这段代码的输出

2013-10-21 13:42:35 1214

原创 最小C基础库

还是从我们最熟悉的程序说起,我们学编程时接触到的第一个程序就是helloworld,代码如下:#include int main(){ printf("hello world\n"); return 0;}我们使用gcc编译这个程序  gcc -o helloworld  hellworld.c就可以生成可执行文件helloworld,执

2013-10-12 23:05:38 1958

原创 C基础库

最近看了点C基础库的代码,主要是Android系统的C基础库bionic,对比浏览了一些glibc的代码,多少有一些收获吧。好久没更新博客了,写几篇C基础库的文章算是记录这段时间的学习过程吧。    C基础库是操作系统中最底层的函数库,提供了大量的基础函数,比如标准I/O函数、字符处理函数、字符串处理函数、数学函数、内存分配器等,基本上就是实现了C99标准中规定的函数。C基础库之所以称为“基础

2013-10-12 22:37:19 1620

原创 排序算法

排序算法

2013-07-23 16:36:16 865

原创 二叉树

二叉树是一种树型结构,二叉树的特点是每个节点最多可以有两棵子树。并且,二叉树的两棵子树有左右之分,其次序不能颠倒。二叉树有下面三个性质:性质1:在二叉树的第i层上最多可以有2^(i-1)个节点。性质2:深度为k的二叉树最多可以有2^k-1个节点。性质3:对于一棵二叉树,如果叶子节点数为m,度为2的节点数为n,那么m = n + 1。

2013-07-18 15:05:46 1069

原创 pNFS读操作

前面几篇文章基本介绍清楚了LAYOUTGET和GETDEVICEINFO两个请求,这是客户端发起I/O操作前的准备工作,这篇文章中我们就以读操作为例讲讲pNFS中的I/O操作。pNFS中的读操作和没有采用pNFS机制时的读操作基本流程是一致的,只是部分步骤有差别,这篇文章主要关注差别之处。static const struct nfs_pageio_ops filelayout_pg_read

2013-04-05 08:15:49 2022 4

原创 GETDEVICEINFO(二)

上一篇文章讲解了客户端deviceid相关的数据结构和操作函数,这篇文章中讲讲MDS中与deviceid相关的数据结构和操作。当MDS接收到GETDEVICEINFO请求后,会解析报文,解析出的数据存放在数据结构struct nfsd4_pnfs_getdevinfo中了,这个数据结构定义如下:struct nfsd4_pnfs_getdevinfo { struct nf

2013-04-04 10:51:02 4825

原创 GETDEVICEINFO(一)

这篇文章中我们先说说deviceid。什么是deviceid呢?在使用pNFS的情况下,客户端执行I/O操作前需要先获取文件的layout。同时客户端需要获取DS的详细信息,比如DS的IP地址,否则客户端还是没办法发起I/O请求。deviceid就包含了DS的基本信息。客户端中deviceid用数据结构struct nfs4_deviceid表示:#define NFS4_DEVICEID

2013-04-02 21:51:58 3601

原创 LAYOUTGET(五)

上篇文章讲到了MDS中LAYOUTGET的处理过程,当MDS处理完毕后就会将数据封装到应答消息中返回给客户端。这篇文章中我们讲讲客户端接收到应到报文后的处理。以前的文章讲到过客户端用struct pnfs_layout_segment表示一个layout,LAYOUTGET的作用就是获取文件的layout,因此当客户端接收到LAYOUTGET应答报文后会创建一个pnfs_layout_segmen

2013-04-01 23:45:38 1101

原创 LAYOUTGET(四)

前面一篇文章讲到了nfs4_pnfs_get_layout()最终调用struct pnfs_export_operations结构中的layout_get()创建一个新的layout,这篇文章中就详细讲讲file layout中layout的创建过程。file layout中的pnfs_export_operations定义如下:const struct pnfs_export_oper

2013-04-01 06:31:44 1798

原创 LAYOUTGET(三)

这篇文章中讲解nfs4_pnfs_get_layout()的执行过程,有些复杂,首先讲讲layout在MDS中的保存方式。MDS中有两个数据结构跟layout相关,分别是struct nfs4_layout_state和struct nfs4_layout。struct nfs4_layout表示一个layout,这个数据结构定义如下:/* outstanding layout */st

2013-03-31 18:08:53 1391

原创 MDS中file layout初始化过程

pNFS系统的部署过程见这篇文章:http://blog.csdn.net/ycnian/article/details/8523193。这篇文章中我们讲讲MDS的初始化过程,主要想讲讲向文件/proc/fs/nfsd/pnfs_dlm_device中写入数据后MDS做了哪些工作,以下面这条命令为例。[root@180 ~]# echo "sdb:192.168.6.180,192.168

2013-03-31 15:58:28 2059 1

原创 LAYOUTGET(二)

上一篇文章中我们分析了layout在客户端的保存形式、相关的数据结构、客户端发起LAYOUTGET请求的时间点,这篇文章中我们详细分析一下LAYOUTGET请求的发起过程以及MDS端的处理过程。1.客户端处理程序首先看几个客户端的数据结构:struct nfs4_layoutget { // LAYOUTGET请求报文中的数据 struct nfs4

2013-03-31 14:28:08 1374

原创 LAYOUTGET(一)

现在可以讲解LAYOUTGET请求了,首先我们需要回忆一下NFS文件系统中读数据的过程,看看LAYOUT请求是什么时候触发的。NFS文件系统中,每个缓存页关联了一个数据结构struct nfs_page。同时客户端还定义了一个数据结构struct nfs_pageio_descriptor,这个结构中包含了一个链表。当客户端向服务器请求数据时,会把缓存页挂载到这个数据结构的链表中,添加到这个链表中

2013-03-28 17:31:17 1388

原创 设置layout

layout需要MDS、DS和客户端三方共同支持,当客户端通过GETATTR请求获取了layout类型后,还需要检查自己是否支持这种类型,客户端检查、设置layout的函数是set_pnfs_layoutdriver()。    RFC5661定义了三种layout,三种layout的编号依次为enum pnfs_layouttype { LAYOUT_NFSV4_1_

2013-03-28 15:28:58 2531

原创 获取layout类型

NFSv4.1支持三种layout类型:file layout、object layout、block layout,这三种layout对数据读写过程的处理方式不同。因此pNFS系统中,客户端首先需要获取layout类型,这是在挂载文件系统时实现的。客户端挂载文件系统时需要发起GETATTR请求,获取文件系统的基本信息,这个处理函数是nfs4_proc_fsinfo。static int

2013-03-28 14:30:58 5073

原创 FILE LAYOUT

1 file layout中的基本概念    pNFS支持三种LAYOUT,分别为:block layout、object layout、file layout。这篇文章中讲解file layout的设计理念,不涉及Linux中的代码。首先介绍几个概念,这些概念见RFC5661第13章。Unit: Unit是固定长度的数据块,因为pNFS中可以包含多个DS,客户端可以向多个DS发送数据

2013-03-25 21:26:09 3125 2

原创 文件解锁

文件解锁是加锁的反操作,当处理完毕后应该尽量赶快解锁,避免影响其他用户访问文件。NFS中与文件解锁相关的操作有两个:LOCKU和RELEASE_LOCKOWNER。LOCKU的作用是解锁,RELEASE_LOCKOWNER的作用是释放stateid。LOCKU客户端程序    客户端处理LOCKU请求的函数是nfs4_proc_unlck(),这个函数最终调用了nfs4_do_un

2013-03-10 20:49:17 2456

原创 文件加锁

1.客户端处理程序    这篇文章中我们讲讲文件锁的加锁过程,首先说说与文件锁相关的数据结构struct nfs4_lock_state { // nfs4_state结构中包含多个nfs4_lock_state结构,这些结构构成了一个链表, // ls_locks指向链表中相邻的元素. struct list_head l

2013-03-10 11:49:37 2701

原创 NFS中的文件锁

文件锁是保持文件同步的一种手段,当多个用户同时操作同一个文件时,文件锁可以保证数据不发生冲突。NFSv2和NFSv3依靠NLM协议实现文件锁,NFSv4本身实现了文件锁,不需要NLM协同工作了。NFS中的文件锁既可以加在客户端,也可以加在服务器端。如果客户端挂载NFS文件系统时使用了选项nolock,表示在客户端加锁。这种情况下可以保证同一个客户端的多个进程访问同一个文件的过程不发生冲突,但是不同

2013-03-09 15:26:16 22368

原创 关闭文件

1.CLOSE和OPEN_DOWNGRADE    客户端用户执行完读写操作之后就需要关闭文件了,一般情况下客户端用户调用close(2)关闭文件。NFS文件系统中有两个请求与关闭文件相关:CLOSE和OPEN_DOWNGRADE。CLOSE:这个请求的作用是释放OPEN请求中申请的stateid。客户端在OPEN操作中向服务器申请了stateid,stateid表示了客户端用户请求的

2013-03-05 22:46:38 2300

原创 返还delegation

现在可以讲解delegation的返还过程了。像上一篇文章中讲到的那样,当文件的访问过程发生冲突时,服务器会向客户端发送CB_RECALL请求。客户端接收到CB_RECALL请求后,首先会更新关联在这个文件上的open stateid,然后就向服务器发起DELEGRETURN请求,将delegation返回给服务器。这篇文章中主要讲讲delegation的返还过程。    服务器发起CB_RE

2013-03-05 00:45:10 1706

原创 打开一个有delegation的文件(权限冲突)

这篇文章中先讲讲NFSv4中的READ。客户端发起READ请求时需要提供三个信息:一个stateid、数据在文件中的起始位置、请求的数据量。服务器会根据客户端提供的stateid查找到对应的文件,然后读取文件中的数据返回给客户端。客户端包含三种stateid:delegation stateid、lock stateid、open stateid。我们还没有讲到文件锁,因此假设文件没有加锁,先去掉

2013-03-04 22:48:03 1581

原创 打开一个有delegation的文件(权限没有冲突)

这篇文章中我们讨论这样一种情况:假设用户user1以只读权限打开了文件file1,并且服务器为这个文件分配了delegation。现在用户user2用样以只读权限打开文件file1,那么user2打开文件的过程是什么样的呢?是否还需要向服务器发送OPEN请求?    和前一篇文章相似,客户端仍然需要创建一个RPC任务,在发送OPEN请求报文前执行函数nfs4_open_prepare(),我们

2013-03-04 21:11:54 1203

原创 客户端如何设置delegation

上一篇文章中我们讲解了服务器没有分发delegation的情况下,OPEN操作结束之后客户端的设置过程,这篇文章中我们接着讲讲如果服务器分发了delegation客户端的设置过程。首先讲讲客户端表示delegation的数据结构,客户端delegation用struct nfs_delegation表示。struct nfs_delegation { // nfs_serv

2013-03-02 13:59:41 1683

原创 连续两次打开同一个文件

前面几篇文章中我们讲解了OPEN操作中最基本的情况:打开服务器端存在的一个文件,接下来的几篇文章中,我们讨论几种特殊情况。这篇文章中我们先讨论第一种情况:同一个用户连续两次打开同一个文件。    用户user1以只读权限打开了文件file1,未关闭文件的情况下又以只读权限打开了文件file1。第一次执行正常的操作,向服务器发送OPEN请求。那么第二次呢?还需要向服务器发送OPEN请求吗?事实上

2013-03-02 13:59:01 8581

原创 OPEN(三)

现在可以接着讲解文件打开过程。在前面的文章中我们讲过,客户端在发起OPEN操作前创建了新的数据结构nfs4_state_owner和nfs4_state,nfs4_state_owner表示客户端一个用户,nfs4_state表示一次OPEN过程。如果一个用户打开了多个文件,客户端就需要创建多个nfs4_state结构,但是只需要创建一个nfs4_state_owner就可以了。如果用户多次打开同

2013-03-01 00:57:19 1732

原创 分发delegation

delegation是NFSv4中保持文件同步的一种机制。当NFS客户端持有delegation时就认为自己和服务器保持同步了。多个客户端可以持有同一个文件的delegation,比如多个客户端以只读方式打开了同一个文件,这种情况下服务器为每个客户端分发一个delegation。这篇文章中我们讲讲delegation的分发过程。服务器端delegation的数据结构如下:struct nf

2013-02-28 22:58:05 2524

原创 创建反向通道

是时候讲讲NFS客户端和服务器之间反向通道的建立过程了,因为马上就会讲到delegation了。一般情况下,NFS客户端向服务器发送RPC请求,服务器进行处理,这个通道称为正向通道。而delegation需要使用反向通道,当服务器检测到文件冲突后,后向客户端发送RPC请求。客户端接收到请求后释放delegation。与反向通道相关的数据结构是struct nfs4_cb_conn,这个数据结构保存

2013-02-06 23:16:47 2251

原创 OPEN(二)

这篇文章中我们接着讲解服务器端的处理程序,首先介绍几个与OPEN操作有关的数据结构。第1个数据结构是struct nfs4_openowner,这个数据结构跟客户端的nfs4_state_owner相对应,保存了一个用户的信息,这个数据结构的定义如下:struct nfs4_openowner { struct nfs4_stateowner oo_owner; /* m

2013-02-06 00:20:33 1995

原创 OPEN(一)

1.OPEN请求报文和应答报文中的数据        OPEN操作比较复杂,涉及到很多种特殊情况。按照RFC3530的规定,OPEN请求报文中需要包含下列数据:struct OPEN4args { seqid4 seqid; // 这是一个序号,保证请求能够序列化. uint32_t share_acce

2013-02-05 00:21:19 2226 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除