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

长沙网站开发方案公司微网站建设方案

长沙网站开发方案,公司微网站建设方案,旅游网站策划书,通过apache建设网站一、共享内存简介 共享内存区是最快的IPC形式#xff0c;这些进程间数据传递不再涉及到内核#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 即每个进程地址空间都有一个共享存储器的映射区#xff0c;当这块区域都映射到相同的真正的物理地址空…一、共享内存简介 共享内存区是最快的IPC形式这些进程间数据传递不再涉及到内核换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 即每个进程地址空间都有一个共享存储器的映射区当这块区域都映射到相同的真正的物理地址空间时可以通过这块区域进行数据交换例如共享库就是这么实现的很多进程都会使用同一个函数如printf也许在真正的物理地址空间中只存在一份printf.o 然后所有进程都映射到这一份printf.o 就实现了共享。 用管道或者消息队列传递数据 用共享内存传递数据 即使用共享内存传递数据比用消息队列和管道来说减少了进入内核的次数提高了效率。 二、mmap 函数 #include sys/mman.h 功能将文件或者设备空间映射到共享内存区。 原型 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 参数 addr: 要映射的起始地址通常指定为NULL让内核自动选择 len:映射到进程地址空间的字节数 prot:映射区保护方式 flags:标志 fd:文件描述符 offset:从文件头开始的偏移量必须是页大小的整数倍在32位体系统结构上通常是4K 返回值成功返回映射到的内存区的起始地址失败返回-1 prot 参数取值 PROT_EXEC 表示映射的这一段可执行例如映射共享库 PROT_READ 表示映射的这一段可读 PROT_WRITE 表示映射的这一段可写 PROT_NONE 表示映射的这一段不可访问 flag参数有很多种取值这里只讲两种其它取值可查看mmap(2) MAP_SHARED 多个进程对同一个文件的映射是共享的一个进程对映射的内存做了修改另一个进程也会看到这种变化。 MAP_PRIVATE 多个进程对同一个文件的映射不是共享的一个进程对映射的内存做了修改另一个进程并不会看到这种变化也不会真的写到文件中去。 内存映射文件示意图 如果mmap成功则返回映射首地址如果出错则返回常数MAP_FAILED。当进程终止时该进程的映射内存会自动解除也可以调用munmap解除映射 功能取消mmap函数建立的映射 原型 int munmap(void *addr, size_t len); 参数 addr: 映射的内存起始地址 len:映射到进程地址空间的字节数 返回值成功返回0失败返回-1 下面写两个程序测试一下 mmap_write.c   C Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62   #includestring.h#includestdio.h#includestdlib.h#includesys/ipc.h#includesys/msg.h#includesys/types.h#includeunistd.h#includeerrno.h#includefcntl.h#includesys/stat.h#includesys/mman.h#define ERR_EXIT(m) \     do { \         perror(m); \         exit(EXIT_FAILURE); \     } while(0)typedef struct stu {     char name[4];     int age; } STU;int main(int argc, char *argv[]) {     if (argc ! 2)     {         fprintf(stderr, Usage: %s file\n, argv[0]);         exit(EXIT_FAILURE);     }     int fd;     fd  open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0666);     if (fd  -1)         ERR_EXIT(open);     lseek(fd, sizeof(STU) * 5 - 1, SEEK_SET);     write(fd, , 1);     STU *p;     p  (STU *)mmap(NULL, sizeof(STU) * 5, PROT_READ | PROT_WRITE,                     MAP_SHARED, fd, 0);     if (p  -1)         ERR_EXIT(mmap);     char ch  a;     int i;     for (i  0; i  5; i)     {         memcpy((p  i)-name, ch, 1);         (p  i)-age  20  i;         ch;     }     printf(initialize over\n);     munmap(p, sizeof(STU) * 5);     printf(exit...\n);     return 0; }   mmap_read.c   C Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54   #includestring.h#includestdio.h#includestdlib.h#includesys/ipc.h#includesys/msg.h#includesys/types.h#includeunistd.h#includeerrno.h#includefcntl.h#includesys/stat.h#includesys/mman.h#define ERR_EXIT(m) \     do { \         perror(m); \         exit(EXIT_FAILURE); \     } while(0)typedef struct stu {     char name[4];     int age; } STU;int main(int argc, char *argv[]) {     if (argc ! 2)     {         fprintf(stderr, Usage: %s file\n, argv[0]);         exit(EXIT_FAILURE);     }     int fd;     fd  open(argv[1], O_RDWR);     if (fd  -1)         ERR_EXIT(open);     STU *p;     p  (STU *)mmap(NULL, sizeof(STU) * 5, PROT_READ | PROT_WRITE,                     MAP_SHARED, fd, 0);     if (p  -1)         ERR_EXIT(mmap);     int i;     for (i  0; i  5; i)     {         printf(name  %s age  %d\n, (p  i)-name, (p  i)-age);     }     munmap(p, sizeof(STU) * 5);     printf(exit...\n);     return 0; }   先运行mmap_write 然后用od -c 查看文件内容   simbaubuntu:~/Documents/code/linux_programming/UNP/system_v$ ./mmap_write test  initialize over exit... simbaubuntu:~/Documents/code/linux_programming/UNP/system_v$ od -c test  0000000   a  \0  \0  \0 024  \0  \0  \0   b  \0  \0  \0 025  \0  \0  \0 0000020   c  \0  \0  \0 026  \0  \0  \0   d  \0  \0  \0 027  \0  \0  \0 0000040   e  \0  \0  \0 030  \0  \0  \0 0000050 注意od -c 输出的是八进制024即20即对内存的操作写入了文件。 再尝试运行mmap_read,输出如下 simbaubuntu:~/Documents/code/linux_programming/UNP/system_v$ ./mmap_read test  name a age 20 name b age 21 name c age 22 name d age 23 name e age 24 exit... simbaubuntu:~/Documents/code/linux_programming/UNP/system_v$  再次将文件test 映射到内存然后从内存读取到了文件的内容。 mmap 编程注意点 1、映射不能改变文件的大小 2、可用于进程间通信的有效地址空间不完全受限于被映射文件的大小 3、文件一旦被映射后所有对映射区域的访问实际上是对内存区域的访问。映射区域内容写回文件时所写内容不能超过文件的大小 对于13点将mmap_write.c 中40行以后的代码中的5改成10即映射的内存大于文件的大小这样写入是不会出错的因为是向内存写入但用od 查看时发现文件还是40 个字节即只有前5个STU才被真正写入到了文件。 对于第2点将mmap_write.c 和 mmap_read.c 都按上面说的更改成10然后在mmap_write.c 中munmap 函数之前sleep(10); 先运行mmap_write再在另一终端运行mmap_read观察结果 simbaubuntu:~/Documents/code/linux_programming/UNP/system_v$ ./mmap_read test  name a age 20 name b age 21 name c age 22 name d age 23 name e age 24 name f age 25 name g age 26 name h age 27 name i age 28 name j age 29 exit... 即在mmap_write 对映射内存区域写入之后尚未取消映射时mmap_read 也映射了test 文件两个虚拟进程地址空间的映射区域都指向了同一块物理内存所以也能读到write 进程对内存的修改但进程结束后查看test 文件还是40个字节而已。内存的映射是以页面为单位的一般为4k所以才有第2条的说法其实这才是真正体现共享内存可以进程间通信的所在。 最后一点与write 类似将文件映射到内存后对内存进行写入不一定会马上写回文件有可能内核也会产生一个缓冲区找个适当的时间内核再写回设备文件write 之后可以调用fsync 进行同步同样地mmap 可以调用msync 进行同步。   参考 《linux c 编程一站式学习》 《UNP》转载于:https://www.cnblogs.com/alantu2018/p/8473111.html
http://wiki.neutronadmin.com/news/429030/

