内存共享和qsort

来源:互联网 发布:万彩动画大师 知乎 编辑:程序博客网 时间:2024/06/07 13:45

本来内存是由机器的硬件设置,大小固定,机器上的软件理论都是应该可以访问到的,那么内存的数据也是一样

由于各个进程都有自己的虚拟内存地址空间,对于全部的物理内存是不可见的

那么进程间内存共享数据就要实现多个进程都可以访问到同一块物理内存或者,数据映射到自己的内存中


两种方式mmap和shm

mmap是将文件搬到内存中,然后返回一个文件开始的地址,另一个进程也将同一个文件映射到自己内存

父子进程的地址彼此都是可见的,文件只需搬一次,不同进程需要搬两次,共享模式就是内存中数据的更改立即返回到文件中,这样别的进程可以实时同步

说是一个copy,但是每次更改都会影响原文件,所以冲突需要自己解决和设计

shm是根据在/DEV/SHM内存中申请一个空间,不同进程只需要attach上,大家指向一个物理内存,只是自己通过虚拟地址访问值不同,

也就是一个学生在班级和在全校排名不同而已,但是同样也是会出现冲突问题

mmap的文件在/DEV/SHM上时候,用shmopen就和shm方式一样了


qsort是一种lib库里的快速排序函数

对于结构体数组而言,数组首地址,排序结构体数量,结构体大小,排序规则比较规则

排序规则函数声明int cmp_(const void*a,const void*b);

此函数,可以根据结构体的某一项值进行比较,使用注意:结构体数组比较,那么传入的就是结构体指针,void指针强制转换后,* 取值  .访问成员

strcmp传入两个字符串地址,相等为0,小为负数,大为正数,默认小在前,也就是返回负数就不用交换位置

要使用时候,需要对函数指针进行类型转换或者定义好的函数名,int (*)(const void *,const void *))strcmp

bsearch二分法查找,根据void*key去找,后面和qsort传入参数一致,返回为NULL,或者是找到的key所在的地址,void*


0 0