Linux中的文件寻址,Linux文件寻址算法:逻辑地址到物理地址的转换
题目描述:
编写一个函数实现Linux文件寻址的算法,即读取文件当前位置到物理存储位置的转换函数,需要给出运行的测试数据,可以假设和模拟需要的数据和结构。即编写一个函数unsigned long ltop(unsigned long logblkNum). 计算逻辑块号logblkNum所对应的物理块的块号。
#include
#include
#include
#define index (12) //直接索引块数目
#define first_index (1 << 7) // 一级索引块数目
#define second_index (1 << 14)
#define third_index (1 << 21)
#define blksize 512 //物理块大小
#define blknumsize 4 //索引块大小
#define index_blk_sum (15 + first_index + second_index + third_index) //索引块总数
struct inode
{
unsigned long i_block[15];
}inode;
FILE *fp;
int bitmap[index_blk_sum] = {0};
int find_bitmap(int curpos)
{
int j, k;
for(j = k = curpos; bitmap[j] == 1 && bitmap[k] == 1 && k >= 0 && j < index_blk_sum; ++j, --k);
if(j < index_blk_sum && bitmap[j] == 0)
return j;
else if(k >= 0 && bitmap[k] == 0)
return k;
}
void print(int buf[])
{
for(int i = 0; i < first_index; ++i)
printf("%d ", buf[i]);
printf("\n");
}
void dirty(int pos)
{
bitmap[pos] = 1;
}
void init_inode()
{
for(int i = 0; i < 15; ++i)
{
int tmp = rand() % index_blk_sum;
if(bitmap[tmp] == 1)
{
int j = find_bitmap(tmp);
inode.i_block[i] = j;
dirty(j);
}
else
{
inode.i_block[i] = tmp;
dirty(tmp);
}
}
}
void init_filesys()
{
long long bufsize = index_blk_sum * blksize;
char *buf = malloc(sizeof(char) * bufsize);
fwrite(buf, sizeof(buf), 1, fp);
free(buf);
}
void do_random(int buf[], int n)
{
for(int i = 0; i < n; ++i)
{
int tmp = rand() % index_blk_sum;
if(bitmap[tmp] == 1)
{
int j = find_bitmap(tmp);
buf[i] = j;
dirty(j);
}
else
{
buf[i] = tmp;
dirty(tmp);
}
}
}
void put_inode()
{
fseek(fp, 0, SEEK_SET);
fwrite(&inode, sizeof(inode), 1, fp);
}
void put_direct_index(unsigned long offset)
{
int buf[first_index] = {0};
do_random(buf, first_index);
fseek(fp, offset, SEEK_SET);
fwrite(buf, sizeof(int), first_index, fp);
}
void put_first_index()
{
unsigned int buf_1[first_index];
put_direct_index(inode.i_block[13] * blksize);
fseek(fp, inode.i_block[13] * blksize, SEEK_SET);
fread(buf_1, sizeof(int), first_index, fp);
for(int i = 0; i < first_index; ++i)
put_direct_index(buf_1[i] * blksize);
}
void put_second_index()
{
unsigned int buf_1[first_index] = {0};
unsigned int buf_2[first_index] = {0};
put_direct_index(inode.i_block[14] * blksize);
fseek(fp, inode.i_block[14] * blksize, SEEK_SET);
fread(buf_1, sizeof(int), first_index, fp);
for(int i = 0; i < first_index; ++i)
{
put_direct_index(buf_1[i] * blksize);
fseek(fp, buf_1[i] * blksize, SEEK_SET);
fread(buf_2, sizeof(int), first_index, fp);
for(int j = 0; j < first_index; ++j)
{
put_direct_index(buf_2[j] * blksize);
}
}
}
unsigned long ltop(unsigned long l_addr)
{
unsigned int buf_1[first_index] = {0};
unsigned int buf_2[first_index] = {0};
unsigned int buf_3[first_index] = {0};
if(l_addr < 0 || l_addr > index_blk_sum - 1)
return index_blk_sum;
else
{
if(l_addr < index)
{
return inode.i_block[l_addr];
}
else if(l_addr < (index + first_index))
{
fseek(fp, inode.i_block[12] * blksize, SEEK_SET);
fread(buf_1, sizeof(int), first_index, fp);
return buf_1[l_addr - index];
}
else if(l_addr < (index + first_index + second_index))
{
fseek(fp, inode.i_block[13] * blksize, SEEK_SET);
fread(buf_1, sizeof(int), first_index, fp);
fseek(fp, buf_1[(l_addr - (index + first_index)) / first_index] * blksize, SEEK_SET);
fread(buf_2, sizeof(int), first_index, fp);
return buf_2[(l_addr - (index + first_index)) % first_index];
}
else if(l_addr < (index_blk_sum))
{
fseek(fp, inode.i_block[14] * blksize, SEEK_SET);
fread(buf_1, sizeof(int), first_index, fp);
fseek(fp, buf_1[(l_addr - (index + first_index + second_index)) / second_index] * blksize, SEEK_SET);
fread(buf_2, sizeof(int), first_index, fp);
fseek(fp, buf_2[(l_addr - (index + first_index + second_index)) % second_index / first_index] * blksize, SEEK_SET);
fread(buf_3, sizeof(int), first_index, fp);
return buf_3[(l_addr - (index + first_index + second_index)) % second_index % first_index];
}
}
}
int main()
{
srand((unsigned)time(NULL));
unsigned long l_addr;
fp = fopen("ext2", "w+");
if(fp == NULL)
{
printf("create filesys error!\n");
exit(0);
}
init_inode();
init_filesys();
put_inode();
put_direct_index(inode.i_block[12] * blksize);
put_first_index();
put_second_index();
while(scanf("%ld", &l_addr) != EOF)
{
unsigned long p_addr = ltop(l_addr);
if(p_addr < index_blk_sum)
printf("logical blknum %ld to physical blknum %ld\n", l_addr, p_addr);
else
printf("out of memory\n");
}
fclose(fp);
return 0;
}
相关文章:

