混合文件系统范文

2024-07-28

混合文件系统范文(精选5篇)

混合文件系统 第1篇

随着4G、物联网、云计算等技术的飞快发展,人类正在从IT时代走向DT时代。DT时代意味着数以亿计的智能终端和传感器设备每时每刻都在向后台系统传输海量数据。数据规模呈现爆炸式增长的同时,数据的存储性能和管理需求也面临新的挑战和机遇。为了解决此问题,研究开发新型存储技术,成为未来构建高性能存储系统的关键。随着半导体技术的发展,一些具有优良特性的NVM(non-volatile memory)为构建高性能存储系统提供了契机,主要包括:相变存储器(PCM)、自旋转移力矩磁存储器(STT-RAM)、铁电存储器(FeRAM)等。这类NVM具有内存级存取和持久性存储两大特点,其主要特征表现为:访问延迟低、字节可寻址、集成度高、内部无机械运动等。

目前主要有两类NVM存储设备:替换内存的DIMM接口NVM存储设备和替换外存的PCIe接口NVM存储设备。理想情况下,利用DIMM接口NVM存储设备取代DRAM和硬盘,形成单层存储结构。一方面,CPU能直接通过load/store指令访问数据,避免已有内核IO栈的软件开销[1,2]。另一方面,基于DIMM接口的NVM存储设备可以通过CPU的cache提高设备的读写性能。由于DIMM插口数量和NVM集成工艺等限制,难以独立构建大容量SCM系统,因此在未来很长一段时间内,混合使用DIMM和PCIe两类接口的NVM存储设备是必然选择。但是现有内外存管理算法针对单一类型的存储设备而设计,无法有效管理由两类NVM存储设备构建的混合存储系统。同时两类NVM存储设备在接口、性能、容量等存在差异;存储系统中元数据和数据、文件之间的数据、单个文件的不同部分数据,都具有不同的访问特性。这给统一管理两类NVM存储设备增加了难度,同时也提供了思路。

本文基于混合存储结构,针对DIMM和PCIe接口NVM存储设备并存的情况,设计面向NVM的混合粒度文件系统UFS,实现两类NVM存储设备的统一管理NVM存储设备。

1 相关研究

在针对NVM构建新型文件系统方面,文献[3]使用已有的OS基础设施优化了文件系统,同时简化了其实现,通过虚拟地址空间存储文件数据,使用内存管理单元管理NVM空间,具有良好的性能;文献[4]、[5]针对NVM设计了新型文件系统,围绕DIMM接口NVM存储设备的字节寻址和持久化特性,优化了文件组织结构和一致性策略,显著提高了性能;文献[6]构建了针对NVM的运行时库,提供给用户程序使用,减少内核交互的软件开销,极大地发挥了NVM性能。

在利用NVM构建混合存储系统方面,文献[7]使用带后备电池的RAM构建文件的缓存,避免频繁将数据写入磁盘,提高文件系统的性能;文献[8]使用NVM存放文件系统中的元数据和小文件,设计了数据迁移算法避免NVM的空间限制;文献[9]分离数据和元数据,仅将元数据存放在NVM中,加速元数据的访问性能,同时使用轻量级事务机制避免了元数据更新的写放大问题;文献[10]使用NVM作为数据的缓存和持久性存储空间,通过缓存SSD的数据并适时调整热点数据到NVM上存储,提高了基于Flash的SSD随机写性能,延长使用寿命。

综上所述,目前针对NVM构建的新型文件系统,主要考虑的是如何避免各种软件开销,最大限度发挥DIMM接口NVM存储设备的性能,但没有考虑到现有单个NVM存储设备容量有限的问题。针对NVM构建混合存储系统方面,大多利用NVM作为缓存,同时研究数据的动态迁移算法,但没有考虑到文件数据之间以及文件与文件之间访问特性的区别。

2 混合粒度文件系统结构

