概述 HotSpot是基于c++实现而c++是一门面向對象的语言,本身具备面向对象基本特征所以Java中的...这里的 OOP 指的是 Ordinary Object Pointer (普通对象指针),它用来表示对象的实例信息看起来像个指针实际...
共享内存区域是被多个进程共享嘚一部分物理内存如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址。
V的信号灯来同步对于共享内存区域的访问(信号灯如何控制对临界代码的访问另起一篇说话)
attaches描述被共享的物理內存对象所映射的各进程的虚拟内存区域。每一个希望共享这块内存的进程都必须通过系统调用将其关联(attach)到它的虚拟内存中这一过程将为该进程创建了一个新的描述这块共享内存的vm_area_struct数据结构。创建时可以指定共享内存在它的虚拟地址空间的位置也可以让Linux自己为它选擇一块足够的空闲区域。
二. 关于posix有名信号灯使用的几点注意
1.Posix有名信号灯的值是随内核持续的也就是说,一个进程创建了一个信号灯这個进程结束后,这个信号灯还存在并且信号灯的值也不会改动。
下面我们利用上面的几个程式来证实这点
2当持有某个信号灯锁的进程沒有释放他就终止时,内核并不给该信号灯解锁
3.posix有名信号灯应用于多线程
程式用循环的方法建立5个线程,然后让他们调鼡同一个线程处理函数thread_function在函数里我们利用信号量来限制访问共享资源的线程数。共享资源我们用print函数来代表在真正编程中他有能是个終端设备(如打印机)或是一段有实际意义的代码。
4.posix有名信号灯应用于多进程
下面就是应用Posix有名信号灯的一个小程序用它来限制访问共享代码的进程数目。
while(n++循环创建5个子进程使它们同步运行*/
程序编译后运行会得到如下结果:
前面已经介绍了Posix有名信号灯。这些信号灯由一個name参数标识它通常指代文件系统中的某个文件。然而Posix也提供基于内存的信号灯它们由应用程序分配信号灯的内存空间,然后由系统初始化它们的值
基于内存的信号灯是由sem_init初始化的。sem参数指向必须由应用程序分配的sem_t变量如果shared为0,那么待初始化的信号灯是在同一进程的各个线程共享的否则该信号灯是在进程间共享的。当shared为零时该信号灯必须存放在即将使用它的所有进程都能访问的某种类型的共享内存中。跟sem_open一样value参数是该信号灯的初始值。
注意:posix基于内存的信号灯和posix囿名信号灯有一些区别我们必须注意到这些。
下面是posix基于内存的信号灯实现一个进程的各个线程间的互次。
posix基于内存的信号灯和有名信号灯基本是一样的上面的几点区别就可以了。
下面的程序并不能得到我们想要的结果
while(n++循环创建5个子进程,使它们同步运行*/
问题在于sem信号灯不在共享内存區中fork出来的子进程通常不共享父进程的内存空间。子进程是在父进程内存空间的拷贝上启动的它跟共享内存不是一回事。