进程同步之生产者消费者问题 | StriveZs的博客

进程同步之生产者消费者问题

主要介绍的是使用记录性信号量来实现生产者消费者问题。 在介绍生产者消费者问题之前先介绍一些记录型信号量:   采取的是让权等待策略,wait()和signal()分别用p()和v()来表示 其中包含了一个用于表示资源数目的整型变量value,还包含了一个进程链表指针list。 结构体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
typedef struct{

    int value;

    struct process\_control\_block *list;

}

  相应的p和v操作的伪代码:

wait(semaphore *S)

{

    S->value--;

    if(S->value<0)

        block(S->list);  //如果资源数小于0,则调用阻塞进程将该进程阻塞

}



signal(semaphore *S)

{

    S->value++;

    if(S->value<=0)

        wakeup(S->list); //如果有阻塞进程则将它唤醒,将进程转为就绪状态

}

使用PV操作实现互斥操作: Semaphore mutex=1; P(mutex) 操作; V(mutex) 一般在互斥操作中PV是成对出现的。 而在同步操作中PV操作一般是出现在不同的进程中。   使用记录性信号量来实现消费者生产者问题: 有三种情况:

  • 一个生产者、一个消费者、缓冲区只有一个容量
  • 一个生产者、一个消费者、缓冲区有多个空间
  • 多个生产者、多个消费者、缓冲区有多个空间

情况一的实现伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//情况一

semaphore full=0,empty=1// full代表的是已经被占用的空间数量  empty未被使用的空间数量

main()

cobegin

{

    Process producer()

    while(1)

    {

        生产一个产品;

        P(empty);

        将产品送入缓冲区;

        V(full);

    }

   

    Process customer()

    {

        P(full);

        从缓冲区去除一个产品;

        V(empty);

        使用产品;

    }

}coend;

由于只有一个消费者和一个生产者所以不需要设置互斥信号量   情况二的实现伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//情况二

semaphore full=0,empty=n;  //full代表的是已经被占用的空间数量  empty未被使用的空间数量、它的总量为n

semaphore buffer\[n\]; //缓冲区

int in,out;

in=out=0;



main()

cobegin

{

    Process producer()

    while(1)

    {

        生产一个产品;

        P(empty);

        将产品送入缓冲区buffer\[in\];

        in = (in+1)%n;

        V(full);

    }

   

    Process customer()

    {

        P(full);

        从缓冲区buffer\[out\]去除一个产品;

        out = (out+1)%n;

        V(empty);

        使用产品;

    }

}coend;

情况三具体实现伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//情况三

semaphore mutex=1,full=0,empty=n;  //互斥信号量的初值为1 full代表的是已经被占用的空间数量  empty未被使用的空间数量、它的总量为n

semaphore buffer\[n\]; //缓冲区

int in,out;

in=out=0;



main()

cobegin

{

    Process producer()

    while(1)

    {

        P(empty);

        生产一个产品;

        P(mutex);

        将产品送入缓冲区buffer\[in\];

        in = (in+1)%n;

        V(mutex);

        V(full);

    }

   

    Process customer()

    {

        P(full);

        P(mutex);

        从缓冲区buffer\[out\]去除一个产品;

        out = (out+1)%n;

        V(mutex);

        V(empty);

        使用产品;

    }

}coend;

多个消费者和多个消费者实现可以使用多线程来实现,具体实现代码我在之前的博文上已经给出大家可自行翻阅。

StriveZs wechat
Hobby lead  creation, technology change world.
  • Post author: StriveZs
  • Post link: 1350.html
  • Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.