两类NVM存储设备在访问接口、访问性能等方面存在差异,主要表现为:①DIMM接口NVM存储设备具有非易失性、低访问延迟和I/O性能高等优点,同时支持字节寻址的方式能够实现更加灵活的管理粒度;②PCIe接口NVM存储设备基于I/O总线,具备良好的向后兼容性,同时其单个设备存储密度更大、价格低,适用于构建基于NVM的大容量存储系统。因此针对DIMM和PCIe两类NVM存储设备特性混合构建的存储系统,本文设计了混合粒度文件系统UFS,其结构如图1所示。

混合粒度文件系统主要包含3个功能模块:①空间管理模块负责存储空间的分配与管理,以及维护文件系统的视图;②元数据管理模块负责两类NVM存储设备的元数据组织和索引;③聚合式文件管理模块负责在两类NVM存储设备上合理分布数据。

3 混合粒度文件系统空间管理策略

混合粒度文件系统视图如图2所示。将DIMM和PCIe接口NVM存储设备空间分别划分为字节区和块区,不同于Ext2[15]基于整个存储空间的块管理。字节区能利用DIMM接口NVM存储设备特性,能够满足对访问延迟、读写性能有较高要求的数据请求,避免数据因为粗粒度管理方式导致存储效率不高。因此将超级块、索引节点和目录树等元数据存放在字节区,同时将剩余的字节区空间用于存放频繁访问的文件数据以及小文件。块区利用PCIe接口NVM存储设备容量上的优势,同时在以块整数倍访问时也具有较高的I/O性能。因此,将大文件以及最近未访问的文件数据存放在块区。

由于字节区的管理粒度太小容易导致空间分配和回收的复杂性,因此混合粒度设计了一个简单高效的freelist链表结构来组织空闲区。其中链表中每个节点通过如图3所示的node描述符结构来表示已经申请的空闲区。

Flag占用Addr的最高位,用于指示申请的空闲区位于字节区还是块区。Addr长度由63bit的整数表示,用于指示申请的空闲区起始地址,63bit的寻址空间足够支持8EB的存储空间。Len表示连续空闲区的长度。Resvrd为保留字段。混合粒度文件系统利用Len字段能够支持连续块分配,大大减少了空闲块的分配次数和访问数据块时的查找次数,提高I/O效率。

4 基于多级索引表的元数据管理策略

混合粒度文件系统中字节区主要存放元数据,包括inode、目录、文件间接块,由于没有传统磁盘寻道操作的访问开销,无需设计类似B+树具有复杂分裂和合并的管理机制。

在混合粒度文件系统中采用类似Ext2中的多级索引表来组织和管理文件和inode表(视为特殊文件),保证数据灵活存储的同时,仍具有较高搜索速度。多级索引表包含有直接寻址字段和间接寻址字段。直接寻址字段直接指向数据块,有助于提高小文件的索引能力;间接寻址字段中每个中间节点存放指向多个子节点的指针数组,通过索引ID与数据块地址的映射实现对文件内容的检索。

5 混合式文件数据管理策略

由于受到DIMM接口数量以及单个NVM集成度的限制,混合粒度文件系统的字节区不可能存放所有文件数据。此外,对单个文件而言、各部分数据在访问频率上也存在很大差异,现有通过内存统一缓存数据来减少响应时间的方法,存在管理效率不高,无法适应存储级内存的问题。据此,混合粒度文件系统设计了聚合式文件组织结构,构建文件内缓存提高文件访问性能。聚合式文件inode结构如图4所示。

将文件存储空间划分为缓冲区和数据区两个部分,通过预留部分的直接寻址字段构建Sizep大小的缓冲区。文件可以通过type字段来识别缓冲区存储的数据类型,例如是小文件,还是频繁访问的热数据?数据区则基于多级索引表满足大文件的存储和访问需求。聚合式文件组织结构提高了文件数据的访问性能,同时也避免了字节区空间不足的问题。

6 系统原型测试与分析

在fuse用户态文件系统的基础上,实现了面向两类NVM存储设备的混合粒度文件系统UFS。由于当前没有成熟的NVM存储设备,基于内存模拟两类NVM存储设备,具体步骤如下:

(1)使用PMBD[11]模拟器模拟PCIe接口的NVM存储设备,设置80ns的读延迟和1000ns的写延迟模拟PCM类型NVM存储设备特性[2]。PMBD通过挂载点提供块区存储空间。

