双重编解码算法对比

概述

双重编解码算法是实现数据保护的关键技术。磁盘阵列中的常用算法是RAID6,其属于Reed-solomon算法范畴。RAID6算法计算复杂度较高,往往需要硬件加速单元的支持。随着闪存技术的发展,新的编解码技术层出不穷,因此有必要了解常用阵列技术的双重编解码算法,通常来讲,常用双重编解码算法主要有如下三种:

1,二维(2D)奇偶校验方法

2,EVEN-ODD编码校验法

3,Reed-Solomon编码校验法

下面会对这三种算法的原理进行详细说明,然后对比这三种算法的性能及计算复杂度。

二维奇偶校验算法

二维奇偶校验方法将数据磁盘组织成mXn矩阵,然后分别在水平方向和垂直方向都进行奇偶校验编码的方法。若数据盘有mXn个,则用于存放校验信息的磁盘数有m+n。二维奇偶校验采用简单的异或运算,容易实现。二维奇偶校验算法的原理如下图所示:

采用这种方式的磁盘冗余率为:

(m+n)/(mXn + m + n)

空间利用率为:

(mXn)/(mXn + m + n)

可以看出这种算法的计算复杂度非常低,但是,需要的冗余磁盘数量非常多。例如,对于一个12(3X4)盘的阵列,采用这种算法需要7块冗余盘,对于传统的RAID6算法只需要2块冗余盘。

EVEN-ODD编解码算法

这种编码方法采用水平冗余和对角线冗余来设计校验码,具体如下图所示:

水平校验

对角线校验

对于m块数据盘,这种编码方式需要2块冗余盘,编码方式采用普通的XOR计算方法。一块冗余盘为普通的RAID5水平校验算法;另一块冗余盘为对角线编码算法。EMC的XtremIO全闪阵列中的XDP采用的就是这种算法(可以参考文章《剖析XtremIO的XDP技术》)。

在传统的磁盘阵列中,这种算法的应用是有局限的,每次数据的更新将都会转换成“读-修改-写”的复杂、耗时操作,小写性能将会变得十分低下。但是,在全闪存阵列中,情况变得非常不同,数据小写的问题变得不存在,这种算法反而有了用武之地。

Reed-Solomon编码算法

Reed-Solomon编码算法就是现在RAID6所采用的算法。其基本原理如下图所示:

该算法的编码过程说明如下(具体算法可以参考《RAID6算法解析》):

       P编码采用异或操作得到,这一步与RAID5相似

       Q编码通过加权系数乘加的方法编码得到,可以与P编码构成两个方程,允许两块盘同时失效

       采用条带化的数据存储方式

       需要两块冗余盘,属于最优编码范畴

三种编解码算法性能对比

从理论分析上可以看出这三种编解码算法具有不同的IO性能。其中2D编码最简单,EVEN-ODD次之,RS编码计算最复杂。当系统存在故障盘时,三种算法具有不同的数据恢复计算复杂度。下图分别是一块盘损坏、两块盘损坏时的三种算法计算复杂度。其中,红线是RS算法,绿线是EO算法,白线是2D算法。(需要注意的是:横轴不是时间,而是磁盘数量;纵轴是计算复杂度)

单盘损坏时的数据恢复计算复杂度(X轴:磁盘数量,Y轴:复杂度)

两块盘损坏时的数据恢复计算复杂度(X轴:磁盘数量,Y轴:复杂度)

从上图可以看出,在这三种双错码编码中,2D译码最简单,EVEN-ODD次之,RS译码计算最复杂。

三种编解码算法在磁盘存储阵列中的对比结果如下表所示:

综上,在磁盘阵列应用领域,我们可以得出如下结论:

  1. 2D编码方法简单,易于实现,但是构造的磁盘阵列性价比低(不属于最优冗余编码)
  2. RS编、译码较EVENT-ODD复杂,一般需要用硬件电路实现,但是RS码小写性能好,因此,适用于硬件/软件优化(指令加速)实现的阵列中。
  3. EVEN-ODD编、译过程较RS码简单,只有异或操作,但是小写性能差,因此,EVEN-ODD适用于实时性较强的连续数据存储

随着闪存存储的发展,存储介质的特性发生了本质变化,因此,最佳编解码算法也将发生变化,原来并不适用于磁盘阵列的的EO算法可以在闪存存储中大发光彩。

