文件的逻辑结构与物理结构

逻辑结构:指一个文件在用户面前所呈现的形式.

逻辑结构有两种形式:①记录式文件(有结构式文件).②字符流式文件(无结构式文件),也称流式文件.

1) 顺序文件,其记录是按某种顺序排列所形成的,记录在文件中的位置由某种顺序决定,第一个位置上的记录,第二个位置上的记录,…,由某种顺序来决定记录在文件中的位置。

2) 索引文件,记录在文件中的位置由索引表来指向,其实是按某个记录键来确定位置的,即第一个位置的记录在哪,第二个位置的记录在哪....。由索引表来决定这些位置上都是哪些记录。

3) 索引顺序文件,上述的两种相结合,将顺序文件中的记录先分为组,为顺序文件建立一张索引表,在索引表里为每组中的第一个记录建立索引项,记录在文件中的位置由索引表和顺序来决定。

文件的物理结构,是指文件在物理存储上的结构。

1) 连续分配 要求为每个文件分配一组相邻的盘块。这种分配方式保证了逻辑文件中的记录顺序与存储器中文件占用盘块的顺序的一致性,为使系统能找到文件存放的地址,应在目录项的文件物理地址字段中,记录该文件第一个记录所在的号和文件长度,逻辑结构的文件最终要在物理上体现出来,即物理上如何体现文件的逻辑结构。这种盘块的相邻关系,体现了逻辑上的相邻位置关系。优点:顺序访问容易,顺序访问速度快;缺点:要求有连续的存储空间,必须事先知道文件的长度,易造成碎片。

2) 链接分配 文件的逻辑结构可以通过链接指针体现,逻辑上相邻的位置关系,通过物理上的上下块之间的指针来体现相邻位置关系。可通过在每个盘块上的链接指针,将同属于一个文件的多个离散的盘块链接成一个链表,由此形成的物理文件称为链接文件。可显著消除了外部碎片,故可提高外在空间的利用率,且无须知道文件的长度,根据文件的当前需要,为它分配必需的盘块。当文件动态增长时,可动态地再为它分配盘块,此外,对文件的增、删、改也十分方便。可分为隐式链接和显式链接。注:外存的空间,是按一定大小划分成盘块的,是盘块的集合。

  隐式链接:在采用隐式链接分配方式时,在文件的目录的每个目录项中,都须集中指向链接文件第一个盘块和最后一个盘块的指针,而每个盘块中都含有一个指向下一个盘块的指针。最主要的问题是:它只适合于顺序访问,对随机访问是极其低效的,如果其中的一个指针出现问题,都会导致整个链的断开,为了提高检索和减小指针所占用的存储空间,可以将同一磁道即柱面上相邻几个盘块组成一个簇cluster,在分配盘块时,以簇为单位进行。

  显式链接:这是指把用于链接文件各个物理块的指针,显式地存放在内存的一张链接表中,这张表体现了文件的逻辑结构。这个表只能体现上下块之间的关系,没有第几个位置的指向。该表是整个磁盘仅设置的一张表,分配给文件的所有盘块号都放在该表中,称为文件分配表FAT,是磁盘上所有文件的链接表,表的序号是物理盘块号,因为磁盘分成了盘块,从0开始一直到N-1,每个表项中,存放链接指针即为盘块号,即下一个盘块号,凡是属于某一文件的第一个盘块号,均作为文件地址被填入相应文件的FCB的物理地址字段中。查询记录的过程是在内存中进行的,所以显著地提高了检索速度。注,对于外存,链接指针即地址是盘块号。但是不能支持高效的直接存取,同时FAT也需要占用较大的内存空间。