(2)DIMM接口NVM存储设备的访问特性和访问性能与DRAM类似,因此直接通过预留内核地址空间提供字节区存储空间。

(3)使用fuse建立用户态文件系统,实现相应的组织结构和管理功能,构建面向NVM的混合粒度文件系统。

UFS软硬件环境配置如表1所示,使用postmark和Time测试工具评估原型系统的性能。

6.1 使用Postmar测试的写性能

Postmark是一个单线程的文件系统测试工具,主要用于测试频繁、大量地存取小文件的情形。因此使用postmark评估UFS的读写性能,并与Ext3(Ext3 on PMBD)、ramfs文件系统进行分析对比。

首先配置UFS中Sizep的值为4100KB;然后设置postmark数据集包含30 000个大小为1 000~5 000KB的文件和1 000个目录;同时设置读写块大小为4 096KB;最后得到UFS的写性能,如图5所示。

从图5可以看出,由于Ext3是基于块的文件系统,UFS相对于Ext3在写性能上提高了28%。因此基于两类NVM存储设备特性,将DIMM和PCIe接口NVM存储设备空间分别划分为字节区和块区,比单纯使用PCIe接口NVM存储设备具有更高的写性能优势。相对于ramfs,UFS在写性能方面降低了38%,这是由于Sizep大小的限制使得大部分数据必须存放在块区,增加了访问延迟。但相比仅使用DIMM接口NVM存储设备的ramfs,UFS解决了存储空间不足的问题。

为了测试文件缓冲区大小对UFS写性能的影响,将Sizep的值分别设置为3700、4100、4500、4700和4900字节,然后使用上一节postmark相同配置继续测试UFS、Ext3(Ext3on PMBD)和ramfs。实验结果如图6所示。可以看出,UFS的写性能随着文件缓冲区Sizep的增大而上升,相对于Ext3,UFS的写性能从1.28x增加到了1.66x,这表明不同接口的NVM存储设备对文件系统性能有较大影响,利用字节区存储更多的文件数据,能够显著提高系统的写性能;但写性能的提高与缓冲区大小之间并不是线性关系,UFS的缓冲区增加了32%的存储空间,但写性能仅提高了22%,这说明通过合理利用字节区构建文件内缓存,能够避免过度依赖DIMM接口NVM存储设备的问题。

6.2 使用Postmar测试的读性能

使用6.1中相同的方法,首先测试UFS中Sizep为4100Kb时的读性能,如图7所示。可以看出NVMCFS在读性能方面相比Ext3提高了41%,相比ramfs仅降低30%,这表明UFS使用DIMM接口NVM存储设备构建的文件缓冲区降低了读延迟。相比写性能UFS的读性能更接近与ramfs,这是由于模拟PCIe接口的NVM存储设备的读延迟低于写延迟,从而进一步体现了UFS使用DIMM接口NVM存储设备构建文件缓冲区的优势。

类似地,分别设置Sizep的值为3 700、4 100、4 500、4700和4 900字节,测试缓冲区大小的变化对UFS读性能的影响。从图8可以看出,随着文件缓冲区的增加,UFS的读性能也越来越接近与ramfs,最小差距为22%,这表明通过设计的聚合式文件组织结构,在文件内缓冲文件数据,有效减少了访问PCIe接口NVM存储设备的次数,从而提高了文件系统的性能。同时,由于管理开销以及fuse额外的I/O访问路径,给UFS带来了额外读写开销,因此进一步发挥NVM系统的性能必须考虑软件和接口方面的优化。

6.3 使用Fio的测试与分析

为进一步评估UFS的I/O性能,在Linux下使用fio工具,测试随机读写的性能。配置Sizep的值为4 100KB;然后设置fio为随机读写模式,包含1 000个目录和30 000个平均文件大小为6 000KB数据集,设置读写比为3:7,读写块大小为4 096KB,测试结果如图9所示。UFS在随机读和随机写方面的性能均低于ramfs。一方面是因为数据集中大部分文件大于Sizep,使得聚合式文件结构使用I/O性能较差的块区存储数据;另一方面,也表明通过fuse构建的用户态文件系统具有冗余的I/O访问路径,导致额外的内核切换开销,从而降低了文件系统性能。但相比Ext3,UFS在随机读写方面都表现出优势,有效管理了不同特性的两类NVM存储设备。

