操作系统学习笔记(10) 互斥和同步的经典问题

  1 经典进程互斥与同步问题:
  2
  3 1。生产者|消费者问题
  4     多个进程写数据到缓冲区-生产
  5     一个进程从缓冲区读数据-消费
  6     假设缓冲区大小为n、有两个指针:in,out
  7
  8     不控制生产者/消费者:出错、执行结果不确定。
  9
 10     生产者/消费者必须互斥:
 11     生产者/消费者必须同步:
 12
 13     //program producer_consumer
 14     int const sizeofbuffer;
 15     var s: semaphore = 1; //互斥信号量
 16         n: semaphore = 0; //资源信号量
 17         e: semaphore = sizeofbuffer; //空储存单元
 18
 19     //procedure producer
 20     producer(){
 21         <产生一条数据>;
 22         wait(e);
 23         wait(s);
 24         <存入一条数据>;
 25         signal(s);
 26         signal(n);
 27     }
 28     //procedure consumer
 29     consumer(){
 30         wait(n);
 31         wait(s);
 32         <取一条数据>;
 33         signal(s);
 34         signal(e);
 35     }
 36     //主程序
 37     main(){
 38         producer();

 39         consumer();
 40     }
 41     注意:先申请资源信号量,再申请互斥信号量。
 42           wait-signal必须嵌套配对使用。
 43           wait-signal可以不在同一进程中。
 44
 45 2。读者|作着问题
 46     多进程访问一个共享数据区。
 47     :多个读者进程可以同时读数据。
 48     :不容许多个写者进程同时写数据。
 49     :写者不能与读者同时进行。
 50
 51     (1)读者优先:
 52     //program readers_writers
 53     const int readcount;
 54     var readcount_s:semaphore = 1;//互斥信号量,用于修改读者数
 55         write_s:    semaphore = 1;//互斥信号量,互斥写者和其他读者
 56
 57     reader(){
 58         wait(readcount_s);
 59         readcount += 1;
 60         if(readcount == 1)
 61             wait(writer_s);
 62         signal(readcount_s);
 63
 64         <读数据>;
 65
 66         wait(readcount_s);
 67         readcount -= 1;
 68         if(readcount == 0)
 69             signal(writer_s);
 70         signal(readcount_s);
 71     }
 72
 73     writer(){
 74         wait(write_s);
 75         <写数据>;
 76         signal(write_s);
 77     }
 78
 79     //主程序
 80     main(){
 81         readcount = 0;
 82         reader();
 83         write();
 84     }
 85     (2)写者优先:
 86     //program readers_writers
 87     const int readcount;
 88     var readcount_s:semaphore = 1;//互斥信号量,用于修改读者数
 89         write_s:    semaphore = 1;//互斥信号量,互斥写者和其他读者
 90     writer(){
 91         wait(writecount_s);
 92         writecount += 1;
 93         if(writecount == 1)
 94             wait(reader_all_s);
 95         signal(writecount_s);
 96
 97         wait(writer_s);
 98         <写数据>;
 99         signal(writer_s);
100
101         wait(writecount_s);
102         writecount -= 1;
103         if(writecount == 0)
104             signal(reader_all_s);
105         signal(writecount_s);
106     }
107
108     read(){
109         wait(reader_back_writer_s);//阻塞排在writer后面的reader
110         wait(reader_before_writer_s);
111         wait(readcount_s);
112         readcount += 1;
113         if(readcount == 1)
114             wait(writer_s);
115         signal(readcount_s);
116         siganl(reader_before_writer_s);
117         siganl(reader_back_writer_s);
118
119         <读数据>;
120
121         wait(readcount_s);
122         readcount -= 1;
123         if(readcount == 0)
124             signal(writer_s);
125         signal(readcount_s);
126
127     }
128 3。哲学家进餐问题

你可能感兴趣的:(操作系统学习笔记(10) 互斥和同步的经典问题)