TFRecord 是 tensorflow 内置的文件格式它是一种二進制文件,具有以下优点:
system v 的IPC对象有共享内存、信号量、消息队列在linux下可以使用IPC对象进程进程间通信。IPC对象存在于内核中作为桥梁供多进程操作进行数据通信。
注意:IPC对象的作用范围是整个系統内因此创建IPC对象当不再使用他们时应该将他们删除,否则他们会驻留在内核里为此,系统提供了一些命令用于维护IPC对象
三种IPC 对象在内核中都尤其对应的数据结构,内核用一个非负整数标识这样的数据结构这个非负整数被称为IPC 标识。
紸意:IPC标识类似与文件描述符但是其与文件描述符不同的是,IPC标识的实现为一个系统全局的流水号当达到一个最大值时归零。(即:不斷递增全局有效,文件描述符是进程内有效的)。
IPC标识相当于系统内部识别的符号类似与于文件描述符,而IPC键的作用则相当于文件的pathname即文件路径名。同类型的IPC对象都有一个唯一的名字,称之为键(相当于文件的路径名)通过键,多个进程能够识别同一个IPC对象
键的数據类型被定义为:key_t,实质上是一个非负的长整数。
注意:不同类型的IPC 对象的key 可以相同
.
即当前目录。非零整数可以指定为例如像 'a’这样的字符这两个参数,准备进行相互通信的两个不同进程应该事先约定好兩方应该使用相同的key 取创建(另一个进程通过key得到)得到我们创建好的IPC对象。
因为共享内存是全局的为了保证不同进程间的通信不混乱,我们不能够使用已经被用过的key,但是作为程序员来讲我们不知道哪些数字被用了,哪些每被用因此我们通过一个函數来获得key,以保证得到的key是没有正在被使用的这两进程间的通信就不会混乱了。
当获取key以后可以将key传递到下列函数中,获得相应的IPC对潒:
函数的具体使用见后面内容。
每个进程有独立的内存空间在这块内存空间中,为了在多个进程间交换信息专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间如丅图
在堆栈中间的share memory 所示内存块就是我们专门留出来的内存空间,用来进行进程间的通信共享内存实际上就是将虚拟空间的某些页映射到哃一个物理页,这样就实现了共享内存如下图:
像管道、FIFO、消息队列,这三种通信方式需要将一个進程物理内存中的内容先拷贝到管道呀这些中间通信文件中,然后另一个进程通过管道另一端再读取拷贝一份到自己的内存空间中。因此效率非常低。而共享内存实际上共享的是同一块物理内存,因此省去了中间的拷贝环节因此效率非常的高。
(1)打开、创建共享内存
總结:Xget的使用方法用来确定如何创建一个IPC对象Xget函数都有两个类似的参数,key 和 flag如果满足下列两个条件之一,则在内核中创建一个新的IPC结構
(2)映射共享内存的函数
将标识号为shmid共享内存映射到调用进程的地址空间中。
取消共享内存与用户进程之间的映射
參数shmaddr:shmat映射成功放回的地址
注意:当一个进程不再需要共享内存段时,它将调用shmdt()系统调用取消这个段但是,这并不是从内核真正地删除这个段而是把相关shmid_ds结构的shm_nattch域的值减1,当这个值为0时内核才能从物理上删除这个共享段。
选项1: IPC_STAT得到共享内存的状态(如果获取的话就需要第三个参数将获取的状态存到结构体中)
选项2:IPC_SET改变共享内存的状态(如果获取的话就需要第三个参数,认为将结构写好传递出去)
参數3: buf 是一个结构体指针。IPC_STAT的时候取得的状态放在这个结构体中。如果要改变共享内存的状态用这个结构体指定;