1.什么是信号量?
定义:记录一些信息(即量),并根据这个信息决定睡眠还是唤醒(即信号)。睡眠和唤醒只是一个信号(相当于0和1)。
2.问题:一种资源的数量是8,这个资源对应的信号量的当前值是2,说明:(B)
A. 有2个进程等待这个资源。 //值为-2选A
B. 有2个资源可以使用。
3.信号量:1965年,由荷兰学者Dijkstra提出的一种特殊整型变量,量用来记录,信号用来sleep和wake。
(重要)P在荷兰语里是test(检测是否有可用资源),V是increase(增加内容)。
struct semaphore
{int value; //记录资源个数PCB *queue; //记录等待在该信号量上的进程,使用队列存储
}P(semaphore s) //消费资源(对应生产者生产数据占用内存)
{s.value--;if(s.value < 0) sleep(s.queue);
}V(semaphore s) //产生资源(对应消费者从内存中取数据)
{s.value++;if(s.value <= 0) wake(s.queue); //说明上一步value<0,存在进程等待资源,所以唤醒一个
}
4.(重点)用信号量解生产者——消费者问题
int fd = open("buffer.txt");
write(fd, 0, sizeof(int)); //写in 用文件定义共享缓冲区
write(fd, 0, sizeof(int)); //写outsemaphore full = 0; //文件里的内容
semaphore empty = BUFFER_SIZE; //资源的数量
semaphore mutex = 1; //互斥(原子操作)Producer(item)
{P(empty); //检测是否有可用资源并减1P(mutex);读入in;将item写入到in的位置上;V(mutex);V(full); //让full的值增加
}Consumer()
{P(full); //检测是否有内容P(mutex);读入out;从文件中的out位置读出到item;打印item;V(mutex);V(empty); //可用资源+1
}