使用二进制信号量实现通用信号量

时间:2016-12-16 06:14:45

标签: c operating-system mutex semaphore

使用二进制信号量实现的gen信号量:

click image please, gen semaphore implemented using binary semaphores

所以我无法理解为什么我们需要输入信号量,我可以看到它没有它就能正常工作。 多个流程如何进入关键部分?第一个进程进入后,它会等待(互斥),这意味着没有其他人可以进入,此外还有其他进程在等待信号(互斥)

一般信号量可以允许多个进程进入临界区域但我无法看到在此代码中如何完成。

2 个答案:

答案 0 :(得分:0)

看到你的问题形象后,输入信号量的目的是只允许单个进程/线程等待锁定,如果你不使用它,其他进程将进入等待队列。

为什么我们需要输入信号量

  • 条目信号量没有用任何值初始化,如果它是全局声明的,那么它将用0初始化。因此,如果条目信号量为0,则wait(entry)将只允许单个进程进入,因为wait()功能检查是否条目值小于零,然后进程将进入等待队列。

多个流程如何进入关键部分?

  • 一次只有一个过程可以在关键部分 - 否则关键部分是什么?

  • Critical Section是访问共享变量的代码段 并且必须作为原子动作执行。这意味着在一个小组中 在给定的时间点,合作过程只有一个过程 必须执行其关键部分。如果还有其他任何过程 想要执行它的关键部分,它必须等到第一部分 一个完成。

一般信号量可以允许多个进程进入关键部分区域,但我无法看到在此代码中是如何完成的。

这是不对的,如果您允许多个进程到关键部分谁想要修改共享数据,那么您可以更改关键部分的平均值。您将在流程结束时收到错误的数据。

如果流程仅读取共享数据,则不会使用常规信号量来允许多个流程访问关键数据,不会修改共享数据。

我有非常小的代码供您展示信号量如何工作以及多个进程如何允许访问共享数据。你可以把它作为多个读者和作家。

semaphore mutex = 1;                 // Controls access to the reader count
semaphore db = 1;                    // Controls access to the database
int reader_count;                    // The number of reading processes accessing the data

Reader()
{
  while (TRUE) {                     // loop forever
     down(&mutex);                          // gain access to reader_count
     reader_count = reader_count + 1;       // increment the reader_count
     if (reader_count == 1)
         down(&db);                         // if this is the first process to read the database,
                                            // a down on db is executed to prevent access to the 
                                            // database by a writing process
     up(&mutex);                            // allow other processes to access reader_count
     read_db();                             // read the database
     down(&mutex);                          // gain access to reader_count
     reader_count = reader_count - 1;       // decrement reader_count
     if (reader_count == 0)
         up(&db);                           // if there are no more processes reading from the 
                                            // database, allow writing process to access the data
     up(&mutex);                            // allow other processes to access reader_countuse_data();
                                            // use the data read from the database (non-critical)
}

Writer()
{
  while (TRUE) {                     // loop forever
     create_data();                         // create data to enter into database (non-critical)
     down(&db);                             // gain access to the database
     write_db();                            // write information to the database
     up(&db);                               // release exclusive access to the database
}

答案 1 :(得分:0)

  

多个流程如何进入关键部分?在第一个进程进入后,它会执行wait(mutex),这意味着没有其他人可以进入…   一般的信号量可以允许多个进程进入关键部分区域

不幸的是,在这里您说到关键部分,因为critical section通常被理解为程序的一部分,不能由多个进程执行时间。您实际上的意思可能是一般(计数)信号量可以允许多个进程共享(资源池)。您提供的实现确实可以执行此操作,因为:进入第一个进程并且执行wait(mutex)后,由于mutex具有已初始化为1。然后,如果递减的c不小于0,那么它会signal(mutex),因此另一个进程可以进入