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

河南省建设集团惠州seo怎么做

河南省建设集团,惠州seo怎么做,天津做网站公司,淘宝刷单网站建设目录 一、共享内存 1、基本原理 2、共享内存的创建 3、共享内存的释放 4、共享内存的关联 5、共享内存的去关联 6、查看IPC资源 二、完整通信代码 三、共享内存的特点 四、信号量 1、相关概念 2、信号量概念 进程间通信的本质就是让不同的进程看到同一个资源。而前…目录 一、共享内存 1、基本原理 2、共享内存的创建 3、共享内存的释放 4、共享内存的关联 5、共享内存的去关联 6、查看IPC资源 二、完整通信代码 三、共享内存的特点 四、信号量 1、相关概念 2、信号量概念 进程间通信的本质就是让不同的进程看到同一个资源。而前面我们讲到了进程通信的最基础最传统的方法——管道。我们知道了无论是匿名管道还是命名管道它们让不同进程看到同样的资源的方法就是通过访问同样的文件来看到同样的资源。 进程间是相互独立的因此进程的各种数据是存储在物理内存的不同区域的。那么如果两个不同的进程能够访问到同一块内存空间是不是就相当于看到了同样的资源。那么有没有这样的方法呢答案是肯定的system V中的共享内存就是这样的一种进程间通信的方法。 一、共享内存 1、基本原理 在学习了进程地址空间后我们知道在堆和栈之间有一块空间叫做共享区。 我们在物理内存中申请了一块空间然后通过页表将这块空间映射到不同进程的进程地址空间的共享区中 然后再将映射到共享区的地址返回给各自的进程。那么不同的进程就可以通过拿到虚拟地址找到共享区接着通过页表映射找到物理内存。 这样不同的进程就能够看到同一块空间了。这种工作方式就叫做共享内存。 如果想结束通信我们直接取消进程和内存的映射关系释放共享内存。 共享内存的提供者是操作系统而操作系统中可能会有多个共享内存所以操作系统必定需要将各个共享内存管理起来怎么管理呢当然是先描述再组织。 所以共享内存包括了共享内存块和描述共享内存的内核数据结构。 2、共享内存的创建 shmget 作用是用来创建共享内存。返回值shmid共享内存的用户层标识符类似于fd。 #include sys/ipc.h #include sys/shm.hint shmget(key_t key, size_t size, int shmflg);RETURN VALUEOn success, a valid shared memory identifier is returned. On errir, -1 is returned, and errno is set to indicate the error 参数说明 size创建的共享内存的大小。 shmflg通常被设置成两个选项 IPC_CREAT、 IPC_EXCL IPC_CREAT共享内存不存在则创建如果存在则直接获取。IPC_EXCL无法单独使用IPC_CREAT | IPC_EXCL如果不存在就创建如果存在就出错返回。 key当一个进程将共享内存创建好了而与之通信的另一个进程怎么保证看到的就是我创建的共享内存呢key值就可以解决这个问题。 OS中一定会存在很多的共享内存共享内存本质就是在内存中申请一块空间而key能对其进行唯一标识。进程如果在内存中创建了共享内存为了让共享内存在系统中保证唯一的通过key来进行标识所以只要让另一个进程也看到同一个key那么不同的进程就能看到同一个共享内存。而key值就在描述共享内存的内核结构体struct shm中。 那么我们应该给key传入什么值呢使用 ftok函数来形成key。 ftok: #include sys/types.h #include sys/ipc.h key_t ftok(const char *pathname, int proj_id);RETURN VALUEOn success, the generated key_t value is returned. On failure -1 is returned, with errno indicating the error as for the stat(2) system call. 3、共享内存的释放 因为共享内存是由操作系统提供并管理的所以共享内存的生命周期是随操作系统而不是随进程的。所以我们在使用完共享内存后需要用户亲自删除。 1、使用命令删除ipcrm -m shmid 2、使用代码函数删除 shmctl作用是删除共享内存。参数shmid删除共享内存的标识符cmd控制种类一般使用 IPC_RMIDbuf控制共享内存的数据结构可以简单设置为空nullptr。 返回值0表示成功-1表示失败。 #include sys/ipc.h#include sys/shm.hint shmctl(int shmid, int cmd, struct shmid_ds *buf); 4、共享内存的关联 shmat作用是将共享内存与对应的进程关联起来。我们把进程和共享内存建立映射关系的操作称为挂接。 #include sys/types.h#include sys/shm.hvoid *shmat(int shmid, const void *shmaddr, int shmflg); 参数shmaddr指定虚拟地址但是我们并不了解直接设置为nullptr即可shmflg读取权限默认为0。 5、共享内存的去关联 shmdt作用是将共享内存与对应的进程的关联解除。我们把取消进程和内存的映射关系的操作称为去关联。shmaddr指定虚拟地址。 #include sys/types.h #include sys/shm.h int shmdt(const void *shmaddr);RETURN VALUE On success shmdt() returns 0; on error -1 is returned, and errno is set to indi‐cate the cause of the error. 6、查看IPC资源 1、查看共享内存ipcs -m      bytes共享内存大小(最后是页PAGE4096的整数倍)    nattch与该共享内存关联的进程个数 owner共享内存的拥有者。 perms拥有者对于该共享内存的权限 2、删除共享内存ipcsrm -m  shmid 3、ipcs -q查看消息队列 4、ipcs -s查看信号量 二、完整通信代码 shmcoom.hpp #pragma once#includeiostream #includecassert #includecstring #includesys/types.h #includesys/stat.h #includesys/shm.h #includesys/ipc.h #includeunistd.husing namespace std;#define SHM_SIZE 4096 #define PATH_NAME /home/zdl #define PROJ_ID 0x66 server.cc #include shmcomm.hppint main() {// 1.创建key值key_t k ftok(PATH_NAME, PROJ_ID);assert(k ! -1);printf(key: %d\n, k);// 2.创建共享内存int shmid shmget(k, SHM_SIZE, IPC_CREAT | IPC_EXCL | 0666);if (shmid -1){perror(shmget);exit(1);}// 3.关联共享内存char *shmaddr (char *)shmat(shmid, nullptr, 0);if (shmaddr nullptr){perror(shmat);exit(2);}// 4.进程间通信for (;;){printf(%s\n, shmaddr);if (strcmp(shmaddr, quit) 0)break;sleep(1);}// 5.去关联int m shmdt(shmaddr);assert(m ! -1);(void)m;// 6。删除共享内存int n shmctl(shmid, IPC_RMID, nullptr);assert(n ! -1);(void)n;return 0; } client.cc #include shmcomm.hppint main() {// 获取key值key_t k ftok(PATH_NAME, PROJ_ID);assert(k ! -1);printf(key: %d\n, k);// 获取共享内存int shmid shmget(k, SHM_SIZE, IPC_CREAT);if (shmid -1){perror(shmget);exit(1);}// 挂接char *shmaddr (char *)shmat(shmid, nullptr, 0);if (shmaddr nullptr){perror(shmat);exit(2);}// 进程间通信int count 0;while (count 10){snprintf(shmaddr, SHM_SIZE - 1, hello server,我是另一个进程,正在和你通信,我的pid:%d count: %d,getpid(), count);sleep(1);}strcpy(shmaddr, quit);// 去关联int m shmdt(shmaddr);assert(m ! -1);(void)m;return 0; } 运行结果 首先我们看到的是两个进程的key值相同且shmserver在输入了quit后进程退出shmclient也退出。  三、共享内存的特点 优点共享内存是所有进程间通信速度是最快的因为共享内存是被双方所共享只要写入对方就能立即看到能大大减少数据的拷贝次数。 具体说明 管道我们知道管道的本质是一个文件所以我们必须像使用文件那样去使用管道即我们想要通信就必须调用系统接口。具体如下图 需要通过键盘输入到自己定义的缓冲区char buffer[]将数据拷贝到buffer中调用write接口在把buffer里的数据拷贝到管道里另一进程也有定义buffer缓冲区调用read读取把数据从管道里读取到buffer里再把数据显示到显示器上。 从上图我们看到使用管道要进行四次拷贝。  共享内存只需要两次拷贝。 缺点与管道相比共享内存没有访问控制会出现数据不一致问题。即读取的一方不会因为内存中没有数据或数据还没有写入而停止读取写入的一方也不会考虑另一方是否读取而会一直写入。如果想做到访问控制需要用到信号量或使用管道对共享内存进行保护。 四、信号量 1、相关概念 1、临界资源我们把多个进程执行流看到的公共资源称为临界资源或互斥资源。 2、临界区我们把自己的进程中访问临界资源的那部分代码称为临界区。 所以说如果我们不加保护地访问了临界资源那么多个执行流在运行时会互相干扰而在非临界区多个执行流互不影响。 3、互斥为了更好地保护临界资源我们要让多个执行流在任意时刻只允许一个执行流进入临界资源去访问临界资源这种方式就称为互斥。 4、原子性只要两态要么不做、要么做完没有中间状态。 2、信号量概念 引入为了保护共享资源我们必须保证进程间是互斥的。如果在同一时刻不同的执行流要访问的是临界资源的不同区域那么我们是允许它们同时进入共享内存进行资源访问的。比如临界资源中有10个区域那么我们最多就可以同时让10个执行流进入进行资源访问这10个执行流能够并发地访问临界资源。而当第11个执行流想要进入时它就必须要等待只有它需要的区域没有执行流在访问时它才能去访问临界资源。 这时我们就使用了信号量来对临界资源进行保护。 信号量信号量的本质是一个计数器通常用来表示临界资源中资源数的多少。申请信号量实际上就是对临界资源的预定机制。信号量主要用于同步和互斥。 比如还是上面的例子信号量会是10当有不同的10个执行流访问临界资源的10个不同区域想要访问临界资源时它们会先申请信号量信号量--然后操作系统一定会在共享内存中为执行流预留好它想要的资源可以随时访问。而当第11个执行流去申请信号量时信号量为0所以该执行流还无法访问临界资源。 只有当其中的一个执行流访问完临界资源释放信号量后信号量第11个执行流才能够申请信号量去访问临界资源。
http://www.hkea.cn/news/14521633/