datatable和dataset的区别
DataSet 是离线的数据源 DataTable 是数据源中的表.当然也可以自己建一张虚表。插入数据库中 DataSet是DataTable的容器DataSet可以比作一个内存中的数据库,DataTable是一个内存中的数据表,DataSet里可以存储多个DataTabledatatable是dataset中的一个表另…

如何避免重构带来的危险
http://blog.jobbole.com/30049/ 重构代码很危险,它会给测试工作增加巨大的负担。除非你的程序需要重构,一定不要轻易重构代码。我这里所说的并不是把一个for循环改成while循环,或把一个StringBuffer改成StringBuilder,我说的是大…

ip通信(第二周)
计算机网络分为局域网(LAN)、城域网(MAN)和广域网(WAN)。拓扑结构分为星型网,树形网,分布式网络,总线型网络,环型网络和复合型网络。认识了几个常见的国际标准…

《DDIA》读书笔记
数据存储系统的经典书籍: 从数据系统的特性开始,先讲单机存储引擎 再到 分布式存储系统,最后到一些数据流的处理方式,作者深入浅出,译者更是精雕细琢,本书需要细品。 将持续阅读整理,先从理论走…

linux网卡设置adsl上网,Linux下设置ADSL自动拨号上网
前段时间下载了红帽的linux,版本为redhat 9.0,整整刻了三张CD。最初是为了体验一下linux下QQ聊天软件的功能,最后因内核太低(官方推荐内核在2.6以上,我下载的版本是2.4)而告终。最大的收获是了解了linux下文件系统及linux下软件与…

安卓天天酷跑脚本刷高分图文教程
http://news.gamedog.cn/a/20130923/241742.html

SpringBoot 中 JPA 的使用
前言 第一次使用 Spring JPA 的时候,感觉这东西简直就是神器,几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。下面我们就用一个例子来讲述以下 JPA 使用的基本操作。 新建项目,增加依赖 在 Intellij IDEA 里面新建一个…

《DDIA》读书笔记(一):可靠性、可扩展性、可维护性
这一节描述了密集型应用的基本思考方式。 可靠性。意味着系统发生故障,也能保持正常的运行。故障会集中在三个方面,硬件故障(通常是随机和不相关的)、软件故障(通常是系统性的bug,较难发现,较难处理),人为故障(不可避免得时不时出…

TCP协议-TCP连接管理
TCP协议是 TCP/IP 协议族中一个非常重要的协议。它是一种面向连接、提供可靠服务、面向字节流的传输层通信协议。TCP(Transmission Control Protocol,传输控制协议)。

[Unity WWW] 跨域访问解决方法
什么是跨域访问 域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配…

linux环境安全测评实验报告,linux第一次实验报告
iframe载入页面过程显示动画效果http://www.xfeixiang.com/Bug/Detail/A2FD7EFFA8CA72F1加密算法使用(三):用用BASE64采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到 package testEncrypt; import java.security.Key; import java.secu ...jav…

2019-03-20 Python爬取需要登录的有验证码的网站
当你向验证码发起请求的时候,就有session了,记录下这次session因为每当你请求一次验证码 或者 请求一次登录首页,验证码都在变动验证码的链接可能不是固定的,可能需要GET/POST请求,获取那部分变动的信息 session requests.sessio…

Mac上 如何快速玩起rocksdb
想要自己随时随地写一写rocksdb的代码,并且快速测试,但是公司的物理机登陆过于麻烦,想要验证功能的话其实在自己的电脑就完全可以了。 安装 brew install rocksdb,默认二进制文件安装在/usr/local/bin在~/.bashrc或者自己正在使用…

OC学习篇之---对象的拷贝
在前一篇文章中我们说到了如何解决对象的循环引用问题:http://blog.csdn.net/jiangwei0910410003/article/details/41926369,这一篇文章我们就来介绍一下OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语…

linux脚本自定义赋值,JMeter——运用BeanShell给自定义的变量动态赋值
这个计划中定义了以下组件:用户自定义变量:里面定义了2个变量,一个是us(注意,未对它初始化),一个变量名是:test ,值为:123456一个BeanShell Sampler:${test}表示传入BeanShell Sampl…

VS2010与Qt设置出现红线提示
任何类库导入都有可能出现红线,主要原因是“包含目录没有设置”点击“项目”-> (你的项目)属性->配置属性->VC目录->包含目录 把你的目录写入(我的是:H:\Qt\4.8.5\include)点击确定~ 完成。转载…

java-方法。(新手)
//导入包。import java.util.Arrays;import java.util.Calendar;import java.util.Date;//创建的一个类。public class zylx1 { //公共静态的主方法。 public static void main(String[] args){ //调用方法。 lx8(); } //创建方法。//使日历向后偏移…

《Bigtable:a distributed storage system for struct data》笔记
Bigtable 可以说是log-structed以及page-oriented 两种存储引擎的整合体,我们性能优越的单机存储引擎leveldb和rocksdb就是基于google的bigtable存储系统实现的。 论文地址Bigtable: A Distributed Storage System for Structured Data bigtable是基于分布式的存储…

linux 查看线程详细信息,Linux 下查看线程信息
1. 使用 pstree -p PIDps aux | grep firefox | grep -v grepcharles 26058 0.0 0.0 4908 1152 ? S 19:17 0:00 /bin/sh /usr/lib/firefox-3.5.4/run-mozilla.sh /usr/lib/firefox-3.5.4/firefoxcharles 26073 7.6 3.4 284264 70164 ? Sl 19:1…

Bootstrap学习的点点滴滴
1)网站:http://www.bootcss.com/http://v3.bootcss.com/getting-started/#downloadhttps://github.com/twbs/bootstraphttp://getbootstrap.com杭州移动用的是2.3版本,手册地址: http://docs.bootcss.com/bootstrap-2.3.2/docs/ja…