3) 索引分配  文件的逻辑结构体现在索引表中,这个索引表不同于文件逻辑结构中的索引表,逻辑结构中的索引是索引记录键相关的东西,而讲到物理结构时,是假设其逻辑结构已经存在,即文件的上下相邻位置关系已经存在,所以在物理上要怎么体现这种上下相邻关系。将逻辑上的相邻位置关系在物理上体现出来:即哪些块在逻辑上是相邻的,所以按文件的逻辑顺序建立了物理文件盘块的索引表,这些文件的逻辑关系体现在索引表中,即在逻辑上或是按逻辑的顺序由哪些块构成的,总之是按逻辑顺序排序的盘块号集合,即第一个位置的记录在哪,第二个位置的记录在哪,…。对于索引分配一般有:

  单级索引分配 事实上,在打开文件时,只须把该文件占用的盘块的编号调入内存即可,完全没有必要将整个FAT表调入内存,将每个文件所对应的盘块号集中地存放在一起,为每个文件分配一个索引块表,把分配给该文件的的有盘块号,都记录在该索引块中,因而该索引就是一个含有许多盘块号的数组。在建立一个文件时,便须在为之建立的目录项中,填上指向该索引块的指针。这种分配方式支持直接访问,当要读文件的第I个盘块时,可以方便地直接从索引块中找到第I块盘的盘块号。同时也不会产生外部碎片。

       其实索引的方法就是将链接的方式(只有下一个是什么的概念,没有第几个是什么的概念,所以不能直接读取)顺序文本化,即逻辑位置关系(第1,第2,第3,…)体现在索引表中,而不是指针。但是问题是可能会花费较多的外在空间,当建立一个文件时,要为之分配一个索引块,将分配给文件的盘块号记录在其中,即要文本化这种逻辑关系。

       多级索引分配 当文件过大时,已经装满一索引块时,OS便为之再分配一个索引块,用于以后继续为之分配的盘块号记录,依此类推要建立这些索引块的索引,将各索引块按序组织起来。

       混合方式分配 将直接地址,一级索引,…,多级索引集合在一起,以适应不同文件大小的需要。其实直接地址部分就是相当于索引块本身,适合于小文件的分配。而一级索引是指向的是索引块。

总之,当你有了一个逻辑上的文件后,机器为这个文件分配磁盘,并将其存入磁盘,这种分配方式,要保证从磁盘上将文件读出来后,仍能保证逻辑上的一致性。这就是说文件在外存上存储时,分配方式要保证文件在逻辑上一致。所以物理结构就是指逻辑文件在这些分配方式下所形成的文件结构。

 
  • 15
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 顺序存储结构中数据中数据元素之间逻辑关系是由( )表示的,链接存储结构中的数据元素之间的逻辑关系是由( )表示的。 A.线性结构 B.非线性结构 C.存储位置 D.指针 2. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不能为空 C. 一个无限序列,可以为空 D. 一个无限序列,不能为空 3. 已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。 A. 108 B. 180 C. 176 D. 112 4. 在单链表中删除指针p所指结点的后继结点,则执行( )。 A. p->next= p->next->next B. p->next= p->next C. p= p->next->next D. p= p->next; p->next= p->next->next 5. 若某链表最常用的操作是在最后一个结点之后插入一个结点删除最后一个结点,则采用( )存储方式最节省时间。 A. 单链表 B. 双链表 C. 带头结点的双循环链表 D. 单循环链表 6.二维数组A[7][8]以列序为主序的存储, 计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A. 38 B. 43 C. 26 D. 29 二、完成下列填空题(每空3分,共9分)。 1.在顺序表L中第i个位置上插入一个新的元素e: Status ListInsert_Sq(SqList &L , int i , ET e){ if ( iL.length+1) return ERROR; if(L.length >= L.listsize){ p=(ET*)realloc(L.elem,(L.listsize+10)*sizeof(ET)); if (p==NULL) exit(OVERFLOW); L.elem=p; } for( j=L.length ; j>=i ; --j ) L.elem[j]=L.elem[j-1] ; L.elem[j]=e ; ++L.length ; return OK; } 2. 删除双向链表中p所指向的节点算法: status delete(DuLinkList L, DuLinkList p) { if (p= =L) return ERROR; else { p->prior->next=p->next; p->next->prior=p->prior ; } free(p); return OK; } 三、编程题(共27分)。 1. (共12分)用顺序表表示集合,设计算法实现集合的求差集运算,要求不另外开辟空间。 顺序表的存储结构定义如下: #define Maxsize 100 typedef struct { ElemType data[MaxSize]; // ElemType表示不确定的数据类型 int length; // length表示线性表的长度 }SqList; 将如下函数,伪码补充完整(8分),代码前先用文字描述自己的算法思想(4分)。 文字描述算法:略(4分) void Difference(SqList A, SqList B) {//参考代码如下如下(8分) for (i=0;i<A.length;i++) for(j=0;j<B.length;j++) if(A.data[i]==B.data[j]) { A.data[i]=’#’; break; } for (k=0,i=0;inext == L) return; p = L; while (p->next != L)   { if (p->next->data != e) P = p->next; else { q = p->next;p->next = q->next; free(q);} } } 时间复杂度分析:(2分) 时间复杂度为O(n)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值