相关文章:

  • 视频微网站开发wordpress注册修改密码
  • 上海网站建设服务器苏州手机网站建设费用
  • 自己的网站源代码一片空白100t空间 做网站
  • 网站建设与运营公司部门结构wordpress 验证百度网盟
  • 手机pc微信三合一网站浪琴手表网站
  • 宁波做简单网站的网站备案 信息查询
  • 个人签名设计网站长沙关键词优化平台
  • 做网站现在什么尺寸合适无锡网站建设软件开发
  • 学设计哪个网站好elision wordpress
  • 模具外贸网站建设wordpress虚拟主机如何安装
  • 只做鱼网站网络营销分类
  • 海口建站价格网站建设 部署与发布 答案
  • 二手商品网站制作网站不稳定
  • 大兴区制作网站的公司建设银行国际互联网网站
  • 怎么开发销售网站农家乐网站建设多少钱
  • 做网站需要会写代码吗wordpress过滤用户输入数据库
  • 网站建设公司怎么开php 网站伪静态
  • 永春建设局网站html网站开发流程
  • 建设公司设计公司网站十堰做网站公司
  • 简述新建站点的步骤长沙网站seo厂家
  • dede安装好后是模板怎么变成做好的网站企业门户网站建设行情
  • 西安建设主管部门官方网站天津手机网站建设
  • 高校网站建设及管理制度天津北辰做网站
  • 临安做企业网站网站在线咨询怎么做
  • 长春模板建站公司网站建设方案标准模板
  • gucci网站广告设计软件叫什么
  • 鞍山百度网站怎么制作网站建设费用组成
  • 免费学编程网站商务网站开发的流程
  • 公司做网站可以永久买断吗网站开发个人基本情况1000字
  • 怎么做论坛社区网站wordpress 分类页 获取别名