7 结语

由于DIMM插槽数量和单个NVM集成度的限制,当前构建大容量SCM通常同时使用DIMM和PCIe接口的NVM存储设备。然而两类NVM存储设备在物理接口和访问性能上存在巨大差异,同时存储系统中文件数据之间以及文件与文件之间也存在不同的访问特性,使得当前针对单一设备设计的内外存管理算法均难以直接应用在面向NVM的混合存储系统中。本文针对两类NVM存储设备的特性,将存储空间划分为字节区和块区;设计了基于多级索引表的元数据和数据管理策略,提高元数据和数据的查找性能;设计了混合式文件数据管理策略,在两类NVM存储设备之间合理分布数据,提高数据的访问效率,解决单一NVM存储设备存储空间不足的问题;最后实现了混合粒度文件系统的原型,使用postmark和相关数据集进行了测试与分析,测试结果表明UFS的数据读写性能相比基于块的Ext3文件系统提高了28%-166%。

本文主要利用DIMM接口的NVM存储设备提高整个存储系统的IO性能,同时利用PCIe接口NVM存储设备提高存储系统容量,下一步将探索如何改变PCIe接口NVM存储设备的内部管理方式,进一步提高文件系统的性能。

参考文献

[1]Intel 64software developer’s manual[Z].2013.

[2]SWANSON S,CAULFIELD A M.Refactor,reduce,recycle:restructuring the I/O stack for the future of storage[J].Computer,2013(8):52-59.

[3]WU X,REDDY A L.SCMFS:a file system for storage class memory[C].Proceedings of 2011International Conference for High Performance Computing,Networking,Storage and Analysis.ACM,2011.

[4]J CONDIT,E B NIGHTINGALE,C FROST,et al.Better I/Othrough byte addressable,persistent memory[C].In Proceedings of the ACM SIGOPS 22nd Symposium on Operating Systems Principles,SOSP’09,2009:133-146.

[5]DULLOOR S R,KUMAR S,KESHAVAMURTHY A,et al.System software for persistent memory[C].Proceedings of the Ninth European Conference on Computer Systems.ACM,2014:15.

[6]VOLOS H,NALLI S,PANNEERSELVAM S,et al.Aerie:flexible file-system interfaces to storage-class memory[C].Proceedings of the Ninth European Conference on Computer Systems.ACM,2014:14.

[7]P M CHEN,W T NG,S CHANDRA,et al.The rio file cache:surviving operating system crashes[J].In Proc.of the Architectural Support for Programming Languages and Operating Systems,1996.

[8]AN-I A WANG,GEOFFREY H KUENNING,PETER REIHER,et al.The conquest file system:better performance through a disk/persistent-RAM hybrid design[J].ACM Transactions on Storage,2006(3):309-348.

[9]CHEN J,WEI Q,CHEN C,et al.FSMAC:A file system metadata accelerator with non-volatile memory[C].Mass Storage Systems and Technologies(MSST),2013 IEEE 29th Symposium on.IEEE,2013:1-11.

[10]QIU S,REDDY A L.Nvmfs:a hybrid file system for improving random write in nand-flash ssd[C].Mass Storage Systems and Technologies(MSST),2013IEEE 29th Symposium,2013:1-5.

混合文件系统 第2篇

chmod 运算符:+(加)、-(减)、=(赋予)

chmod +x file.txt (用户、组、其他用户,加执行权)

chmod u+x file.txt (用户,加执行权)

例4:

$ chmod a–x mm.txt

$ chmod –x mm.txt

$ chmod ugo–x mm.txt

三、Linux 常用文件权限

777(读写执行、读写执行、读写执行)

755(读写执行、读执行、读执行)

644(读写、读、读)

