导航:首页 > 编程系统 > linuxsemaphore用法

linuxsemaphore用法

发布时间:2022-09-15 20:01:08

linux中mutex和semaphore的区别

mutex互斥体只用于保护临界区的代码(访问共享资源),而不用于锁之间的同步,即一个线程释放mutex锁后,马上又可能获取同一个锁,而不管其它正在等待该mutex锁的其它线程。
semaphore信号量除了起到保护临界区的作用外,还用于锁同步的功能,即一个线程释放semaphore后,会保证正在等待该semaphore的线程优先执行,而不会马上在获取同一个semaphore。
如果两个线程想通过一个锁达到输出1,2,1,2,1,2这样的序列,应使用semaphore, 而使用mutex的结果可能为1,1,1,1,1,2,2,2,111.....。

㈡ linux 进程间通信的几种方式

第一种:管道通信
两个进程利用管道进行通信时,发送信息的进程称为写进程;接收信息的进程称为读进程。管道通信方式的中间介质就是文件,通常称这种文件为管道文件,它就像管道一样将一个写进程和一个读进程连接在一起,实现两个进程之间的通信。写进程通过写入端往管道文件中写入信息;读进程通过读出端从管道文件中读取信息。两个进程协调不断地进行写和读,便会构成双方通过管道传递信息的流水线。
第二种:消息缓冲通信
多个独立的进程之间可以通过消息缓冲机制来相互通信。这种通信的实现是以消息缓冲区为中间介质,通信双方的发送和接收操作均以消息为单位。在存储器中,消息缓冲区被组织成队列,通常称之为消息队列。消息队列一旦创建后即可由多进程共享,发送消息的进程可以在任意时刻发送任意个消息到指定的消息队列上,并检查是否有接收进程在等待它所发送的消息。若有则唤醒它,而接收消息的进程可以在需要消息的时候到指定的消息队列上获取消息,如果消息还没有到来,则转入睡眠等待状态。
第三种:共享内存通信
针对消息缓冲需要占用CPU进行消息复制的缺点,OS提供了一种进程间直接进行数据交换的通信方式。共享内存,顾名思义这种通信方式允许多个进程在外部通信协议或同步,互斥机制的支持下使用同一个内存段进行通信,它是一种最有效的数据通信方式,其特点是没有中间环节,直接将共享的内存页面通过附接映射到相互通信的进程各自的虚拟地址空间中,从而使多个进程可以直接访问同一个物理内存页面。

㈢ linux中mutex和semaphore的区别

Mutex的count有三种可能值。“1”代表unlocked,"0"代表lokced,负值代表可能的等待者。

Mutex有如下约定:

有且只有一个进程来持有。

有且只有owner本身可以unlock mutex(owner指针的作用)。

不允许递归锁。但是semaphore是允许的,MySQL在这块上,之前还有一个BUG:Bug #24745 InnoDB semaphore wait timeout/crash – deadlock waiting for itself

只能能过API来初始化,不允许通过memset和ing来初始化。

当持有mutex时,进程一般不退出;存放mutex的内存不能被释放。

通常不用于软硬件的中断。

五、总结

从上面的定义,可以看出,semaphore一般只是表示资源有多少,信息量有多少,用来类似于解决procer-consumer的问题和同步信号发送等。不能解决串行化问题。
而Mutex则是来解决互斥问题,保证某个资源或者代码片段的串行访问;因为只有owner才能释放锁。另外,有同学可能会问,Binary
semaphore也只有两种可能值,也可以实现互斥访问。但是要知道,Binary
semaphore还是没有owner指针。但有一点相似处,就是在ISR(Interrupt Service
Routine)系统中,semaphore或者mutex会被中断程序中断。

㈣ 为什么要设置linux semaphore参数

通过ipcs -s 可以看到SEMAPHORE,在这里可以看到NSEMS是254(环境基于RHEL 6(32BIT),ORACLE DATABASE 11.2.0.1.0)
[root@hy1 oracle]# ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems
0x39c3211c 1671170 oracle 660 254
这个254表示什么呢?是ORACLE进程数吗?
[root@hy1 oracle]# ps -eaf | grep oracle | wc -l
50
可能看到整个ORACLE用户的进程只有 50
经常官方文档建议这个参数设置为PROCESSES再加150,那么这个参数和PROCESSES应该有关,

SQL> show parameter processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
processes integer 250

在这里PROCESSES为250,其他的4代表什么呢?
使用oradebug ipc可以跟踪当前的IPC情况

Maximum processes: = 250
Number of semaphores per set: = 254
Semaphores key overhead per set: = 4
User Semaphores per set: = 250
Number of semaphore sets: = 1
Semaphore identifiers: = 1
Semaphore List=
1671170
可以看到4为SEAMPHORE本身的开销,再加上PROCESSES定义的大小,刚好是254
kernel.semmsl 定义了一个信号集的信号数,这个参数设置建议为PROCESSES+150,当然系统的默认设置128也不会有问题
但是需要请求多个信号集,从某种程度上来说降低了效率
kernel.semopm定义了每次信号函数能操作的最大信号数,建议和semmsl相等,这样一次调用就能完成所有的集号操作,而不
需要多次调用
kernel.semmni定了系统中的信号集的个数,一般125足够用了
kernel.semmns定义了系统中最大信号数,建议值为 kernel.semmsl * kernel.semmni.