时间: 2024-10-09 10:40:00

双重编解码算法对比的相关文章

DM8168添加DSP音频编解码算法--集成现有voice或audio codec

本文根据"How to integrate audio/voice in RPE in EZSDK.pdf"整理,建议读者直接下载,参考原文件.原文件下载链接: http://download.csdn.net/detail/guo8113/8122945 ps:本文只是参考文档进行定制补充,但目前笔者没有完成移植,仅供参考.转载请注明:http://blog.csdn.net/guo8113/article/details/40820897 DVR_RDK RPE添加其他音频编码 D

【转】DM8168添加DSP音频编解码算法--集成现有voice或audio codec

本文根据“How to integrate audio/voice in RPE in EZSDK.pdf”整理,建议读者直接下载,参考原文件.原文件下载链接: http://download.csdn.net/detail/guo8113/8122945 ps:本文只是参考文档进行定制补充,但目前笔者没有完成移植,仅供参考. 转载请注明:http://blog.csdn.net/guo8113/article/details/40820897 DVR_RDK RPE添加其他音频编码 DM816

详解音频编解码的原理、演进和应用选型等

本文来自网易云音乐音视频实验室负责人刘华平在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack根据演讲内容整理而成(本次演讲PPT文稿,请从文末附件下载). 1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性,Codec种类还是音频编解码复杂程度都远远比视频要高.视频的Codec目前还主要是以宏块为处理单元,预

Android音频开发(5):音频数据的编解码

前面四篇文章分别介绍了音频开发必备的基础知识.如何采集一帧音频.如何播放一帧音频.如何存储和解析wav格式的文件,建议有兴趣的小伙伴们先读一读,本文则重点关注如何对一帧音频数据进行编码和解码. 1. Android 官方的 MediaCodec API 首先,我们了解一下 Android 官方提供的音频编解码的 API,即 MediaCodec 类,该 API 是在 Andorid 4.1 (API 16) 版本引入的,因此只能工作于 Android 4.1 以上的手机上. 1.1 MediaC

Base64编解码Android和ios的例子,补充JNI中的例子

1.在Android中java层提供了工具类:android.util.Base64; 里面都是静态方法,方便直接使用: 使用方法如下: Java代码   // Base64 编码: byte [] encode = Base64.encode("Hello, World".getBytes(), Base64.DEFAULT); String enc = new String(encode); Log.d("","base 64 encode = &qu

各种与视频编解码以及视频图像处理的应用相关的新技术,新方法,各种软件开发相关的算法,思想。

1. 各种视频压缩标准(MPEG2, MPEG4, H261/2/3/4,X264, T264以及H264(AVC)和HEVC(H265)等的优化,改进,创新. 2. 各种不同平台的(CPU, GPU, DSP, ARM等等)开发,移植优化等, 涉及到的语言包括C, C++, X86汇编,TI DSP汇编,ADI DSP汇编, ARM汇编(armv4/v5/v6/v7 XSCALE WMMX cortex A8等),MMX, SSE, SSE2/3等, 以及目前利用OpenCL来调用GPU实现并

【H.264/AVC视频编解码技术详解】十三、熵编码算法(3):CAVLC原理

<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行解析和实现,欢迎观看! "纸上得来终觉浅,绝知此事要躬行",只有自己按照标准文档以代码的形式操作一遍,才能对视频压缩编码标准的思想和方法有足够深刻的理解和体会! 链接地址:H.264/AVC视频编解码技术详解 GitHub代码地址:点击这里 上下文自适应的变长编码(Context-base

【语言对比】JSON的编解码

JAVA.Python和C++对于json的处理,都可以通过第三方库来完成,语言本身都不支持.下面以常用的场景对比这三中语言在处理json上的优缺点.下面以java的jackson库.python的simplejson库以及c++的jsoncpp库作为各自语言的代表 1.把对象转换为json串 s1为各自语言定义好的类实例 JAVA: ObjectMapper objMapper = new ObjectMapper(); objMapper.writeValueAsString(s1) Pyt

Java网络编程-对象编解码方案、优劣对比

书籍推荐:   实例代码 :http://download.csdn.net/detail/jiangtao_st/7677503  用户对象 /** * * <p> *用户实体对象定义 * </p> * * @author 卓轩 * @创建时间:2014年6月20日 * @产品: UIC * @version: V1.0 */ public class UserDO implements Serializable { private static final long seria