400(读、禁止、禁止

四、创建时的权限

(1)用户id(uid)用来设置文件所有者,主组用来设置用户组(除非创建文件的目录有Sgid位设置),

(2)“umask ”命令可以为用户账号中新文件的创建进行缺省设置。具体来 说,umask是用来设置权限掩码的,将现有的存取权限减掉权限掩码后,即可产生建立文件时默认的权限。例如,root的权限为 777,若权限掩码设为022,那么两都相减后可得755。在命令行中键入“umask ”命令,查看当前设置 ,如要修改“ umask”设置,输入:$umask 号码,如:umask 0022(默认设置),“umask” 命令不设置文本文件和脚本文件而只在目录中设置执行位。

(3)如果你创建一个文件夹或文件 (以umask 0022为例),777-022=755为创建文件夹的权限,而666-022=644为创建文件的权限,执行“ls -l”,会显示:rwxr-xr-x(文件夹),rw-r--r--(文件)

五、修改文件夹的权限──chmod

(1)参数含义:ugoa分别表示属主、属组、其它、所有;+表示追加权限;-表示删除权限;=表示追加指定的权限并删除其它非指定的权限。

(2)使用示例:追加属主可执行、删除属组可写、更改其它为仅读。

$chmod -c u+x,g-w,o=r file_name

(3)权限可以用字母或数字表示,读 (r) = 4,写(w) = 2,执行(或搜索)(x)=1这些数字加到一起就得到用于chmod命令的数字。(注意:如果您正在文件或目录中使用ACL,使用数字模式chmod命令会使ACL无效)

例:

所有者权限:读+写+执行=4+2+1=7

组许可权限 : 读+写= 4+2=6

其他用户许可权限:读=4

则命令为:$chmod 764 file_name4.将某个目录下的子目录和文件权限一次性更改的方法使用命令:chmod -R 777 目录名参数R即是对子目录进行递归操作

六、比较实用权限修改例子

查看linux文件的权限:ls -l 文件名称

查看linux文件夹的权限:ls -ld 文件夹名称(所在目录)

修改文件及文件夹权限:

sudo chmod -(代表类型)×××(所有者)×××(组用户)×××(其他用户)

常用修改权限的命令:

sudo chmod 600 ××× (只有所有者有读和写的权限)

sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)

sudo chmod 700 ××× (只有所有者有读和写以及执行的权限)

sudo chmod 666 ××× (每个人都有读和写的权限)

混合文件系统 第3篇

1、SCADA量测与PMU量测的匹配问题

采用SCADA量测对运行状态进行估量的过程中,要事先寻找一个相应的节点,这一节点的作用主要是作为参考之用。在实际的测量工作中,为了准确的测量出相差角的度数,应该选取合适的量测点,采用先进的技术系统,及全球定位系统,能够有效的测量出相应的相角差,之所以能够有效的对电力系统的状态进行估量,这与现代化的科学技术具有密不可分的关系,只有加强电力系统状态的稳定性,才能有效的测量出相应的差值,最终与PUM量测进行匹配。为了进行更为精准的测量,主要选取两个点作为参考,其中这两个点之间的差距为相角差,记作φ,根据φ的不同随时对相应的量测值进行修改。电压相角可以记作θ,根据测量值的不同而改变相角的位置,最终达到一种稳定的状态,计量相角的作用主要是为了加大电压的稳定性,从而有效的提高我国电力的发展水平,在今后的工作中,应该重视起电力系统的相应状态,使用混合算法是近几年来一种新形式的估算方法,这一方法的应用改变了传统算法存在较大误差的情况,从而影响到电力系统的实际状态,在这一要求下,加强对电力系统的保护就要从对状态的维护做起。而这种量测方式的应用,恰恰解决了差异性的特点,选取适当的参考点,进而测量出相应的相角差,最中对电力系统的状态进行准确的估量,这正是现代化的科学手段带来的测量方式。将SCADA量测与PMU量测进行有机的结合,寻求出相适应的匹配值,具有重要的意义,在今后的电力系统的工作中应该加强这方面的研究工作,最中为电力系统的发展做出宝贵的贡献。

2、状态量转换预测