需要注意的是不要弄混信号和信号集的概念。

㈤ 为什么要设置linux semaphore参数

通过ipcs -s 可以看到SEMAPHORE,在这里可以看到NSEMS是254(环境基于RHEL 6(32BIT),ORACLE DATABASE 11.2.0.1.0)
[root@hy1 oracle]# ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems
0x39c3211c 1671170 oracle 660 254
这个254表示什么呢?是ORACLE进程数吗?
[root@hy1 oracle]# ps -eaf | grep oracle | wc -l
50
可能看到整个ORACLE用户的进程只有 50
经常官方文档建议这个参数设置为PROCESSES再加150,那么这个参数和PROCESSES应该有关,

SQL> show parameter processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
processes integer 250

在这里PROCESSES为250,其他的4代表什么呢?
使用oradebug ipc可以跟踪当前的IPC情况

Maximum processes: = 250
Number of semaphores per set: = 254
Semaphores key overhead per set: = 4
User Semaphores per set: = 250

㈥ linux系统的进程间通信有哪几种方式

一、方式

1、管道(Pipe)及有名管道( mkpipe):

管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

2、信号(Signal):

信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。

linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction。

实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数。

3、消息队列(Message):

消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

4、共享内存:

使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

5、信号量(semaphore):

主要作为进程间以及同一进程不同线程之间的同步手段。

6、套接口(Socket):

更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

二、概念

进程间通信概念:

IPC—-InterProcess Communication

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到所以进程之间要交换数据必须通过内核。

在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

(6)linuxsemaphore用法扩展阅读

1)无名管道:

管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。

管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,构成两进程间通信的一个媒介。

数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

2)有名管道:

不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间)。

因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。



㈦ linux 下进程间的同步机制有哪些

感觉你提问的应该是进程间的通信。而通讯主要有以下6中方式:
1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
2.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期 信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上, 该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,sigaction函数重新实现了signal函数);
3.报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针其他通信机制运行效率较低设计的。往往与其它通信机制,如信号量结合使用, 来达到进程间的同步及互斥。
5.信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
6.套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix 系统上:Linux和System V的变种都支持套接字。

㈧ linux编程时的信号量问题。 我以前用过的信号量头文件是<semaphore.h>,而现在又发现还有个<sys/sem.h>

信号量在进程是以有名信号量进行通信的,在线程是以无名信号进行通信的,因为线程内linux还没有实现进程间容的通信,所以在sem_init的第二个参数要为0,而且在多线程间的同步是可以通过有名信号量也可通过无名信号,但是一般情况线程的同步是无名信号量,无名信号量使用简单,而且sem_t存储在进程空间中,有名信号量必须LINUX内核管理,由内核结构struct ipc_ids 存储,是随内核持续的,系统关闭,信号量则删除,当然也可以显示删除,通过系统调用删除,
消息队列,信号量,内存共享,这几个都是一样的原理。,只不过信号量分为有名与无名

无名使用 <semaphore.h>,
有名信号量<sys/sem.h>
无名信号量不能用进程间通信,
//无名与有名的区别,有名需要KEY值与IPC标识
所以sem_init的第二个参数必须为0,,,,

㈨ 关于linux下的多线程使用sem信号量的运行问题

不是信号量的问题
printf函数,是先写到输出缓冲,遇到\n时,或者缓冲区满内时,或者有强制输出容(fflush)时,才会将缓冲区里的内容输出到屏幕上(标准输出设备:stdout)。你的代码里面并没有以上3个触发条件的任意一种,所以printf的内存没有实际输出到屏幕上。
你只要在每个printf函数后面加上fflush(stdout);就可以了。

阅读全文

与linuxsemaphore用法相关的资料

热点内容
win7安装win10后程序在哪个文件夹里 浏览:351
提示没有文件名 浏览:669
java文件怎么保存 浏览:535
俩男俩女去度假还有一个老板娘的韩国电影 浏览:776
怎么给stm32下载程序 浏览:885
闵度允的电影办公室 浏览:487
尸吻完整高清版免费看 浏览:713
深圳投简历到哪个网站 浏览:290
大数据解析网络交友 浏览:271
无线网卡未识别的网络 浏览:36
女大学生的客房沙龙女主角叫什么名字 浏览:486
有额度能提现的app 浏览:683
java定时任务timer 浏览:194
ps原文件存不了 浏览:481
怎么彻底删除微博数据 浏览:923
媒体评论马化腾微信 浏览:744
好13网址大全 浏览:774
网络双绞线 浏览:948
linux系统镜像文件在 浏览:647
帕萨特如何用道通读取链条数据 浏览:962

友情链接