数据结构(外部排序之外存信息的存取)

        计算机一般有两种存储器:内存储器(主存)和外存储器(辅存)。内存的信息可随机存取,且存取速度快,但价格贵,容量小。外存储器包括磁带和磁盘(或磁鼓),前者为顺序存取的设备,后者为随机存取的设备。

        1.磁带信息的存取

        磁带是薄薄涂上一层磁性材料的一条窄带。现在使用的磁带大多数有1/2英寸宽,最长可达3600英尺,绕在一个卷盘上。使用时,将磁带盘放在磁带机上,驱动器控制磁带盘转动,带动磁带向前移动。通过读/写头就可以读出磁带上的信息或者把信息写入磁带中(图1)。

图1 磁带运动示意图

        在1/2英寸宽的带面上可以记录9位或7位二进制信息(通常称为9道带或7道带)。以9道带为例,每一横排就可表示一个字符(8位表示一个字符,另一位作奇偶校验位)。因此,磁带上可记下各种文字信息或二进制信息。在磁带上信息按字符组存放,而不是按字符存放。

        磁带上信息的密度通常为每英寸800位或1600位或6 250位(即每英寸的二进制字符数),移动速度是每秒200英寸。

        磁带不是连续运转的设备,而是一种启停设备(启停时间约为5毫秒),它可以根据读/写的需要随时启动和停止。由于读/写信息应在旋转稳定时进行,而磁带从静止状态启动后,要经过一个加速的过程才能达到稳定状态;反之y在读/写结束后,从运动状态到完全停止,要经过一个减速的过程。因此,在磁带上相邻两组字符组(记录)之间要留一空白区,叫做间隙IRG(Inter Record Gap)。根据启停时间的需要,这个间隙通常为1/4~3/4英寸。如果每个字符组的长度是80个字符,IRG为3/4英寸,则对密度为每英寸1600个字符的磁带,其利用率仅为1/16,有15/16的带用于IRG(参见图2(a))。

        为了有效地利用磁带,常常用组成块的办法来减少IRG的个数。在每次写信息时,不是按用户给出的字符组记人磁带,而是将若干个字符组合并成一块后一次写入磁带。于是,每个字符组间就没有IRG,而变成块间的间隙IBG(Inter Block Gap)。图2(b)表示将20个长度为80字符的字符组存放在磁带上的一个物理块中的情况。

图2 磁带上信息存放示意图    (a)字符组长80字符的磁带;(b)成块存放的磁带

        成块的办法可以减少IRG的数目,从而可以提高磁带的利用率,块的长度大于IBG的长度。

        成块还可减少I/O操作。因为一次I/О操作可把整个物理块都读到内存缓冲区中,然后再从缓冲区中取出所需要的信息(-一个字符组)。每当要读一个字符组时,首先要查缓冲区中是否已有,若有,则不必执行Ⅰ/О操作,直接从缓冲区读取即可。

        软件要有处理成块,解块和保存字符组的功能。在使用者看来,每次读/写的却只是一个字符组。

        是否物理块越大,数据越紧凑,效率就越高呢?实际上不是这样的。物理块不能太大,通常只有1K字节~8K字节。这是因为如果一次读写太长,则出错的概率就增大,可靠性就降低﹔此外,若块太大,则在内存开辟的缓冲区就大,从而耗费内存空间也多。

        在磁带上读写一块信息所需的时间由两部分组成:

        其中: t_{a}为延迟时间,读/写头到达传输信息所在物理块起始位置所需时间;t_{w}为传输一个字符的时间。

        显然,延迟时间和信息在磁带上的位置、当前读/写头所在位置有关。例如,若读/写头在第i和第i+1个物理块之间的间隙上,则读第i+1个物理块上的信息仅需几毫秒;若读/写头位于磁带的始端,而要读的信息在磁带的尾端,则必须使磁带向前运动,跳过中间的许多块,直到所需信息通过读/写头时才能得到,这可能需要几分钟的时间。因此,由于磁带是顺序存取的设备,则读/写信息之前先要进行顺序查找,并且当读/写头位于磁带尾端,而要读的信息在磁带始端时,尚需使磁带倒转运动。这是顺序存取设备的主要缺点,它使检索和修改信息很不方便。因此,顺序存取设备主要用于处理变化少、只进行顺序存取的大量数据。

        2.磁盘信息的存取

        磁盘是一种直接存取的存储设备(DASD)。它是以存取时间变化不大为特征的。它不像磁带那样只能进行顺序存取,而可以直接存取任何字符组。它的容量大,速度快,存取速度比磁带快得多。磁盘是一个扁平的圆盘(与电唱机的唱片类似),盘面上有许多称为磁道的圆圈,信息就记载在磁道上。由于磁道的圆圈为许多同心圆,所以可以直接存取。磁盘可以是单片的,也可以由若干盘片组成盘组。每一片上有两个面。以6片盘组为例,由于最顶上和最低下盘片的外侧面不存信息,所以总共只有10个面可用来保存信息,如图3所示。

图3 活动头盘示意图

        磁盘驱动器执行读/写信息的功能。盘片装在一个主轴上,并绕主轴高速旋转﹐当磁道在读/写头下通过时,便可以进行信息的读/写。

        可以把磁盘分为固定头盘和活动头盘。固定头盘的每一道上都有独立的磁头,它是固定不动的,专负责读/写某一道上的信息。

    ​    ​活动头盘的磁头是可移动的。盘组也是可变的。一个面上只有一个磁头,它可以从该面上的一道移动到另一道。磁头装在一-个动臂上,不同面上的磁头是同时移动的,并处于同一圆柱面上。各个面上半径相同的磁道组成一个圆柱面,圆柱面的个数就是盘片面上的磁道数。通常,每个面上有200~400道。在磁盘上标明一个具体信息必须用一个三维地址:柱面号、盘面号、块号。

    ​    ​其中,柱面号确定读/写头的径向运动,而块号确定信息在盘片圆圈上的位置。

    ​    ​为了访问一块信息,首先必须找柱面,移动臂使磁头移动到所需柱面上(称为定位或寻查);然后等待要访问的信息转到磁头之下;最后,读/写所需信息。

    ​    ​所以,在磁盘上读写一块信息所需的时间由三部分组成:

    ​    ​其中: t_{seek}为寻查时间(seek time),即读/写头定位的时间;

    ​    ​t_{la}为等待时间(latency time),即等待信息块的初始位置旋转到读写头下的时间;

    ​    ​t_{wm}为传输时间(transmission time)。

    ​    ​由于磁盘的旋转速度很快,约2400~3 600转/分,则等待时间最长不超过25毫秒(旋转一圈的时间),磁盘的传输速率一般在10^{5}字符/秒和5×10^{5}​字符/秒之间,则在磁盘上读/写信息的时间主要花在寻查时间上(其最大寻查时间约为0.1秒)。因此,在磁盘上存放信息时应将相关的信息放在同一柱面或邻近柱面上,以求在读/写信息时尽量减少磁头来回移动的次数,以避免不必要的寻查时间。

然后今天就讲到这里啦,大家记得点赞收藏,分享转发,关注小哥哥哦! 最后,如果你想学或者正在学C/C++编程,可以加入小编的编程学习C/C++企鹅圈icon-default.png?t=M3C8https://jq.qq.com/?_wv=1027&k=vLNylJeG

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值