当前位置: 首页 > news >正文

哪些软件可以做网站设计创意视频制作app

哪些软件可以做网站设计,创意视频制作app,虾皮购物网站怎么做,安阳做推广网站mmap#xff08;#xff09;函数是一个用于在用户空间和内核空间之间进行文件映射的系统调用。它允许文件在物理内存中的特定区域被映射到进程的地址空间中#xff0c;从而允许进程通过内存访问操作来读取和写入文件。 函数原型#xff1a; #include sys/mman.h …mmap函数是一个用于在用户空间和内核空间之间进行文件映射的系统调用。它允许文件在物理内存中的特定区域被映射到进程的地址空间中从而允许进程通过内存访问操作来读取和写入文件。 函数原型 #include sys/mman.h ​ void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 参数说明 addr映射的起始地址一般为NULL让内核自动选择。 length映射的长度可以是文件的长度或者是页的整数倍。 prot内存保护标志用于指定内存的保护方式如读、写、执行等。 flags控制映射的标志如映射是共享的还是私有的。 fd打开的文件描述符指定要映射的文件。 offset文件映射的偏移量指定映射文件开始的位置。 参数的重点介绍 addr 如果addr为NULL内核会自动选择一个起始地址作为映射的起点。 如果addr不为NULL则内核会尝试将映射放置在指定的起始地址处。如果指定的地址无效或与已有映射冲突则mmap调用会失败。 通常情况下最常用的做法是将addr设置为NULL由内核选择一个适当的地址。 length length参数指定要映射的长度可以是文件的长度或者是页的整数倍。对于文件映射length一般为文件大小。 对齐到页面大小可以获得最佳性能因为页面是内存管理的最小单位。 prot prot参数指定内存的保护标志用于指定内存的访问权限。常见的标志有PROT_READ可读、PROT_WRITE可写和PROT_EXEC可执行。 这些标志可以按位或运算进行组合以指定多个访问权限。 flags flags参数用于控制映射的标志用于指定映射是共享的还是私有的以及一些其他的映射特性。 常见的标志有MAP_SHARED共享映射和MAP_PRIVATE私有映射。 共享映射允许多个进程对映射进行读写操作而私有映射则会对映射的页进行复制每个进程都有自己的私有拷贝。 fd fd参数是打开的文件描述符用于指定要映射的文件。 如果fd为-1则表示创建一个匿名映射anonymous mapping不与任何文件关联而是在内存中分配一段连续的空间。 匿名映射通常用于进程间的共享内存或者用作临时存储空间。 offset offset参数指定从文件的哪个位置开始进行映射。一般情况下可以将offset设置为0表示从文件的开头位置开始映射。 offset必须是页面大小的整数倍。 返回值 mmap函数返回一个指向映射区域的指针如果映射失败则返回MAP_FAILED。 文件映射的类型flags参数 私有映射Private Mapping对映射的修改不会影响到原始文件映射的页会被复制到进程的私有页中。 共享映射Shared Mapping多个进程可以对映射进行读写操作任何一个进程对映射的修改都会影响到其他进程。 文件映射的特性 文件映射是一种将文件内容直接映射到进程地址空间的技术它允许进程通过对内存的直接操作来读取或写入文件。文件映射具有以下特性 零拷贝Zero-Copy 文件映射可以实现零拷贝操作即数据可以直接从文件系统读取到映射的内存区域而无需在用户空间和内核空间之间进行数据复制。这可以显著提高I/O操作的效率。 内存操作 通过文件映射进程可以使用内存访问指令如读写操作来直接访问文件内容而不是使用传统的文件I/O如read()和write()。这使得文件操作看起来像是对内存的直接操作简化了编程模型。 共享访问 当使用共享映射MAP_SHARED标志时多个进程可以访问同一文件映射区域。这意味着任何进程对映射区域的修改都会立即对其他所有共享该映射的进程可见反之亦然。 私有访问 私有映射MAP_IVATE标志则不允许其他进程访问该映射区域。进程对私有映射的修改不会影响其他进程也不会影响原始文件。 懒惰写入Lazy Write 默认情况下文件映射采用懒惰写入策略。这意味着对映射区域的修改不会立即写入文件系统而是在映射区域被回收时或者显式调用msync()函数时才进行写入。这可以减少不必要的磁盘I/O操作提高性能。 同步机制 文件映射提供了同步机制例如msync()函数可以用来强制将映射区域的修改写入文件系统或者将文件系统中的修改同步到映射区域。 内存保护 文件映射允许通过prot参数来设置内存保护标志如PROT_READ、PROT_WRITE和PROT_EXEC以确保映射区域的安全性。 映射类型 文件映射可以是匿名映射不与任何文件关联或文件映射与特定文件关联。匿名映射通常用于进程间通信而文件映射则用于访问文件系统中的数据。 页对齐 文件映射的起始地址和长度通常需要对页面大小进行对齐。页面大小通常是4KB这取决于系统的内存管理配置。 mmap内存映射原理摘自大佬博客 mmap内存映射的实现过程总的来说可以分为三个阶段 一进程启动映射过程并在虚拟地址空间中为映射创建虚拟映射区域 1、进程在用户空间调用库函数mmap 2、在当前进程的虚拟地址空间中寻找一段空闲的满足要求的连续的虚拟地址 3、为此虚拟区分配一个vm_area_struct结构接着对这个结构的各个域进行了初始化 4、将新建的虚拟区结构vm_area_struct插入进程的虚拟地址区域链表或树中 二调用内核空间的系统调用函数mmap不同于用户空间函数实现文件物理地址和进程虚拟地址的一一映射关系 5、为映射分配了新的虚拟地址区域后通过待映射的文件指针在文件描述符表中找到对应的文件描述符通过文件描述符链接到内核“已打开文件集”中该文件的文件结构体struct file每个文件结构体维护着和这个已打开文件相关各项信息。 6、通过该文件的文件结构体链接到file_operations模块调用内核函数mmap其原型为int mmap(struct file *filp, struct vm_area_struct *vma)不同于用户空间库函数。 7、内核mmap函数通过虚拟文件系统inode模块定位到文件磁盘物理地址。 8、通过remap_pfn_range函数建立页表即实现了文件地址和虚拟地址区域的映射关系。此时这片虚拟地址并没有任何数据关联到主存中。 三进程发起对这片映射空间的访问引发缺页异常实现文件内容到物理内存主存的拷贝 注前两个阶段仅在于创建虚拟区间并完成地址映射但是并没有将任何文件数据的拷贝至主存。真正的文件读取是当进程发起读或写操作时。 9、进程的读或写操作访问虚拟地址空间这一段映射地址通过查询页表发现这一段地址并不在物理页面上。因为目前只建立了地址映射真正的硬盘数据还没有拷贝到内存中因此引发缺页异常。 10、缺页异常进行一系列判断确定无非法操作后内核发起请求调页过程。 11、调页过程先在交换缓存空间swap cache中寻找需要访问的内存页如果没有则调用nopage函数把所缺的页从磁盘装入到主存中。 12、之后进程即可对这片主存进行读或者写的操作如果写操作改变了其内容一定时间后系统会自动回写脏页面到对应磁盘地址也即完成了写入到文件的过程。 注修改过的脏页面并不会立即更新回文件中而是有一段时间的延迟写回策略中有介绍可以调用msync()来强制同步, 这样所写的内容就能立即保存到文件里了。 注意点 对齐要求 mmap()函数通常会要求映射区域的起始地址和长度是页面大小通常为4KB的整数倍。因此在使用mmap()函数时需要确保起始地址和长度符合对齐要求否则可能导致映射失败。 长度与文件大小的关系 如果将文件映射到内存中通常需要保证映射的长度与文件的大小相匹配以确保可以访问到文件的所有内容。否则如果访问超出映射长度范围的数据将会引发段错误Segmentation Fault。 文件描述符的打开方式 在创建文件映射时需要使用正确的文件描述符打开方式。如果需要对映射进行读写操作应使用O_RDWR标志如果只需要读取文件内容应使用O_RDONLY标志如果只需要写入文件内容应搭配O_CREAT | O_TRUNC等标志使用。 内存保护标志的设置 需要根据需求正确设置内存保护标志prot参数以决定映射区域是否可以读取、写入或执行。不正确的设置可能导致访问权限不足的问题。 共享映射的同步 如果使用共享映射MAP_SHARED标志需要注意在多个进程之间对映射区域的同步操作。在多进程并发访问映射区域时需要使用其他机制如信号量、文件锁等来保证数据的一致性和互斥访问。 文件的改变对映射的影响 如果映射的文件发生变化如被其他进程修改、截断等映射区域的行为是未定义的。为了避免这种情况可以在映射区域上使用madvise()函数并使用MADV_DONTNEED标志来告知系统底层页不再需要从而避免无效访问。 取消映射和关闭文件描述符 在不再使用映射区域后需要使用munmap()函数释放映射内存同时关闭相关的文件描述符。如果忘记取消映射和关闭文件描述符可能会导致内存泄漏和资源泄漏。 拓展函数 munmap munmap()函数是用于取消映射区域的系统调用它将释放由mmap()函数创建的内存映射。 以下是munmap()函数的重点介绍 函数原型 #include sys/mman.h int munmap(void *addr, size_t length); 参数说明 addr指向要取消映射的起始地址。 length映射区域的长度。 函数返回值 munmap()函数返回0表示成功返回-1表示失败。失败的原因可能是无效的起始地址或长度或者由于权限不足。 功能 munmap()函数用于取消映射区域将内核中的虚拟内存释放回操作系统。取消映射后该区域不再可访问。 注意事项 munmap()函数必须以mmap()函数返回的起始地址和长度作为参数进行调用否则会出现未定义的行为。 取消映射后该区域的访问将引发段错误Segmentation Fault。 取消映射并不会自动关闭与映射区域关联的文件描述符需要通过调用close()函数来显式关闭。 msync msync()函数是用于将内存中的改动同步到文件系统中的函数确保数据的持久化。它可以用于确保对映射区域的修改写入文件系统或者将文件系统中的修改同步到映射区域。 以下是msync()函数的重点介绍 函数原型 #include sys/mman.h int msync(void *addr, size_t length, int flags); 参数说明 addr指向映射区域的起始地址。 length映射区域的长度。 flags用于指定同步操作的标志。常见的标志有MS_ASYNC异步写入、MS_SYNC同步写入和MS_INVALIDATE使缓存无效。 函数返回值 msync()函数返回0表示成功返回-1表示失败。失败的原因可能是无效的起始地址或长度或者由于权限不足。 功能 msync()函数用于将进程内存中对映射区域的修改写入到文件系统中或者将文件系统中的修改同步到映射区域。这样可以确保数据的持久化保证文件的一致性。 同步模式 msync()函数提供了两种同步模式 MS_ASYNC异步写入模式。这种模式下msync()函数会立即返回而不会等待写入操作的完成。这样可以提高性能但不能保证写入的数据立即持久化到磁盘上。 MS_SYNC同步写入模式。这种模式下msync()函数会等待所有的写入操作完成然后返回。这确保了对映射区域的修改已经持久化到磁盘上。 缓存处理 msync()函数的flags参数中的MS_INVALIDATE标志可用于使缓存无效即强制从文件系统重新读取映射区域的数据。这样可以确保映射区域的数据与文件系统的数据一致。 例子 1.读取文件 #include fcntl.h #include sys/mman.h #include sys/stat.h #include unistd.h #include stdio.h ​ int main() {int fd open(example.txt, O_RDONLY);if (fd -1) {perror(open);return 1;} ​struct stat sb;if (fstat(fd, sb) -1) {perror(fstat);close(fd);return 1;} ​char *addr (char *)mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);if (addr MAP_FAILED) {perror(mmap);close(fd);return 1;} ​for (off_t i 0; i sb.st_size; i) {putchar(addr[i]);} ​munmap(addr, sb.st_size);close(fd); ​return 0; } ​ 在这个示例中我们打开一个名为example.txt的文件并获取它的文件描述符。然后使用fstat()函数获取文件的元数据信息包括文件大小。 接下来我们使用mmap()函数将文件映射到内存中。PROT_READ标志表示映射的内存可读。MAP_PRIVATE标志表示创建一个私有映射对映射的修改不会影响原始文件。 然后我们可以通过访问addr指针来读取映射的文件内容并使用sb.st_size来确定要读取的字节数。 最后使用munmap()函数取消映射并关闭文件描述符。 2.写入文件 #include fcntl.h #include sys/mman.h #include sys/stat.h #include unistd.h #include stdio.h #include string.h ​ int main() {const char *data Hello, World!;size_t length strlen(data); ​int fd open(output.txt, O_RDWR | O_CREAT | O_TRUNC, 0644);if (fd -1) {perror(open);return 1;} ​if (ftruncate(fd, length) -1) {perror(ftruncate);close(fd);return 1;} ​char *addr (char*)mmap(NULL, length, PROT_WRITE, MAP_SHARED, fd, 0);if (addr MAP_FAILED) {perror(mmap);close(fd);return 1;} ​memcpy(addr, data, length); ​if (msync(addr, length, MS_SYNC) -1) {perror(msync);close(fd);return 1;} ​munmap(addr, length);close(fd); ​return 0; } 在这个示例中我们创建了一个名为output.txt的文件并将字符串Hello, World!写入到文件中。 首先我们打开文件并使用ftruncate()函数设置文件大小为要写入的数据的长度。然后使用mmap()函数将文件映射到内存中。PROT_WRITE标志表示映射的内存可写入。MAP_SHARED标志表示创建一个共享映射对映射的修改将影响到原始文件。 接下来我们使用memcpy()函数将数据从源data复制到映射的内存区域。 然后我们使用msync()函数将对映射区域的修改同步到文件系统并确保写入了磁盘。 最后我们取消映射并关闭文件描述符。 3.共享内存 #include sys/mman.h #include sys/types.h #include sys/wait.h #include unistd.h #include stdio.h #include string.h #include fcntl.h ​ int main() {const int SIZE 4096;const char *name shared_memory; ​int fd shm_open(name, O_CREAT | O_RDWR, 0666);ftruncate(fd, SIZE); ​void *addr mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (addr MAP_FAILED){perror(mmap);return 1;} ​pid_t pid fork(); ​if (pid 0){perror(fork);return 1;}else if (pid 0){strncpy((char*)addr, Hello from child, strlen(Hello from child));return 0;}else{wait(NULL);printf(Parent received: %s\n, (char *)addr);shm_unlink(name);return 0;} } ​ 这个示例展示了如何使用mmap函数进行进程间共享内存。父进程创建了一个共享内存区域然后fork出一个子进程。子进程写入数据到共享内存父进程读取并打印共享内存中的数据
http://www.zqtcl.cn/news/865056/