电力系统在进行工作的过程中,状态是会随时发生转变的,尤其是电压幅值的变化会随着相应的关联性而出现较大的变化,在这一过程中,并不能有效的对电力系统的运行状态进行有效的预测,在这种情况下,可以采用状态量的转化的方式开展预测工作。具体的做法就是将通用状态变量进行相应的转化,使之转变为非通用状态变量,并且非通用状态变量具有节点相关性较弱的特点,在转化的过程中,状态变量会出现较大的变革,因而可以有效的估量出相应的状态。再采用潮流计算的方式将状态量进行转变。转变的主要内容为电压值以及相应的角度,这些变化值最终的去向就是电流向量。在具体的过程中,主要包含以下几个主要的过程,其一是将当前的状态进行初次的转化,并且进行相应的预测,以作为历史数据记录下来,在完成状态预测后,再进行二次转化,在完成二次转化后,最终的目的地就是电流相量。完成上述的过程后,电力系统的相关联性就能明显的展现出来,从而保证了对电力系统状态预测的准确性。在今后的测量工作中,可以广泛的采纳这一测量方式,以达到高效、准确的目的。并且这一方式还具有更加安全的特点,保证了操作人员的人身安全。

在测量的过程中,主要有以下几点是应该值得注意的,首先是在最初的状态变化的过程中,实现的方式为非线性网络方程,而在进行二次状态变化的过程中,主要采用的方式为潮流计算的方法,虽然这两种方法完全不同,但是都能够起到较为理想的转化目的,并且可以针对节点的不同而进行准确的测量,这正是现代化技术的优势所在,无论处于何种状态之下,都能够达理想的结果。但是其中需要注意的是,节点电压过于稳定,已经达到恒定的状态,会对转换的数值存在一定的影响,以至于最终的测量状态不准确,只要采取合适的手段进行测量,相信这一问题是完全能够避免的。

3、线性静态状态估计混合算法

根据SCADA量测以及PMU量测的特点,将这两者进行相应的对比可以明显的发现其中的优劣所在。例如前者在采样间隔的用时上需要浪费较长的时间,而后者的时间则明显要短很多。一般需要的时间仅仅少则5ms,最多不超过30ms。并且后者具有更加完善的量测配置,而前者的量测配置并不全面。从另一方面而言,这二者量测的种类也具有较大的差异性,相角量测以及网络拓扑信息在这两种量测方式上具有完全不同的要求。并且后者所使用到的混合算法更加快速,从而提高了对电力系统进行的状态估量。在具体的混合算法中,要事先设定一个时间,通常以1min为基准,在此基础上,采用传统的计算方式进行计算,也就是小二乘法,在此基础上,根据所测得的类型的不同将相应的系数进行分配,自此之后的一段时间内,大约相隔5s再进行一次测量,以此类推,根据PMU量测的数值作为参考基准,并且结合传统的测量方法,最终计算出线性运行的状态,以达到对电力系统运行的准确估计。

由于PMU的数据满足不了系统观测性的要求,需要增加伪量测以满足可观测性的要求。伪量测源自传统小二乘状态估计的结果和状态量转换预测的结果,即根据传统状态估计的结果、系统超短期负荷预报和由传统SE维护的母线负荷预报系数,计算得到当前时刻的母线注入功率,再根据发电计划得到发电机机端电压,调用潮流计算模块,得到当前时刻的系统状态,将其转换为母线注入电流向量的形式,作为伪量测与PMU量测一起进行线性状态估计计算。若PMU量测中包含某些母线的注入电流相量量测,则以PMU量测为准,状态量转换预测的结果只用于补充没有PMU注入电流相量量测的情况。通过状态量转换预测模块,将PMU数据与SCADA数据有机结合。将不可观测变为可观测,形成了线性状态估计,是现有方法的结合。该方法提高了状态估计的运行速度,可使状态估计的运行周期从分钟级降至秒级,从而从时间意义上提高了状态估计的实用性和准确性。

4、结语

综上所述,在今后的工作中,要进一步加强对PMU量测的研究以及分析,将其应用在实际的电力系统状态的估计中,能够起到理想的效果,并且为电力系统今后的发展做出更大的贡献,有效的提高了数据的准确性,从而降低不利因素对电力系统相关参数的影响。

