摘要: mmap的好处:和read、write系统调用相比不会产生无关的副本;如果不出错就不会有系统调用、操作环境切换等开销;不再需要lseek调用。mmap的坏处:内存映射总是PAGESIZE的整数倍,会浪费一定的内存;如果要映射的内容非常大的时候可能找不到连续的线性地址空间;创建并维护内核相关数据结构,这部分可能抵消双重副本节省下的开销,尤其是大型频繁访问的文件。下面是一个文件映射比较全面的例子:int main(){ //取得页大小 //int pagesize = sysconf(_SC_PAGESIZE); int pagesize = getpagesize(); ... 阅读全文
posted @ 2011-10-11 15:47 GG大婶 阅读(860) 评论(0) 推荐(0) 编辑
摘要: epoll使得时间监听器的注册与实际的事件监视工作脱钩,有三种系统调用:初始化epoll的上下文;将要查看的文件描述符加入上下文(或移除);实际执行时间等待。#include <stdio.h>#include <fcntl.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/uio.h>#include <sys/epoll.h>#include <m 阅读全文
posted @ 2011-10-11 13:47 GG大婶 阅读(602) 评论(0) 推荐(0) 编辑
摘要: include <stdio.h>#include <fcntl.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/uio.h>int main(){ int fd = open("test", O_RDWR); char *buf[] = {"abcdefg\n", "abcdefgh\n", "a 阅读全文
posted @ 2011-10-11 08:39 GG大婶 阅读(323) 评论(0) 推荐(0) 编辑
摘要: #include <stdio.h>int main(){ FILE* file; char buf[1024], ch; file = fopen("test", "r+");//打开文件 //设置缓存 setvbuf(file, buf, _IOFBF, sizeof(buf)); fgets(buf, sizeof(buf), file);//读取一整行 ch = fgetc(file);//读取单个字符 ungetc(ch, file);//把一个字符放回流中 fread(buf, 1, 5, file);//读取二进制数据 ... 阅读全文
posted @ 2011-10-10 09:14 GG大婶 阅读(243) 评论(0) 推荐(0) 编辑
摘要: #include <stdio.h>#include <unistd.h>#include <sys/poll.h>int main(void){ //要等待的文件的数组 struct pollfd fds[2]; int ret; fds[0].fd = STDIN_FILENO;//文件符 fds[0].events = POLLIN;//等待的事件类型 fds[1].fd = STDOUT_FILENO; fds[1].events = POLLOUT; ret = poll(fds, 1, 5000); if(ret == -1){... 阅读全文
posted @ 2011-10-09 19:50 GG大婶 阅读(295) 评论(0) 推荐(1) 编辑
摘要: #include <stdio.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>int main(void){ struct timeval tv; fd_set readfds; int ret; //等待stdin的输入 FD_ZERO(&readfds);//移除所有 FD_SET(STDIN_FILENO, &readfds);//加入分组 //FD_CLR用来移除 //设置等待时间 tv.tv_sec = 5; tv.tv_usec = 0; 阅读全文
posted @ 2011-10-09 14:26 GG大婶 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 1、ext2_add_link的执行过程,函数的定义如下:int ext2_add_link (struct dentry *dentry, struct inode *inode){ struct inode *dir = dentry->d_parent->d_inode;//父节点的inode const char *name = dentry->d_name.name;//目录名 int namelen = dentry->d_name.len;//名字长度 unsigned chunk_size = ext2_chunk_size(dir);//块大小 ... 阅读全文
posted @ 2011-10-09 09:18 GG大婶 阅读(905) 评论(0) 推荐(0) 编辑
摘要: 昨天晚上想了下slab中是没有bitmap的,那slab怎么知道哪些object是可用的?今天来看了一下感觉很有意思,slab把空闲的object放到了一个链表上。那为什么没有list_head?因为这个链表是用数组实现的。大概的结构如下:---------------------------个人理解,欢迎拍砖。 阅读全文
posted @ 2011-09-27 11:10 GG大婶 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 因为看内核的时候感觉红黑树挺有意思的,所以利用周末的时间来实现一下玩玩。红黑树的操作主要是插入和删除,而删除的时候需要考虑的情况更多一些。具体的操作就不在这里罗嗦了,百度文库里面有一个比较有好的文章,已经说的很明白了。 在看具体的操作的时候有的人可能感觉有些情况是没有考虑到的(如果没有这种感觉的人很有可能根本没有仔细地想)。但是那些“遗漏”的情况如果存在的话,操作之前的红黑树将违反那几个规则。 写代码的时候很多次因为少考虑情况而导致错误,细节比较多,刚开始rb_node中没有指向父节点的指针,写的快吐血,然后还是加上了。代码具体的含义可以结合文章和注释来看(还是很好理解的)。下面的代码中可能. 阅读全文
posted @ 2011-09-25 19:56 GG大婶 阅读(3600) 评论(3) 推荐(1) 编辑
摘要: 这次要写的是一个博弈游戏,题目的链接地址是:http://acm.ustc.edu.cn/ustcoj/problem.php?id=1130。题目的大概意思是:在一个有向无环图上,每个节点有若干的石子。Alice和Bob在上面移动石子,每次可以把任意一个石子沿着一个有向边移动。两人轮流操作,如果该谁移动的时候已经没有石子可移动,那这个人就输了。 他们约定Alice先走,而Bob负责把N个石子放在给定的有向无环图上的节点上。假设所有的石子都是相同的,那么Bob有多少种方法可以使得Alice必输。因为这个结果非常大,计算出总数对1000000007的余数就好了。有向无环图的节点数目不大于1... 阅读全文
posted @ 2011-09-24 19:21 GG大婶 阅读(1501) 评论(0) 推荐(0) 编辑