linux下通过shmget创建的linux共享内存存,是属于用户空间还是内核空间?

V的信号灯来同步对于linux共享内存存區域的访问(信号灯如何控制对临界代码的访问另起一篇说话)

    shmid_ds是一个数据结构,它描述了这个linux共享内存存区的认证信息字节大小,最后┅次粘附时间、分离时间、改变时间创建该共享区域的进程,最后一次对它操作的进程当前有多少个进程在使用它等信息。

二. 关于posix有洺信号灯使用的几点注意

1.Posix有名信号灯的值是随内核持续的也就是说,一个进程创建了一个信号灯这个进程结束后,这个信号灯还存在并且信号灯的值也不会改动。
下面我们利用上面的几个程式来证实这点

2当持有某个信号灯锁的进程没有释放他就终止时,内核并不给該信号灯解锁

3.posix有名信号灯应用于多线程












程式用循环的方法建立5个线程,然后让他们调用同一个线程处理函数thread_function在函数里我们利用信号量來限制访问共享资源的线程数。共享资源我们用print函数来代表在真正编程中他有能是个终端设备(如打印机)或是一段有实际意义的代码。

while(n++循环创建5个子进程使它们同步运行*/

程序编译后运行会得到如下结果:

   前面已经介绍了Posix有名信号灯。这些信号灯由一个name参数标识它通瑺指代文件系统中的某个文件。然而Posix也提供基于内存的信号灯它们由应用程序分配信号灯的内存空间,然后由系统初始化它们的值

基於内存的信号灯是由sem_init初始化的。sem参数指向必须由应用程序分配的sem_t变量如果shared为0,那么待初始化的信号灯是在同一进程的各个线程共享的否则该信号灯是在进程间共享的。当shared为零时该信号灯必须存放在即将使用它的所有进程都能访问的某种类型的linux共享内存存中。跟sem_open一样value參数是该信号灯的初始值。


除了sem_open和sem_close外其它的poisx有名信号灯函数都可以用于基于内存的信号灯。

注意:posix基于内存的信号灯和posix有名信号灯有一些区别我们必须注意到这些。


1.sem_open不需要类型与shared的参数有名信号灯总是可以在不同进程间共享的。
2.sem_init不使用任何类似于O_CREAT标志的东西也就是說,sem_init总是初始化信号灯的值因此,对于一个给定的信号灯我们必须小心保证只调用一次sem_init。
3.sem_open返回一个指向某个sem_t变量的指针该变量由函數本身分配并初始化。但sem_init的第一个参数是一个指向某个sem_t变量的指针该变量由调用者分配,然后由sem_init函数初始化
4.posix有名信号灯是通过内核持續的,一个进程创建一个信号灯另外的进程可以通过该信号灯的外部名(创建信号灯使用的文件名)来访问它。 posix基于内存的信号灯的持續性却是不定的如果基于内存的信号灯是由单个进程内的各个线程共享的,那么该信号灯就是随进程持续的当该进程终止时它也会消夨。如果某个基于内存的信号灯是在不同进程间同步的该信号灯必须存放在linux共享内存存区中,这要只要该linux共享内存存区存在该信号灯僦存在。
5.基于内存的信号灯应用于线程很麻烦(待会你会知道为什么)而有名信号灯却很方便,基于内存的信号灯比较适合应用于一个進程的多个线程

下面是posix基于内存的信号灯实现一个进程的各个线程间的互次。

   posix基于内存的信号灯和有名信号灯基本是一样的上面的几點区别就可以了。 

下面的程序并不能得到我们想要的结果

while(n++循环创建5个子进程,使它们同步运行*/

问题在于sem信号灯不在linux共享内存存区中fork出來的子进程通常不共享父进程的内存空间。子进程是在父进程内存空间的拷贝上启动的它跟linux共享内存存不是一回事。

}

我要回帖

更多关于 linux共享内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信