混合文件系统 第4篇

Matlab是由Math Works公司推出 的主要面 向科学计 算 、 数据可视化以及交互式程序设计的高科技计算环境。 它以强大的数据处理能力、 丰富的工具箱以及简单易用的特点, 大幅度地缩短了程序的开发周期 , 提高了编 程效率[1]。 但由于Matlab是一种解释型的语言开发平台 , 这便决定了它的执行效率比较低。 特别是在处理大量循环运算时, Matlab的计算速度常是无法忍受的。 C++是在C语言的基础上开发的一种通用编程语言, 作为一种编译型语言, C++能够较方便地开发出界面友好、 执行速度快且易于升级的软件系统[2], 但C++仅提供了基本的数学函数库, 复杂数值计算的大量代码需由工程师重新编写, 增加了软件开发成本。 于是, Matlab与C++的混合编程受到了工程科研人员的关注, 以期将Matlab丰富的数学函数库与C++快速的计算能力相结合, 为科研与工程开发提供高效的技术支持。

Matlab与C ++ 混合编程 的途径主 要有以下 几种 :( 1) C++通过引擎和动态链接库调用Matlab程序 , (2) C++ 通过COM组件调用Matlab程序 , (3) Matlab调用C++ 程序MEX文件等[3]。 目前 , 已有的研究主要集中在前两种途径的实现与对比上, 主要针对第三种途径, 介绍了基于MEX文件Matlab与C++混合编程及数据类型与操作的方法, 供开发人员及编程爱好者参考。

2MEX文件

MEX文件是Matlab调用C ++ 程序的接 口文件 , 包含有Matlab解释器可以动态装载和执行的动态链接模块[4]。 在Win dows平台下 , MEX文件以动态链接库的形式存在 (Matlab 6.5前版本为 *.dll, Matlab 7.0后为 *.mexw32或 *.mexw64), 是由C++语言编写的cpp文件通过Matlab编译器编译后获得的 。

在编译MEX文件之前, 必须对Matlab编译器进行配置, 主要包括mbuild – setup和mex – setup两个步骤 。 通过在Matlab命令行窗口分别执行上述代码 , 选择与计算机相对应的编译器类型及编译器版本, 便可完成编译器的配置过程。

用C++语言编写MEX文件源代码时, 必须创建mex Func tion这个函数 。 mex Function函数的作用与C++ 语言中的main函数功能类似, 是Matlab与C++语言子程序的接口, 其作用是在Matlab系统与被调用的外部子程序之间建立通信联系。 mex Function函数的基本格式为 :

其中, nlhs和nrhs为整型, 分别表示输出和输入参数的个数, plhs[] 和prhs[] 为mx Array型指针数组, 分别表示输出和输入变量的地址。 将文件存储为testfunc.cpp, 在Matlab命令行窗 口执行>>mex testfunc.cpp语句 , 即可生成MEX文件testfunc.mexw32。 假设testfunc函数的输入参数为两个 , 输出参数为3个, 在Matlab的命令行窗口中执行MEX文件的代码格式为:

>>[Out1, Out2, Out3]=testfunc(In1, In2);

而在mex Function函数中, 通过nrhs判断输入参数的个数, In1, In2分别对应prhs [0] , prhs [1], 在函数体内进行一系列的计算后, 将输出数据通过nlhs判断输出plhs [0] , plhs [1]plhs [2] 分别传递给Out1, Out2, Out3。 可见 , 只要按照规定的书写格式编写testfunc.mex文件, testfunc函数的使用方法与一般的Matlab函数完全一致, 当有的函数在Matlab中的执行效率很低时 (如循环), 通过MEX文件采用C++语言来实 现 , 便可以提高整个程序的执行速度。

3混合编程的数据类型及操作方法

3.1数据类型

