操作系统期中考试复习
1. 中断:
如任务A需要用到打印机,打印的时间相对于cpu来说会很长,如果在打印期间死等打印机太浪费资源,所以出现了中断,cpu会先放弃该任务的执行,然后转去执行其他任务,当打印机打印好后就会发出中断信号给cpu,cpu就暂停当前任务的执行,继续运行任务A。
2.上下文切换
切换CPU到另一个进程需要保存当前进程状态和 恢复另一个进程的状态,叫做上下文切换
3.临界区问题
总算是看明白了,如果这样做的话,只能两个进程相互进去一次,不然就没法实现
看到一篇不错的讲解同步问题代码的博客
1 我把信件写好 -----相当于生产者生产数据 2 我把信放到邮筒-----相当于把生产者的数据放入到缓冲区 3 邮递员把信从邮筒取出-----相当于消费者把数据从缓冲区取出 4 邮递员把信拿去邮局处理------相当于消费者处理数据 这段是用来解释为什么两段注释的顺序是不一样的
1 int in=0,out=0; 2 //item为消息的结构体 3 item buffer[n]; 4 semaphore mutex=1,empty=n,full=0; //初始化信号量 5 6 void producer(){ 7 do { 8 //生产者产生一条消息 9 producer an item nextp; 10 ... 11 //判断缓冲池中是否仍有空闲的缓冲区 12 P(empty); 13 //判断是否可以进入临界区(操作缓冲池) 14 P(mutex); 15 //向缓冲池中投放消息 16 buffer[in] = nextp; 17 //移动入队指针 18 in = (in + 1) % n; 19 //退出临界区,允许别的进程操作缓冲池 20 V(mutex); 21 //缓冲池中非空的缓冲区数量加1,可以唤醒等待的消费者进程 22 V(full); 23 }while(true); 24 } 25 26 void consumer(){ 27 do { 28 //判断缓冲池中是否有非空的缓冲区(消息) 29 P(full); 30 //判断是否可以进入临界区(操作缓冲池) 31 P(mutex); 32 //从缓冲池中取出消息 33 nextc = buffer[out]; 34 //移动出队指针 35 out = (out + 1) % n; 36 //退出临界区,允许别的进程操作缓冲池 37 V(mutex); 38 //缓冲池中空缓冲区数量加1,可以唤醒等待的生产者进程 39 V(empty); 40 //消费消息 41 consumer the item in nextc; 42 ... 43 }while(true); 44 }
https://blog.csdn.net/qq_34666857/article/details/103232060
这个人的讲解很好