操作系统期中考试复习


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

这个人的讲解很好