APP下载

电视台节目迁移技术的研究与实现

2012-09-25文丨李继青唐继勇白新跃

中国传媒科技 2012年20期
关键词:磁盘线程内存

文丨李继青 唐继勇 白新跃

(电子科技大学,成都 611731)

现今电视台已经用视频服务器的硬盘播出系统取代了传统的录像机播出,并逐渐形成电视全台制作播出网络,目前电视台所有节目有三种存储方式:在线存储(On-Line)、近线存储[1](Near-Line)和离线存储(Off-Line),也分别称为一级、二级、三级存储。在线存储[2]方式是将所有的节目都用硬盘保存起来,直接存储在视频服务器中,当有播出请求时,就可以立即取得数据,访问速度快,但视频服务器存储容量有限制;离线存储使用磁盘阵列、光盘、磁带作为节目存储的载体,其最大的优点就在于其廉价的存储成本,以及其灵活的扩展性能,但访问速度较慢,效率较低。近线存储方式有机将离线存储和在线存储的优点结合,能实现较大容量节目的存储,而且迁入在线存储速度也比离线迁入快。由于高清/标清节目所需要磁盘容量较大,目前在电视台中一般用多台节目存储服务器作为二级存储设备。如图1,在电视全台网的节目播出和节目管理中,需要在一级、二级和三级存储间进行相互的迁入和回迁。本文重点以二级存储迁移到在线存储为讨论对象,其它情况的迁移与此类似。

图1 电视台节目存储三级架构

1 节目迁移需求分析

近线存储方式的节目当需要进行播出时需要迁移到视频服务器(在线存储方式),或者对于有主备二级存储的电视全台网系统中,二级存储之间也需要进行节目的迁移。目前电视台节目的迁移过程一般是基于FTP协议先下载再上传。要实现迁移任务,现在较为通用迁移步骤如下(以近线迁移到在线为例):(1)将近线存储的节目下载到节目迁移服务器磁盘的特定目录下。(2)将迁移服务器中已下载的节目迁移到视频服务器(在线存储),如果有主备冗余机制,则同时迁移到主备视频服务器进行在线存储。(3)如果迁移到视频服务器成功,则删除自动迁移服务器中下载的节目,完成迁移任务。

从以上步骤可以看出,迁移服务器作为中间桥梁实现迁移,每个节目的迁移都需要首先存入迁移服务器,完成任务后又删除节目。由于现在电视台节目一般都是大容量的音视频文件,迁移过程中对迁移服务器要求高,要频繁的读写磁盘,导致迁移速度慢,如果遇到临时应急情况,需要紧急迁移,基于以上的迁移过程在效率上得不到保证。针对先下载后上传的迁移方法中的不足之处,对于采用分级存储[3-4]的迁移系统功能分析如下:(1)下载和上载过程并发执行,下载一部分文件数据的同时,上载这部分数据到目标存储服务器,以提高迁移效率。(2)传统迁移方法利用硬盘作为临时存储空间,但磁盘速度远远低于内存读写速度,故应使用内存作为临时存储空间,提高迁移的速度。(3)内存容量的有限性,对于大容量文件,不能分配与文件大小匹配的内存作为临时存储区,因而需设计一块内存空间供循环读写,实现内存空间的高效利用。

针对以上需求分析,在实际电视广播工程实践开发中,提出了循环内存流迁移的方式来满足以上需求,避免了频繁的磁盘I/O读写操作,设计合适的循环内存流,能有效实现多个迁移任务并发执行。

2 循环内存流设计与实现

循环内存流设计的基本思想是:在内存空间中开辟出指定大小的内存块(例如10M),一个Writer线程从局域网中某FTP服务器不断下载数据到该内存块中;另一个Read线程源源不断从内存块中取出数据进行迁移到局域网中另外的FTP服务器。两个线程共用一块内存区,并能循环对此内存区进行读写。如图2所示,沿着循环流的方向,Read线程读取数据总在Write线程写入之后,以保证每次能读到数据;Write线程每次写到流末尾,即进行跳转到流开始处,从头开始写入数据,Read线程与Write线程类似。为了能保证循环读写的顺利进行,假设每次读写的数据量为Count(一般为32K),每次读数据时要求不超过已写入数据的位置,而每次写时要求写入的位置的数据已经读出,每次写完时,总有Write线程所指向内存流的位置比读线程所指向位置大于或者等于Count成立。两个线程同步进行,不停循环进行读写操作,从而实现文件基于循环内存流的迁移过程。