Angry Grammar Nazi
Angry Grammar Nazi 1、给出的几个要处理的字符串没有重复性(子串),不必考虑某个单词是算在哪个种类中; 2、给出的几个要处理的字符串(除了“lol”)都是单词或短语,可以直接搜索 3、给出的处理长…

Linux——查看
查看当前系统版本: lsb_release -a #没有装:yum install lsb 查看当前运行端口: netstat -atunlp #没有装:yum install net-tools -a :all,表示列出所有的连接,服务监听,Socket…

Rocksdb 事务(一): 隔离性的实现
文章目录前言1. 隔离性2. Rocksdb实现的隔离级别2.1 常见的四种隔离级别2.2 Rocksdb 支持的隔离级别及基本实现2.2.1 ReadComitted 隔离级别的测试2.2.2 ReadCommitted的实现2.2.3 RepeatableRead的实现2.2.4 事务并发处理3. 一些总结前言 Rocksdb 作为单机存储引擎࿰…

linux镜像修改密码,OpenStack 镜像修改密码方案
现在各大linux厂商,其实已经有专门给openStack提供的镜像,不过国内的朋友,不太习惯老外做镜像的方式,经常问密码是多少。本博客提供几种修改密码方案,仅供参考。前言对OpenStack云主机来说,有以下几种方式登…

专题8-Linux系统调用
1.从用户空间到内核空间的时候需要进行系统调用 2.系统调用通过swi指令实现,这个时候会有一个参数,存放到r7寄存器,用来指定要调用的内核态函数。 3.一般内核态的实际函数可以再任意的.c文件实现,但是必须在call.S里面加上相应的函…

企业架构研究总结(39)——TOGAF架构能力框架之架构委员会和架构合规性
3. 架构委员会 正如前面所说,一个用来对架构治理策略的实现进行监督的跨组织的架构委员会是架构治理策略成功的主要要素之一。架构委员会应该能够代表所有主要干系人的需求,并且通常还需要对整个架构的审查及维护活动负有高级行政职责。通常来讲…

linux c编程之fcntl
fcntl可实现对指定文件描述符的各种操作,其函数原型如下: int fcntl(int fd, int cmd, ... /* arg */ ); 其中,操作类型由cmd决定。cmd可取如下值: F_DUPFD:复制文件描述符F_DUPFD_CLOEXEC:复制文件描述符&…

Rocksdb iterator和snapshot 接口
Rocksdb提供迭代器来来访问整个db中的数据,就像STL中的迭代器功能一样,用来访问容器中的具体的数据。 访问形式以及访问接口有如下几种: 遍历所有的key-value//打开db,并初始化一个迭代器指针 rocksdb::Iterator* it db->Ne…

原生js自动完成 [转]
本来想用jquery的autocomplete的,可是需求有些变化,打算改源码,进了源码发现,改起来要的时间太长了,毕竟不是自己写的,改起来慢,在网上开始大肆搜罗资料,终于找到了类似的 本文转自http://www.cnblogs.com/jaiho/archive/2011/02/28/js_autocomplete.html 完成有以下功能&#…

linux 内存管理slab源码,Linux内核源代码情景分析-内存管理之slab-回收
图 1我们看到空闲slab块占用的若干页面,不会自己释放;我们是通过kmem_cache_reap和kmem_cache_shrink来回收的。他们的区别是:1、我们先看kmem_cache_shrink,代码如下:int kmem_cache_shrink(kmem_cache_t *cachep){if…