存储映射I/O – AlanTu

继续说具有独立和延续的杜撰地址挡住通路。,在32位建筑学中,继续说的地址挡住通路是4G。。不外,内核理性内存A办理继续说的地址挡住通路。。内存区域是全部地址挡住通路中间的一点钟独立的内存区域。,它在内核中运用vMyReaaSuxt资料结构来撰文。。每个内存区域都有本人的拜访靠动力行进和用双手触摸、举起或握住功用。,依据,继续说要缺陷拜访无效范围内的内存地址。。

内存映照I/O是一种本内存区域的上级I/O用双手触摸、举起或握住,它将磁盘提出映照到继续说地址挡住通路中间的内存区域。。从内存中读取资料时,这相当于从磁盘提出读取资料。,当资料写作此内存时,它相当于率直的向磁盘提出写作资料。。很就可以在不运用根本I/O用双手触摸、举起或握住职务read和write的产生下使生效I/O用双手触摸、举起或握住。

1。根本成功办法

成功内存映照I/O的紧排用双手触摸、举起或握住是经过mmap体系使调动将一点钟认为的磁盘提出映照到一点钟内存区域中。

void*mmap(void*addr, size_tlength, intprot, intflags, intfd, off_t offset);

Linux上的手册曾经被解说整整了。,喂缺乏更多一项。PROT和手势参量需求在喂详细说明。。PROT用于详细说明映照区域的支持命令,纵然它不克不及被支持非常好的提出中详细说明的翻开靠动力行进。。比方,在PrimeRead中翻开提出,这么以读写(PROT_READ|PROT_WRITE)方法支持内存区域是不正当的。手势用于详细说明内存区域的多个属性。,两个类型的值是MAPH共享和MAPH公有。MAPyBaseFrand手势详细说明内存的继续说修正。当为标志详细说明MAPJULL公有时,继续说会为该映照内存区域建立一点钟公有正本,此内存区域上的占有用双手触摸、举起或握住都在该正本上使生效。,内存区域的修正无力的产生提姆的映照提出。

喂是一点钟复杂的示例顺序,它将磁盘提出映照到内存区域。,率先经过MMAP送还交给读取提出,调解另一点钟提出。可以布告,提出的读写用双手触摸、举起或握住都是经过内存完成的的。。

    int main()
{
int fd;
char *buf = NULL;
int i;
//翻开一点钟提出
if (-1 == (FD) = 翻开(/, O_RDWR))) {
翻开 file error!\n”);
摆脱了责任或义务的(1)
}
将提出映照到继续说的内存区域
buf = MMAP(空), 100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (!BUF) {
MMPP(MMAP) error!\n”);
摆脱了责任或义务的(1)
}
//对映照内存读资料
for (i = 0; i < 100; i++)
%C, BUF[Ⅰ]
将资料写作映照内存器
if (BUF〔0〕 == ”H”)
BUF〔0〕 = ”h”;
else
BUF〔0〕 = ”H”;
体系(猫 ./”);
return 0;
}

2.运用内存映照I/O举行提出拷贝

运用根本I/O用双手触摸、举起或握住职务到何种地步成功一点钟类比cp命令的顺序?比方本人要将A提出生殖到B提出,这么顺序的根本骨架是很的:

()提出A和提出B

2.将A提出的愿意的read()到buffer

3.将buffer中间的资料write()到提出B

4.close()提出A和提出B

设想运用内存映照I/O来成功cp命令,这么它的根本骨架是很的:

()提出A和提出B

2.mmap()提出A和提出B,内容src和dest拆移为两个提出映照到内存的地址

3.将以src为发源的len长八位位组资料memcpy()到dest

4.close()提出A和提出B

示例顺序列举如下:

    int main()
{
int srcfd, destfd;
struct stat statbuf;
char *src = NULL, *dest = NULL;
翻开两个提出
if (-1 == (srcfd = 翻开(/, O_RDONLY))) {
翻开 src file error!\n”);
摆脱了责任或义务的(1)
}
if (-1 == (destfd = 翻开(/, O_RDWR | O_CREAT | O_TRUNC))) {
翻开 dest file error!\n”);
摆脱了责任或义务的(1)
}
获取原始提出的浆糊
if (-1 == fstat(srcfd, &statBUF)) {
printf(“fstat src file error!\n”);
摆脱了责任或义务的(1)
}
设置输入提出的上浆
if (-1 == lseek(destfd, – 1, SEEK_SET)) {
printf(“lseek error!\n”);
摆脱了责任或义务的(1)
}
if (-1 == write(destfd, “”, 1)) {
写作 error!\n”);
摆脱了责任或义务的(1)
}
if (SRC) = MMAP(0), , PROT_READ, MAP_SHARED, srcfd, 0)) == MAP_FAILED) {
MMPP(MMAP)ing src file error!\n”);
摆脱了责任或义务的(1)
}
if (最) = MMAP(0), + 2, PROT_READ | PROT_WRITE, MAP_SHARED, destfd, 0)) == MAP_FAILED) {
MMPP(MMAP)ing dest file error!\n”);
摆脱了责任或义务的(1)
}
memcpy(dest, src, );
SRC(SRC) 提出:\n
体系(猫 ./”);
普雷特夫 提出:\n
体系(猫 ./”);
close(srcfd);
close(destfd);
return 0;
}   

理性下面列出的根本骨架,顺序率先翻开两个提出,经过FSTAT获取源提出的浆糊。因MMAP提出和设置行动提出浆糊的恳求。设置行动提出可以经过LQuess成功。,设想未设置行动提出的浆糊,之后会产生公路失当(跳过SigBUS)。。之后拆移mmap()两个提出到继续说的地址挡住通路,决赛,使调动MEMCPY()来从源提出内存AR中生殖资料。。

提出生殖可以经过根本的I/O和内存映照I/O来完成的。,这么谁更无效率呢?这确实是一点钟很难回复的成绩。。无论是运用根本的I/O用双手触摸、举起或握住功用左右MMAP样品,内存中间的用双手触摸、举起或握住体系缓存,在不相同的使用权光景中、胜利将受到不相同平台的产生。。纵然而且这些反应式在远处,它不过在提出用双手触摸、举起或握住面貌。,内存映照比读写快。

设想运用读/写生殖提出,率先,将资料从内核起缓冲作用的人生殖到用户挡住通路起缓冲作用的人。,这是研究的工艺流程。;再将资料从用户挡住通路起缓冲作用的人生殖到内核起缓冲作用的人,这是写作工艺流程。。设想是内存映照样品,则率直的是用户挡住通路中资料的拷贝,换句话说将源提出所映照内存中间的资料拷贝到行动提出所映照的内存中。很就制止了用户挡住通路和内核挡住通路私下资料的往返拷贝。

纵然内存映照缺陷至上的的,它所映照的提出要缺陷是整齐的上浆的。,因提出映照的内存区域的上浆由Len A详细说明。此外,由提出映照的内存区域的上浆麝香在页中。。比方,体系翻页上浆为4096八位位组。,认为映照提出的上浆为20八位位组。,之后剩的4076个翻页的八位位组都被废话到0个八位位组。。尽管可以经过映照地址拜访和修正其他人员八位位组,但映照提出中无力的影像一点更改。。由此可见,运用内存映照生殖少量资料更无效。

发表评论

电子邮件地址不会被公开。 必填项已用*标注