相关文章:

  • 提供o2o网站建设下载百度电商平台app
  • 简洁网站模板素材安陆网站建设
  • 手机怎么做微电影网站网站开发编程环境
  • 网站选项卡图标代码百度seo关键词优化软件
  • 大学生网站设计作业购物商城网站建设方案
  • 天津做网站联系方式网络架构oss
  • wap网站如何推广天津电力建设公司网站
  • 做网站机构图用什么工具做视频网站可行吗
  • 建设企业网站官网u盾登录价格低的形容词
  • 公司网站介绍范文域名网站模板
  • 济南网站制作策划上海工作单位名称大全
  • wordpress发布网站国外的创意设计网站
  • 广东网站建设专业公司哪家好岳阳网站优化
  • 免费发广告的网站门设计的网站建设
  • 网站建设的投资预算怎么写网站建设公司厂
  • 备案域名绑定网站php 创建网站开发
  • 电商网站支付体系建设特点可以做问卷的网站
  • 在北京找工作有哪些招聘网站seo搜索优化公司报价
  • 知道域名怎么进入网站济南腾飞网络科技有限公司
  • 定制网站开发的目的是什么外国ps素材网站
  • 做灯箱到哪个网站找业务网站排名软件优化
  • 学生成绩管理系统 网站建设企业网站大图
  • 删除的网站做404西双版纳建设厅网站
  • 如何把自己做的网站 放在网上中山cms建站
  • 潍坊网站建设技术外包一个网站 多个域名
  • 删除的网站做404年底 网站备案
  • 西山区城市建设局网站链接优化方法
  • 深圳企业网站建设专业腾讯网站建设推广
  • 可以做编程题的网站广告模板
  • 大同网站开发手机网站设计案