为了实现数据的准确传输,不会产生数据的丢失和读写误操作,必须进行线程间同步,即保证读数据之前,已经有数据写入,循环再次写入时,该内存块数据已经被读出。实现中采用面向对象技术,编写了TMemoryStream类实现循环内存流,以下对循环内存流的实际工作原理关键性节点进行阐述。

图2 循环内存流原理示意图

类中部分关键字段定义。Memory Capacity:设定内存流的大小;Count:每次读出或者写入流的大小。FPosition:本次进行读或者写流的位置指针; WritePosition :写位置指针,指向迁移文件已经写入了的文件位置;ReadPosition:读位置指针,指向迁移文件已经读出了的文件位置;IdMutex:保证读写线程同步的互斥量。例如,要实现从二级存储A服务器迁移到一级存储B视频服务器,某次迁移的文件大小为1G,假设内存流设置为10M,每次读入或者写入流的数据为32K。依据字段定义Memory Capacity为10*1024*1024(单位为字节);Count为32768;WritePosition和ReadPosition取值范围为0到1*1024*1024*1024(1G),且为Count的整数倍;F Position每次读出或者写入时需要计算,计算方法为WritePosition或者ReadPosition对F Capacity求余,这样能顺利实现读写到末尾重新从内存流头部开始,实现循环内存流。

图3 循环内存流类Write方法流程

类中关键方法实现。SetCapacity方法,该方法主要在初始化内存流时指定内存大小,即指定MemoryCapacity大小,并用malloc函数开辟循环内存流所需空间。Seek方法用于实现每次写入或者读出时计算FPositon,以确定要每次进行操作的内存流位置。Write和Read方法分别用于下载近线存储文件到内存流和上载内存流到在线存储服务器。

由于需要并发进行迁移,读写也要求并发进行,循环内存流设计中用IdMutex互斥量保证并发时数据读写的准确性。以Write方法流程作为详细阐述,简化流程如图3,读过程类似。进行某次数据写入之前,必须保证写指针在读指针之前,这样做能有效保证写入数据安全性,因而写流程进入后首先需要判断是否满足写的条件,具体为WritePosition和ReadPosition之差是否大于或者等于Count。如果不满足,则进行等待,一直等不到条件成立,7秒后退出,满足则进入互斥量保护的写入过程。写过程首先找到本次要写入的位置,然后判断这次写入是否在流的最后位置,如果在最后位置,最后位置又没有Count容量供本次写入,则需要进行分次写入,先写满流末尾部分,之后再流的开始部分再写入本次剩余的数据,不需要分次直接一次写满Count数据到内存流。最后改变WritePosition位置,释放互斥量,返回写入数据量,结束写过程。

3 测试及小结

图4 循环内存流迁移方法测试结果对比图

图4为测试对比结果,测试环境为两台FTP服务器,一台迁移服务器,三台机器配置如下:windowsServer2003系统,CPU型号为Pentium(R) Dual-Core E5200,内存2G,FTP软件为Server-U。对比先下载后上传方法和循环内存流迁移方法可以发现,循环内存流效果比先下载再上传速度要快了将近一倍。对于自动迁移服务器来说,采用循环内存流的迁移方法大大减轻了迁移服务器的负担,迁移服务器可以工作更为稳定且延长磁盘使用寿命,在实际应用过程中,基于循环内存流的迁移系统能在迁移过程中实现任务并发操作,已经成功在多个地方电视台上线使用,具有较大的实际意义。

[1]肖艳平.数字电视播出系统中的近线存储[J].中国数字电视,2011(2):82.

[2]何建,唐继勇.硬盘播出数据存储技术分析[J].中国有线电视,2005(1):19.

[3]赵晓楠,李战怀.分级存储管理技术研究[J].计算机研究与发展,2011(3):48.

[4]罗敏.数据分级存储策略[J].城建档案,2009(5).

猜你喜欢

磁盘线程内存
叶腊石聚合成型及其旋转磁盘的制作方法
基于C#线程实验探究
它的好 它的坏 详解动态磁盘
基于国产化环境的线程池模型研究与实现
解决Windows磁盘签名冲突
线程池调度对服务器性能影响的研究*
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
Windows系统下动态磁盘卷的分析与研究
内存搭配DDR4、DDR3L还是DDR3?