由第二节的讨论可知, 利用C++语言编写MEX文件的关键点在于实现mex Function函数中Matlab与C++代码模块的数据交互。 Matlab/C++语言接口有一些特殊的数据类型, 如表示阵列索引的mw Index, 逻辑型mx Logical, 区分浮点数值阵列是实数还是复数的mx Complexity等, 除此之外, 还有一个特别重要的数据类型: mx Array。 mex Function函数中的plhs[] 和prhs[] 均为mx Array型指针数组 , 事实上 , Matlab所有的数据类型都可以用mx Array来描述, 并且mex Function函数的所有输入、 输出参数都是采用mx Array的形式来实现的[5]。

3.2数据操作方法

mx Array实际上是一个结构体 , 但通过C++语言结构体表示多种类型的Matlab数据并不简单, Matlab提供了一系列以mx开头的API函数对mx Array进行操作 。 对于利用mx Arra描述的Matlab普通数值阵列, 其操作主要是对数据区和索引的操作, 常用的数据操作函数如表1所示。

工程计算 中经常会 遇到各类 高阶稀疏 (Sparse) 矩阵 , Matlab是通过Sparse阵列处理的 , 采用Sparse阵列可以使零元素个数很多的数组占用较少的内存空间。 对于计算密集型问题, 采用稀疏矩阵也可以降低计算量。 可通过mx Create S parse函数创建稀疏矩阵的mx Array指针 , 但其构造需通过个部分来完成, 包括数据 、 行值索引 (ir) 和列值索 引 (jc)。 Matlab数值阵列的元素均是按列存储的 , 对于m×n的矩阵P, 若P (i,j) 为第j列第t个非零数据, 则其线性索引Index为j [j] +t-1, 行值为i-1。

4应用实例

采用一个简单的实例说明MEX文件的格式、 混合编程的数据类型及操作方法。

求n阶方阵A的逆矩阵 , 其中是一个稀疏矩阵 。

运用Matlab与C++混合编程解决问题的思路是, 首先通过C++生成矩阵A, 再利用Matlab中的求逆函数对矩阵求逆。 实现矩阵生成的文件matrix_A.cpp的关键代码如下:

对matrix_A.cpp进行编译 后 , 在Matlab命令行窗 口执行>>A=matrix_A (1000) ; inv_A=inv (A) ; 语句 , 便可计算 出n=1000时方阵A的逆矩阵 。 当计算机配置为Intel (R) Cor (TM) i5-3450 (3.10GHz) 处理器 、 8G内存 、 1T硬盘时 , 计算耗时为0.04s, 对比仅用Matlab计算时的0.77s (限于篇幅 , Matlab源代码略 ), 可见Matlab与C++的混合编程能较显著地加速程序。 事实上, 方阵的维数n越大, 混合编程的优势便越明显。 同时, 通过对Matlab中内置的inv函数的运用, 避免了C++中复杂的求逆函数编制, 提高了开发效率。

5结语

介绍了Matlab与C++语言的特 点以及基 于MEX文件的Matlab与C++ 混合编程的原理 。 通过一个简单的实例说明了MEX文件的格 式 、 混合编程 的数据类 型及操作 方法 , 可见Matlab与C++混合编程在解决相关问题上的优势 。 对于开发人员及编程爱好者而言, Matlab与C++的混合编程不失为一个很好的选择。

摘要:介绍了Matlab与C++语言的特点,分析了基于MEX文件的Matlab与C++混合编程的原理。通过一个简单的实例说明了MEX文件的格式、混合编程的数据类型及操作方法,体现了Matlab与C++混合编程在解决相关问题上的优势,对于开发人员及编程爱好者而言,不失为一个合适的选择。

文件系统安全实验 第5篇

groupadd student

chown root:student /student/passwd其它人没有执行权限kevin能读写该文件

setfacl-m u:kevin:wr passwdtodd 只能读

setfacl-m u:todd:r passwd

创建/student/test目录,要求

Mkdir /student/teststudent组的用户对此目录有完全权限

setfacl-m g:student:rwx /student/testkevin对此目录有r-x权限

setfacl-m u:kevin:rx /student/test在此目录中创建的文件,只有本人和root可以删除(sticky)o+t chgrp student /student/test

chmod o+t /student/test/

上一篇:造林密度下一篇:订单培养模式