相关文章:

  • 做网站哪些软件比较好个人网站备案幕布
  • 用数据库代码做家乡网站专门做二维码的网站
  • 上海网站开发工程师招聘网网络维护公司需要什么资质
  • 迅速百度网站自然排名wordpress注册密码链接失效
  • 北京安慧桥网站建设金泉网做网站推广
  • 网站建设与管理书威海城乡与住房建设部网站
  • 邯郸网站设计公司设计师公司排名
  • 网站设计广州量计价格多少钱网站建设
  • wordpress做外贸网站hexo wordpress 主题
  • 北京哪家做网站没网站怎么做cpa
  • 企业网站建设jz190关键词检测工具
  • 如何搭建第三方网站网站开发费属于无形资产
  • 河源城乡规划建设局网站常州网站seo
  • 房产网站建设方案项目书传到网站根目录
  • 页面设计网站素材制作个人网站
  • 怎么制作免费建网站cnzz wordpress
  • 网站界面技术方案wordpress开启子目录多站点模式
  • 汕头网站建设推广价格筑龙网官网首页
  • 河北省建设执业资格注册中心网站东莞微网站建设多少钱
  • 企业网站建设功能模块discover wordpress
  • 网站建设结课做诱导网站
  • 网站开发与设计难嘛青州网站建设推广
  • 网站开发程序员工资谷歌推广网站建设
  • 江门网页建站模板金富通青岛建设工程有限公司网站
  • 网站后台账户如何做会计分录做传奇开服一条龙网站哪个好
  • 天门市网站建设seo平台建设网站公司
  • php网站怎么做302织梦网站有会员系统怎么做
  • 清远建设局网站安阳吧百度贴吧
  • 做什么软件做网站效率最好网站公司建设都招聘那些职位
  • 缙云建设局网站深圳营销型网站设计