操作系统原理_为什么 讲操作系统原理 都以Unix为例

操作系统原理3.

在请求分页内存管理的页表表项中,其中访问位供()时参考 。
A.
分配页面

B.
程序访问

C.
换出页面

D.
调入页面

E.
其他
学习操作系统原理哪些书比较好说实话,要学Linux跟操作系统原理的关系实在不是很大 。除非你是要改写Linux内核或做Linux的移植 。就算那样,传统的操作系统原理的课本也没有十分明显的意义 。
如果一定要看一个跟Linux有关的操作系统原理教材,建议可以考虑Andrew S.Tanenbaum的《操作系统设计与实现》 , 作者为了写这本教材并应用于教学,自己设计了一个操作系统MINIX , 而这个操作系统也就是linus最早写Linux时就是在这个基础上进行的 。
如果仅仅是为了看Linux,那不如直接去看Linux内核原理的书 。
当然我个人认为,对于学计算机专业的同学来说,了解操作系统原理还是很有必要的 。
如何写操作系统原理的PV原语操作?思路是什么?。?/h3>从论坛找来一个非常好的帖子,请好好学习一下:
在计算机操作系统中 , PV操作是进程管理中的难点 。
首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
P(S):①将信号量S的值减1,即S=S-1;
②如果S?,则该进程继续执行;否则该进程置为等待状态,排入等待队列 。
V(S):①将信号量S的值加1,即S=S+1;
②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程 。
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥 。PV操作属于进程的低级通信 。
什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程 。信号量的值与相应资源的使用情况有关 。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数 。注意,信号量的值仅能由PV操作来改变 。
一般来说,信号量S?时,S表示可用资源的数量 。执行一次P操作意味着请求分配一个单位资源 , 因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去 。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S?,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去 。
利用信号量和PV操作实现进程互斥的一般模型是:
进程P1进程P2……进程Pn
………………
P(S);P(S);P(S);
临界区;临界区;临界区;
V(S);V(S);V(S);
……………………
其中信号量S用于互斥,初值为1 。
使用PV操作实现进程互斥时应该注意的是:
(1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区 。若有多个分支,要认真检查其成对性 。
(2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短 , 不能有死循环 。
(3)互斥信号量的初值一般为1 。
利用信号量和PV操作实现进程同步
PV操作是典型的同步机制之一 。用一个信号量与一个消息联系起来 , 当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在 。用PV操作实现进程同步时 , 调用P操作测试消息是否到达 , 调用V操作发送消息 。
使用PV操作实现进程同步时应该注意的是:
(1)分析进程间的制约关系,确定信号量种类 。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量 。
(2)信号量的初值与相应资源的数量有关 , 也与P、V操作在程序代码中出现的位置有关 。
(3)同一信号量的P、V操作要成对出现,但它们分别在不同的进程代码中 。
【例1】生产者-消费者问题
在多道程序环境下,进程同步是一个十分重要又令人感兴趣的问题 , 而生产者-消费者问题是其中一个有代表性的进程同步问题 。下面我们给出了各种情况下的生产者-消费者问题,深入地分析和透彻地理解这个例子 , 对于全面解决操作系统内的同步、互斥问题将有很大帮助 。
(1)一个生产者,一个消费者,公用一个缓冲区 。
定义两个同步信号量:
empty——表示缓冲区是否为空,初值为1 。
full——表示缓冲区中是否为满,初值为0 。
生产者进程
while(TRUE){
生产一个产品;
P(empty);
产品送往Buffer;
V(full);
}
(2)一个生产者 , 一个消费者,公用n个环形缓冲区 。
定义两个同步信号量:
empty——表示缓冲区是否为空,初值为n 。
full——表示缓冲区中是否为满,初值为0 。
设缓冲区的编号为1~n-1 , 定义两个指针in和out , 分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区 。
生产者进程
while(TRUE){
生产一个产品;
P(empty);
产品送往buffer(in);
in=(in+1)mod n;
V(full);
}
(3)一组生产者,一组消费者 , 公用n个环形缓冲区
在这个问题中,不仅生产者与消费者之间要同步,而且各个生产者之间、各个消费者之间还必须互斥地访问缓冲区 。
定义四个信号量:
empty——表示缓冲区是否为空 , 初值为n 。
full——表示缓冲区中是否为满 , 初值为0 。
mutex1——生产者之间的互斥信号量,初值为1 。
mutex2——消费者之间的互斥信号量,初值为1 。
设缓冲区的编号为1~n-1 , 定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区 。
生产者进程
while(TRUE){
生产一个产品;
P(empty);
P(mutex1);
产品送往buffer(in);
in=(in+1)mod n;
V(mutex1);
V(full);
}
需要注意的是无论在生产者进程中还是在消费者进程中,两个P操作的次序不能颠倒 。应先执行同步信号量的P操作 , 然后再执行互斥信号量的P操作,否则可能造成进程死锁 。
【例2】桌上有一空盘,允许存放一只水果 。爸爸可向盘中放苹果,也可向盘中放桔子 , 儿子专等吃盘中的桔子,女儿专等吃盘中的苹果 。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步 。
分析在本题中 , 爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果 。当盘子为空时,爸爸可将一个水果放入果盘中 。若放入果盘中的是桔子,则允许儿子吃 , 女儿必须等待;若放入果盘中的是苹果,则允许女儿吃 , 儿子必须等待 。本题实际上是生产者-消费者问题的一种变形 。这里,生产者放入缓冲区的产品有两类 , 消费者也有两类,每类消费者只消费其中固定的一类产品 。
解:在本题中,应设置三个信号量S、So、Sa , 信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0 。同步描述如下:
int S=1;
int Sa=0;
int So=0;
main()
{
cobegin
father();/*父亲进程*/
son();/*儿子进程*/
daughter();/*女儿进程*/
coend

father()
{
while(1)
{
P(S);
将水果放入盘中;
if(放入的是桔子)V(So);
elseV(Sa);
}
}
son()
{
while(1)
{
P(So);
从盘中取出桔子;
V(S);
吃桔子;

}
daughter()
{
while(1)
{
P(Sa);
从盘中取出苹果;
V(S);
吃苹果;


思考题:
四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F 。但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F 。为了使这四个进程并发执行时能按系统要求使用文件,现用PV操作进行管理,请回答下面的问题:
(1)应定义的信号量及初值:。
(2)在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作:
A()B()C()D()
{{{{
[1];[3];[5];[7];
read F;read F;read F;read F;
[2];[4];[6];[8];
}}}}
思考题解答:
(1)定义二个信号量S1、S2 , 初值均为1,即:S1=1,S2=1 。其中进程A和C使用信号量S1 , 进程B和D使用信号量S2 。
(2)从[1]到[8]分别为:P(S1) V(S1) P(S2) V(S2) P(S1) V(S1) P(S2) V(S2)
学习操作系统原理这门课程需要先学什么先导课程 。操作系统是很简单的课程的 , 至少比数据结构和组成原理要简单,或者简单的多 。它跟数据结构没关系,不包含数据结构相关的内容 。但是跟组成原理会有一些交叉内容 , 不过并不会太多,即使有的一些东西在操作系统中会重复提到的 。
我就是先学操作系统,然后才学组成原理的 。非计算机类学生,自学计算机的 。现在工作是VC软件工程师 。我都能学,所以都不难 。加油 。
为什么 讲操作系统原理 都以Unix为例【操作系统原理_为什么 讲操作系统原理 都以Unix为例】windows根本没法和Unix比,只是windows的图形界面对我们来说操作简单 , 也习惯了 。服务器和安全、稳定要求性高的,都用Unix/Linux 。这个系统设计简洁,占用资源少,和c语言完美配合 。
很重要的一点是,它是开源的 , 可以得到源代码 。这点如果你在公司接触服务器之类的就明白了 。有兴趣的话强烈建议学习一下
unix可以说是第一种现代意义的操作系统 。它功能强大,结构简单 , 性能稳定,常常可以运行数年而不用重起,安全性和稳定性非常高,