公司动态

计算机考研 408 机组 同步与互斥

📅 2026/8/15 14:04:07
计算机考研 408 机组 同步与互斥
生产消费四大步1. 进程分类(流程完全一致的分一类)2. 每个进程写流程单次流程循环流程 while3. 考虑每个流程前要不要P(获取锁), 有P就有V先同步后互斥互斥只需前后加PV4. 先定义信号量, 后赋初值临界资源的互斥访问进入区上锁临界区具体操作退出区解锁剩余区其他同步机制四大原则空闲让进忙则等待有限等待:等待时间有限让权等待:等待时让出cpu互斥锁acquire 上锁release 解锁mutex mtx; void thread() { lock(mtx); critial section; unlock(mtx); }整型信号量s:资源数s0wait(s) 》s-1 p操作-申请signal(s) 》s1 v操作-释放记录型信号量s资源数s可以为负数负数的绝对值为等待进程的个数l等待队列信号量实现进程互斥// init semaphore S 1; P1() { P(S); // critical section for P1 V(S); } P2() { P(S); // critical section for P2 V(S); }信号量实现进程同步// 信号量的初始值为资源数 semphore S 0; P1() { // 前操作 code1; // V操作 V(S); } P2() { // P操作 P(S); // 后操作 code2; }生产者-消费者问题semaphore mutex 1; // 临界区互斥信号量 semaphore empty n; // 缓冲区 空位置 数量 semaphore full 0; // 缓冲区 数据项 数量 producer() { while (1) { P(empty) // 等待一个 空位置 P(mutex) // 进入临界区前先获取mutex .... // 将数据项添加到缓冲区 V(mutex) // 离开临界区释放mutex V(full) // 增加一个 数据项 } } consumer() { while (1) { P(full) // 等待一个 数据项 P(mutex) // 进入临界区前先获取mutex ... // 从缓冲区取出数据项并消费 V(mutex) // 离开临界区释放mutex V(empty) // 增加一个 空位置 } }哲学家进餐问题semaphore mutex 1; // 全局唯一锁必须拿到才能开始拿筷子 semaphore chopstick[5] {1, 1, 1, 1, 1}; // 5根筷子每根都是信号量1 philosopher(int i) { while (1) { think(); // 思考 P(mutex); // 【必须先拿全局锁】才能开始拿筷子 P(chopstick[i]); // 拿左边筷子 P(chopstick[(i1)%5]);// 拿右边筷子 V(mutex); // 拿完筷子释放全局锁 eat(); // 吃饭 V(chopstick[i]); // 放回左边筷子 V(chopstick[(i1)%5]);// 放回右边筷子 } }