Linux| |对于信号量理解

对于信号量理解

#semaphore(信号)

1. 信号量就是一个计数器

描述临界资源的数目(将共享内存分为了几个区域)

  • 提供多个进程对共享数据对象的访问

也就是一个仅能由同步原语对其进行操作整形变量

信号量来控制临界资源

  • 如果对信号量减1,也就是使用该信号量为进程分配了一个临界资源

  • 如果对信号量加1,也就是使用该信号量释放了一个临界资源,如果此时等待队列中有进程在等待的话,就让该进程来使用这一临界资源

2. 同步原语

对于同步原语共有两个

  • 这两个同步原语分别是P操作和V操作

    • P操作:发信号(申请临界资源)--

    • V操作:等待(释放临界资源)++

      扫描二维码关注公众号,回复: 5283676 查看本文章
    • 对于这两个操作都是原子性的

3. 信号量的分类

  • 二元信号量

    • 允许取值为“0”和“1”,主要用于做互斥变量

  • 一般信号量

    • 允许取值为非负整数,主要用于进程间的一般同步问题

4. 信号量与信号量值

  • 信号量

    • 互斥:P、V在同一个进程下面

    • 同步:P、V不在同一个进程下面

  • 信号量值

    • S > 0:S表示可用资源的个数

    • S = 0:表示没有可用资源,无等待进程

    • S < 0:表示等待队列中进程的个数

5. 对于信号量结构体伪代码

**信号量的本质一个计数器**
struct semaphore
{
    int value;
    pointer_PCB queue;
}
  • P原语

P(s)
{
    s.value = s.value--;
    if (s.value < 0)
    {
        该进程状态置为等待状态
        将该进程的PCB插入相应的等待队列s.queue的末尾
    }
}
  • V原语

V(s)
{
    s.value = s.value++;
    if (s.value <= 0)
    {
        唤醒相应等待队列s.queue中等待的一个进程,也就是等待队列中的队首
        改变其状态为就绪态
        并将其插入到就绪队列
    }
}

5. 对于同步与互斥的理解

  • 互斥:

    • 进程在通过临界区访问临界资源时,有且只有一个进程是独占式的,排他式的

  • 同步:

    • 在互斥的基础上,让多个进程访问临界资源的时候具有顺序

6. 信号量集

信号量本质就是信号量的一个集合

struct semid_ds
{
    struct ipc_perm sem_perm;
    time_t sem_otime;//最后一次进行semop()函数的时间
    time_t sem_ctime;//最后一次改变的时间
    unsigned short sem_nsems;//有多少个信号在该信号集中
}

#信号量的操作

对于信号量的所有操作都是使用信号集来进行操作的。

猜你喜欢

转载自blog.csdn.net/qq_40399012/article/details/84636818