1、有十个进程,互斥使用资源.求信号量S的范围
有一个就可以了,s=1,因为是互斥嘛,我感觉是
2、多个进程对信号量S进行了5次P操作,2次V操作后,信号量的值是-3.
有3个处于阻塞状态的进程,信号初始值为1.
3、计算机*作系统中,若P、V*作的信号量S初值为2,当前值为-1,则表示有____个等待进程
有1个等待进程。
信号量(Semaphore),是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。
为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。初值为2,表示初始时有两个可用的资源。现在为-1,就说明这两个可用资源已经被占用了,有一个进程还在等待资源。
(3)vxworks信号量semq扩展资料:
对信号量有4种操作(#include<semaphore.h>):
1、 初始化(initialize),也叫做建立(create) int sem_init(sem_t *sem, int pshared, unsigned int value);
2、等信号(wait),也可叫做挂起(suspend)int sem_wait(sem_t *sem);
3、给信号(signal)或发信号(post) int sem_post(sem_t *sem);
4、清理(destroy) int sem_destory(sem_t *sem)。
4、什么是信号量semaphores
He starts trying
5、操作系统信号量问题:若信号量S的初值为m,当前值为-n,则表示有多少个等待进程?
初值为m,表示有m个资源,为0则表示已经没有了资源,如果当前值为-n,那么专等待的进程为属n。
若信号S的初值为3,当前值为-2,则表示有( 2 )个等待进程,当信号量的值小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程个数。
信号量可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。
(5)vxworks信号量semq扩展资料:
信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。
当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为释放了由信号量守护的资源。
6、整型信号量S<=0改为S<0则应该如何修改代码
就是你这样改呀,把s<=0改为s<0就可以了。
7、多个进程对信号量S进行了5次 P操作,2次V操作后,现在信号量的值是
阻塞状态的进程是3个,这个看信号量当前的值就知道了。
信号量的初值是0,每次执行P操作要对信号量的值-1,每次执行V操作要+1,5次P,2次V之后是-3,所以初值是0.
8、操作系统的问题:进程同步原语采用记录型信号量s共享某个临界资源。。。。。。
s.value =1时,表示还有一个资源可以分配。
s.value = 0时,表示资源全部分配完毕,也没有进程内因为等待该资源而被阻塞。容
s.value = -4时,表示2个资源都已经被分配了,还有4个进程等待使用该资源而被阻塞。
9、vxworks信号量计数器值怎么获取
一.信号量的概念
是实现任务互斥、同步操作的主要机制。VxWorks提供的信号量经过了高度优化,在所有任务间通信机制中,速度最快。
二.信号量的分类
Binary Semaphores(二进制):完成互斥、同步操作的最佳方式;速度最快,最常用。
Mutual Exclusion Semaphores(互斥):一种特殊的二进制信号量,专门针对互斥操作进行了优化。
Counting Semaphores(计数):类似于二进制信号量,可记录信号量释放的次数,可监视同一资源上的多个实例。
三.Binary Semaphores(二进制信号量)
Task经常会等待事件或需获取资源。查询(polling)在RealTime系统中原则上不允许,最好采用Pending,等待事件或资源。
状态图:
说明:
1.为某个资源调用semBCreate()创建一个binary semaphore 并规定:
SEM_Full (资源可用) SEM_Empty (资源不可用).
2.资源不可用时Task调用semTake()进入Pending直到semaphore被Given
相关函数:
[c-sharp] view plaincopy
SEM_ID semBCreate
(
int options, /* semaphore options */
SEM_B_STATE initialState /* initial semaphore state */
)
STATUS semTake
(
SEM_ID semId, /* 需要获取的信号量ID */
int timeout /* 超时时间(tick)/no-wait/forever */
)
ISR(中断服务程序)不能调用semTake()操作!
[c-sharp] view plaincopy
STATUS semGive
(
SEM_ID semId /* 需要释放的信号量ID */
)
[c-sharp] view plaincopy
semFlush()
应用方向:
1.互斥操作:是指不同任务可以利用信号量互斥地访问临界资源。这种互斥的访问方式比中断禁止(interrupt disable) 与优先级锁定
(preemptive locks)两种互斥方式具有更加精确的粒度。
互斥操作时初始状态设为(SEM_FULL)可用。并在同一个Task中成对、顺序调用semTake()、semGive()。
2.同步操作:是指一个任务可以利用信号量控制自己的执行进度,使自己同步于一组外部事件。同步操作时初始状态设为(SEM_EMPTY)不可用。在不同Task中分别单独调用semTake()、semGive()。
四.Mutual Exclusion Semaphores(互斥信号量)
互斥信号量是一种特殊的二进制信号量,它是针对使用二进制信号量进行互斥操作时存在的一些问题设计的。互斥信号量主要增加了对优先级倒置、删除安全以及递归访问的处理。
状态图:
相关函数:
[c-sharp] view plaincopy
SEM_ID semMCreate
(
int options /* mutex semaphore options */
)
区别:
1.互斥信号量只能用于互斥操作。
2.只能由已经获取了互斥信号量的任务去释放它。
3.中断服务程序(ISR)不可以释放(semGive())互斥信号量。
4.互斥信号量不支持semFlush()操作。
应用方向:
1.避免优先级倒置(Priority Inversion):
在上图中,task2等待task1的资源,于是处于Pend状态,这时一个中等优先级的task进来,并抢占了task1的CPU,此时的表现是低优先级task在高优先级的task2前执行。这种现象就是先级倒置。
使用semId = semMCreate(SEM_Q_PRIORITY | SEM_INVERSION_SAFE);就可以避免倒置。
此时,task1的优先级提升与task2一样,至到task2执行完成。
SEM_INVERSION_SAFE不能与SEM_Q_FIFO配对!
2.Deletion Safety(安全删除)
使用:semId = semMCreate(SEM_Q_FIFO | SEM_DELETE_SAFE);可以实现安全删除。
其实质是:在Task对互斥信号量执行semTake()操作并成功占有该信号量之前,隐含执行了taskSafe()操作;在执行semGive()操作之后,隐含执行taskUnsafe()操作。
如果一个任务task1试图删除一个已经被保护起来的任务task2,task1则将被阻塞起来,直到task2解除保护(释放掉具有删除保护的互斥信号量)才能完成删除工作。
3.递归访问
[c-sharp] view plaincopy
InitFun()
{
sem_ID = semMCreate(…);
}
funB()
{
semTake(sem_ID, SEM_FOREVER);
/*访问临界资源*/
semGive(sem_ID);
}
funA()
{
semTake(sem_ID, SEM_FOREVER);
/*访问临界资源*/
funB(); //递归访问, 而不会死锁
semGive(sem_ID);
}
五.Counting Semaphores(计数信号量)
计数信号量与二进制信号量都可以用于任务之间的同步与互斥。其不同点在于,计数信号量可记录信号量释放的次数,可以用来监视某一资源的使用状况。
10、在整型信号量机制中的wait操作,只要是信号量s小于等于0就会不断测试什么
•整型信号量来
–是一个整源型量,通过2个原子操作wait(s)和signal(s)来访问。
Wait(s):
while s<= 0 do no-op
s:=s-1;
Signal(s): s:=s+1;
在wait原子操作中,当s<= 0时,就立刻循环回去继续判断S的值是否小于等于0