当前位置:文档之家› 信号量答案

信号量答案

信号量答案
信号量答案

第一部分

2、

该方法对可抢占调度完全没问题。事实上,它就是为这种情况设计的。当调度为不可抢占的,该方法将会失败。假设turn初值为0,而进程1首先运行。它将一直循环,永不释放CPU。

3、

对于内核线程,线程可以在信号量上阻塞,而内核可以运行该进程中的其它线程。因而,使用信号量没有问题。而对于用户级线程,当某个线程在信号量上阻塞时,内核将认为整个进程都被阻塞,而且不再执行它。因此,进程失败。

4、某商店有两种食品A和B,最大数量各为m个。该商店将A、B两种食品搭配出售,每次各取一个。为避免食品变质,遵循先到食品先出售的原则。有两个食品公司分别不断地供应A、B两种食品(每次一个)。为保证正常销售,当某种食品的数量比另一种的数量超过k(k小于m)个时,暂停对数量大的食品进货。试用P、V操作解决上述问题中的同步和互斥关系。

4、参考答案

#define Max m /*最大数量*/

typedef int semaphore;

/*初始化*/

semaphore A_full = 0; /*商店中A食品数目假设初始值为0*/

semaphore B_full = 0; /*商店中B食品数目假设初始值为0*/

semaphore A_empty = Max; /* A可缓冲数目*/

semaphore B_empty = Max; /* B 可缓冲数目*/

semaphore A_minus_B = k; /* 商店中A超过B的数目初始值为k-(A_full – B_full)*/ semaphore B_minus_A = k;/* 商店中B超过 A 的数目初始值为k- (B_full – A_full) */ Queue Q_A,Q_B; /*先进先出的队列模拟商店中两食品资源*/

semaphore QA_mutex = 1; /*队列A互斥量*/

semaphore QB_mutex = 1; /*队列B互斥量*/

/* 商店搭配出售 A B进程*/

void Shop_A_B () /*商店出售A B进程两食品搭配出售*/

{

A a;

B b;

while(1)

{

P(A_full);

P(B_ful);

P(QA_mutex);

a = Q_A.remove_item(); /*从商店中取出A*/

V(QA_mutext);

P(QB_mutex)

b = Q_B.remove_item();/*从商店中取出B*/

V(QB_mutex);

V(A_empty);

V(B_empty);

sell(a,b); /*卖出a,b*/

}

}

/*总结:相当于生产者消费者问题中的消费者,首先执行将A,B中的空槽减一,然后开始临界区操作,此处分别有两种商品,因此分别有QA-mutex和QB_mutex两个互斥量。同时,为满足题目中先到先出的要求,采用队列的方式取出商品。完成临界区操作后,执行V(A_empty)和V(B_empty)操作。*/

/*食品公司向商店提供A 进程*/

void Stock_A() /*进货A*/

{

A a;

while(1)

{

a = getA();

P(A_empty);

P(A_minus_B); //the key of this problem

P(QA_mutex);

Q_A.insert_item(a);

V(QA_mutex);

V(A_full);

V(B_minus_A);

}

}

/*总结:相当于生产者消费者问题中的生产者,每次先生产一个产品,首先将空槽的数量减少一个,由于A产品数量增加了一个,所以A减B的量的允许值也少了一个(与k比较)。然后开始临界区操作,使用QA_mutex来对A产品有关的临界区访问进行互斥。最后将满槽的数目加一,由于B相对于A减一,故允许的B减A的差值加一*/

/*食品公司向商店提供B 进程*/

void Stock_B() /*进货B*/

{

B b;

While(1)

{

b = getB();

P(B_empty);

P(B_minus_A);

P(QB_mutex);

Q_B.insert_item(b);

V(QB_mutex);

V(B_full);

V(A_minus_B);

}

}

第4题总结:(1)主要是模仿生产者消费者问题,相当于两个生产者一个消费者的问题

(2)涉及到了两个不同商品的临界区访问,主要是确定临界区操作所涉及的具体对象。同时,当涉及先进先出问题时,优先考虑队列操作

5、考虑具有如下特征的共享资源:(1)当使用该资源的进程小于3个时,新申请资源的进程可以立刻获得资源;(2)当三个资源都被占用后,只有当前使用资源的三个进程都释放资源后,其他申请资源的进程才能够获得资源。由于需要使用计数器来记录有多少进程正在使用资源和等待资源,而这些计数器自身也需要互斥执行修改动作的共享资源,所以可以采用如下的程序:

1 semaphore mutex = 1, block = 0;

2 int active = 0, waiting = 0;

3 boolean must_wait = false;

4

5 semWait(mutex);

6 if(must_wait) {

7 ++waiting;

8 semSignal(mutex);

9 semWait(block); //不能在互斥区执行block

10 semWait(mutex);

11 --waiting;

12 }

13 ++active;

14 must_wait = active == 3;

15 semSignal(mutex);

16

17 /* 临界区:对获得的资源进行操作*/

18

19 semWait(mutex);

20 --active;

21 if(active == 0) {

22 int n;

23 if (waiting < 3) n = waiting;

24 else n = 3;

25 while( n > 0 ) {

26 semSignal(block);

27 --n;

28 }

29 must_wait = false;

30 }

31 semSignal(mutex);

这个程序看起来没有问题:所有对共享数据的访问均被临界区所保护,进程在临界区中执行时不会自己阻塞,新进程在有三个资源使用者存在时不能使用共享资源,最后一个离开的使用者会唤醒最多3个等待着的进程。

a.这个程序仍不正确,解释其出错的位置;

b.假如我们将第六行的if语句更换为while语句,是否解决了上面的问题?有什么难点仍然存在?

a.

第29行直接让must_wait=false有问题,因为随后可能会有另一个新进程来访问资源,并在第六行判断为false,进而获取资源,而此时可能已经有3个等待的进程被唤醒,所以在同一时间内可能会有超过3个进程进入临界区。

b.

可以解决上述问题,但是会有另一个缺陷,那就是先来的进程可能会在后来的进程之后获得资源,甚至有可能一直阻塞而饥饿。

总结:没有太大收获,总之互斥量mutex的P操作和V操作之间不会被其他进程所干扰,一次必须执行完。Block操作不能在一个互斥量所保护的临界区中执行,即不能在临界区中出现可能引起阻塞的过程,否则会发生死锁。当某进程可能在等待过程中被后来进程插队进入临界区时,可能发生饥饿现象

6、现在考虑上一题的正确解法,如下:

1 semaphore mutex = 1, block = 0;

2 int active = 0, waiting = 0;

3 boolean must_wait = false;

4

5 semWait(mutex);

6 if(must_wait) {

7 ++waiting;

8 semSignal(mutex);

9 semWait(block);

10 } else {

11 ++active;

12 must_wait = active == 3;

13 semSignal(mutex);

14 }

15

16 /* 临界区:对获得的资源进行操作*/

17

18 semWait(mutex);

19 --active;

20 if(active == 0) {

21 int n;

22 if (waiting < 3) n = waiting;

23 else n = 3;

24 waiting -= n;

25 active = n; /*对于等待队列中的申请者,直接将active值初始化*/

26 while( n > 0 ) {

27 semSignal(block); /* */

28 --n;

29 }

30 must_wait = active == 3;

31 }

32 semSignal(mutex);

a.解释这个程序的工作方式,为什么这种工作方式是正确的?

b.这个程序不能完全避免新到达的进程插到已有等待进程前得到资源,但是至少使这种问题的发生减少了。给出一个例子;

c.这个程序是一个使用信号量实现并发问题的通用解法样例,这种解法被称作“I'll Do it for You”(由释放者为申请者修改计数器)模式。解释这种模式。

a.

这个程序在释放的部分维护active的值,第30行must_wait = active == 3;确保了等在block上的进程和新来的进程不会同时进入临界区。

b.

仍然会有插队的情况,在一个进程执行完:

8 semSignal(mutex);

这一句但还没有执行:

9 semWait(block);

这时可能会有一个新的进程获取mutex,并阻塞在block上。如果此时有离开临界区的进程唤醒等在block上的进程,那么后来的进程可能会先执行,先来的进程却仍阻塞在block上。

c.

“I'll Do it for You”由离开的进程来修改全局变量并唤醒阻塞的进程。这样被唤醒的进程不用再次判断全局条件是否满足。可以控制进程并发度。

7、现在考虑上一题的另一个正确解法,如下:

1 semaphore mutex = 1, block = 0;

2 int active = 0, waiting = 0;

3 boolean must_wait = false;

4

5 semWait(mutex);

6 if(must_wait) {

7 ++waiting;

8 semSignal(mutex);

9 semWait(block); //在一个进程即将被阻塞时,必须先释放掉互斥锁

10 --waiting;

11 }

12 ++active;

13 must_wait = active == 3;

14 if(waiting > 0 && !must_wait)

15 semSignal(block);

16

17 else semSignal(mutex);

18

19 /* 临界区:对获得的资源进行操作*/

20

21 semWait(mutex);

22 --active;

23 if(active == 0) //只有在must_wait为true的时候才可能到这一步,这时候必须等所有进程全部释放资源

24 must_wait = false;

25 if(waiting >= 0 && !must_wait)

26 semSignal(block); //如果不是必须等待且有等待进程,则唤醒一个

27

28 else semSignal(mutex);

a.解释这个程序的工作方式,为什么这种工作方式是正确的?

b.这个方法在可以同时唤醒进程个数上是否和上一题的解法有所不同?为什么?

c.这个程序是一个使用信号量实现并发问题的通用解法样例,这种解法被称作“Pass the Paton”(接力棒传递)模式。解释这种模式。

a.

进程在释放资源时,如果此时释放的是最后一个被占用的资源,那么会唤醒一个等待在block上的进程(如果有的话),这个被唤醒的进程会判断是否还有等待在block上的进程并唤醒,直到有三个唤醒的进程。在这一过程中,新的申请资源的进程会等待在mutex上,而刚才第三个被唤醒的进程会唤醒等在mutex上的一个进程。

b.

这个方法是唤醒一个进程,接着由该进程唤醒第二个进程,再由第二个进程唤醒第三个进程。之前的方法是由一个进程同时唤醒三个进程。

c.

释放者只唤醒一个进程,然后被唤醒的进程负责唤醒下一个进程……直到唤醒所有等待的进程或唤醒的进程数量达到上限。接力棒模式能避免插队,但是在进程的并发性上不如“I'll Do it for You”。

8、由于水面高度不同,有160~175米的落差,所以三峡大坝有五级船闸,T1~T5。由上游驶来的船需经由各级船闸到下游;由下游驶来的船需经由各级船闸到上游。假设只能允许单方向通行(此假设与实际情况不符,实际为双向各五级船闸)。试用P、V操作正确解决三峡大坝船闸调度问题。

8、参考答案

五级船闸,每级只能容纳一艘船。

一边已经有船等待时,另一边新来的船也不能出发。

int inside=0, up_waiting=0, down_waiting=0;

Semaphore up_block=0, down_block=0, big_lock=1;

Semaphore r[5] = {1,1,1,1,1};//船闸之间互斥

void down()

{

down(big_lock)

if(up_waiting>0)

{

++down_waiting; //前面有船等待,则继续等待

up(big_lock);

down(down_block);

}

else

{

++inside;

up(big_lock);

}

//依次通过船闸,每个船闸最多容纳一艘船

int i=0;

down(r[0]); //申请通过第一级船闸

while(i<4)

{

down(r[i+1]);

PASS(i);

up(r[i]); //只有当船过了下一级船闸才可以重新允许通过

i++;

}

up(r[4]);

down(big_lock);

--inside;

if(inside==0)

{

inside=up_waiting;

up_waiting=0;

for(int i=0; i

}

up(big_lock);

}

9、讲义上P、V操作的定义与教材上面的有区别。请问在程序中分别使用这两种定义,其效果有什么不同?能否在不改变程序意义的前提下,用一个代替另一个?

直接睡眠那个P操作,没有FIFO的性质,依赖内核的调度器保证不会饥饿。系统的调度是全局的,一般保证调度的公平,但FIFO就不能保证了。

10、考虑一个由6个线程{T_1, T_2, … T_6}组成的系统,其中用于线程控制的唯一的机制是信号量。线程要求按照如下优先关系执行:

T_1 结束了它的主代码段后,T_2才能开始执行;

T_1 或T_3 结束了它的主代码段后,T_5才能开始执行;

T_1 和T_3 都结束了主代码段的执行后,T_4才能开始执行;

T_6 能执行当且仅当T_4 还没有结束它的主代码段的执行(也就是说,如果T_4在T_6 得以开始在CPU上运行之前就结束了,那么T_6必须永远阻塞下去)。

假设主代码段的功能是输出线程号,例如对于T_1来说,输出ONE。在每个线程的主代码段的前后填写一组信号量操作,从而保证不破坏上面提到的优先关系。另外,给出每个信号量的全局声明和初值。要想得高分,你的解决方案需要保持以上列出的所有的优先关系,使用尽可能少的信号量,并且不增加不必要的同步。

参考答案

Semaphore m1=0,m2=0,m3=-1,m4=1;

T1()

{

main();

V(m1);

V(m2);

V(m3);

}

T2()

{

P(m1);

main();

}

T3()

{

main();

V(m2);

V(m3); //?需不需要

}

T4()

{

P(m3);

main();

P(m4); //当T4执行结束,将信号量m4资源用掉,则T6永远阻塞在该信号量上

}

T5()

{

P(m2);

main();

}

T6()

{

P(m4);

V(m4);

main();

}

总结:第10题主要采用了V操作的唤醒机制,即当一个进程要在另一进程之后执行,则由

另一进程执行V操作来唤醒该进程,使该操作能顺利申请到信号量

经典问题

11、睡眠理发师问题//找人详细讨论一下!!!

理发店里有一位理发师,一把理发椅和N把供等候理发的顾客坐的椅子。如果没有顾客,则理发师便在理发椅上睡觉。当一个顾客到来时,他必须先唤醒理发师;如果顾客到来时理发师正在理发,则如果有空椅子,可坐下来等;否则离开。试用P、V操作解决睡眠理发师问题。

解答:

int waiting=0 ;//等候理发的顾客数

int chairs=n;//为顾客准备的椅子数

semaphore customers=0, barbers=0,mutex=1;

barber()

{

while(TRUE) //理完一人,还有顾客吗?

{

P(cutomers); //若无顾客,理发师睡眠

P(mutex); //进程互斥

waiting := waiting – 1; //等候顾客数少一个

V(barbers); //理发师去为一个顾客理发如果是放在mutex外面会如何呢?

V(mutex); //开放临界区

cut-hair( ); //正在理发

}

}

customer()

{

P(mutex); //进程互斥

if (waiting < chairs)

{

waiting := waiting+1; // 等候顾客数加1

V(customers); //必要的话唤醒理发师

V(mutex); //开放临界区临界区是如何划分的?

P(barbers); //无理发师, 顾客坐着养神

get-haircut( ); //一个顾客坐下等理

}

else

V(mutex); //人满了,走吧

}

另一种解法:

顾客:

P(mutex);

if count = N {exit};

count = count + 1;

if (count > 1)

{ V(mutex);

P(waiting); }

else V(mutex);

V(barber);

理发;

P(mutex);

count = count – 1;

if (count>0) { V(waiting);}

V(mutex);

理发师:

while (true) {

P(barber);

理发;

}

12、推广的消息缓冲问题

消息缓冲区为k个,有m个发送进程,n个接收进程,每个接收进程对发送来的消息都必须取一次。试用P、V操作解决发送进程和接受进程之间的正确通信问题。

解答:

mutex_buffer[k];//同步:读完再写;互斥:只有一个Sender使用某个buffer。初始化为1。buffer[k];//缓冲区。初始化为1

count[k];//未读数目。初始化为0。

mutex_read[k][n];//同步:先写后读。初始化为0。

next;//下一个写缓冲区。初始化为0

mutex_next;//互斥:只有一个Sender使用next。初始化为1。

Sender()

{

while(have_message)

{

P(mutex_next); //每次只有一个sender可以申请发送有什么区别?

cur=next;

next=(next+1)%k; //next的值发生了改变

V(mutex_next);

P(mutex_buffer[cur]); //申请想buffer[cur]中写

write(buffer[cur]);

for(i=0;i

count[cur]=n;

}

}

Receiver()

{

id=myID();

for(i=0;1;i=(i+1)%k)

{

P(mutex_read[i][id]);

read(buffer[i]);

count[i]--;

if(count[i]==0) V(mutex_buffer[i]);

}

}

13、第二类读者写者问题(写者优先)

试用信号量及P、V操作解决写者优先问题,要求:

a. 多个读者可以同时进行读;

b. 写者必须互斥(只允许一个写者写,也不能读者写者同时进行);

c. 写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)。

解答:

Semaphore mutex1=1, mutex2=1, mutex3=1, read=1, write=1;

void reader()

{

P(mutex3);//保证最多有一个读者等在read上,避免等待在read上的写者与多个读者竞争P(read); //?外面两层主要是干嘛用的

P(mutex1); //mutex1主要用于对于readcount的访问

readcount++;

if (readcount==1)

P(write); //阻塞写者,或者已经有写者,则自己被阻塞

V(mutex1);

V(read);

V(mutex3);

reading;

P(mutex1);

readcount--;

if (readcount==0)

V(write);

V(mutex1);

}

void writer()

{

P(mutex2);

writecount++;

if (writecount==1)

P(read);

V(mutex2);

P(write);

writing;

V(write);

P(mutex2);

writecount--;

if (writecount==0)

V(read);

V(mutex2);

}

14、有一个系统,定义P、V操作如下:

P(s):

s.count --;

if s<0 then

将本进程插入相应队列末尾等待;

V(s):

s.count ++;

if s<=0 then

从相应等待队列队尾唤醒一个进程,将其插入就绪队列;

回答问题:

a. 这样定义P、V操作是否有问题?

b. 用这样的P、V操作实现N个进程竞争使用某一共享变量的互斥机制。

c. 对于b的解法,有无效率更高的方法。如有,试问降低了多少复杂性?

a.后进先出的等待队列,可能引起饥饿

b.定义Semaphore m[N-1],m[1]=N-1, m[2]=N-2,…,m[N-1]=1,然后进程依次P从m[1]到m[N-1],V的时候顺序相反,这样使每个信号量上最多只等待一个进程,进程访问共享变量的顺序就与进程等待的顺序一致,先到先得,从而可以避免饥饿。

第二部分

2、

其实现的代价很高。每次在某些等待变化的进程的条件中出现的任何变量,runtime系统都必须重新计算该条件,以判断该进程是否能够被解锁。而对于Hoare和Brinch Hansen管程,则只需signal原语即可唤醒进程(第二版答案2-28)

3、

需要互斥的几个进程在进入临界区之前receive同一个进程,该进程在一次访问临界资源的过程之前只send一个msg,这样就可以保证互斥操作。

4、

用receive模拟P操作,用send模拟V操作。

机制习题解答(DOC)

第1章习题及解答略 第2&6章习题及解答 1.判断正误 (1)凡频谱是离散的信号必然是周期信号。( ×)准周期信号 (2)任何周期信号都由频率不同,但成整倍数比的离散的谐波叠加而成。( ×) (3)周期信号的频谱是离散的,非周期信号的频谱也是离散的。( ×) (4)周期单位脉冲序列的频谱仍为周期单位脉冲序列。( √) (5)非周期变化的信号就是随机信号。( ×)准周期信号 (6)非周期信号的幅值谱表示的是其幅值谱密度与时间的函数关系。( ×) (7)信号在时域上波形有所变化,必然引起频谱的相应变化。( ×) (8)各态历经随机过程是平稳随机过程。( √) (9)平稳随机过程的时间平均统计特征等于该过程的集合平均统计特征。( √) (10)非周期信号的频谱都是连续的。( ×) 准周期信号 (11)单位脉冲信号的频谱是无限带宽谱(√) (12)直流信号的频谱是冲击谱(√) 2.选择正确答案填空 (1)描述周期信号的数学工具是(B )。 A.相关函数 B. 傅里叶级数 C. 拉普拉斯变换 D. 傅里叶变换 (2)描述非周期信号的数学工具是( C)。 A.三角函数 B. 拉普拉斯变换 C. 傅里叶变换 D. 傅里叶级数

(3) 将时域信号进行时移,则频域信号将会( D ) A.扩展 B. 压缩 C. 不变 D. 仅有相移 (4) 瞬变信号的傅里叶变换的模的平方的意义为( C ) A.信号的一个频率分量的能量 B. 在f 处的微笑频宽内,频率分量的能量与频宽之比 C. 在f 处单位频宽中所具有的功率 (5) 概率密度函数是在(C )域,相关函数是在(A )域,功率谱密度函数是 在( D )域描述随机信号。 A.时间 B. 空间 C. 幅值 D. 频率 (6) 白噪声信号的自相关函数是(C ) A.相关函数 B. 奇函数 C. 偶函数 D. 不存在 6.4已知被测模拟量最大输出幅值为±5V ,要求AD 转换输出最大误差不大于5mv ,应选用多少位的AD 转换器? 解:量化误差5mv=±0.5LSB=125*5.012* 5.0-±=-±n n V FS 解得n=9 6.6 模拟信号DFT ,请问采样时间间隔Δt 、采样点数N 、频率分辨率Δf 三者之间的关系?并回答如下问题: (1) 为什么采样频率Δf 必须至少为被分析信号中最高频率成分的2倍才能避免混淆? (2) 当采样频率确定后,频谱中应该出现的最高频率是多少? (3) 频谱中的谱线根数是否与时域中的采样点数相同?对于频谱分析来说有用的谱线根数是多少?

信号量,中断和时间

第6章信号量,中断和时间 信号量(Signal)是进程间通讯(IPC)的一种形式——是一个进程给另一个进程发送信息的方法。但是信息不可能很多——一个信号量不可能携带详细的信息,即使是传送者的身份也不能被传递;唯一能够确定的事实是信号量的确被发送了。(然而和经典信号量不同,POSIX实时信号量允许传送稍微多一点的信息。)实际上,信号量对于双向通讯是没有用处的。还有,根据某些限定,信号量的接受者不必以任何方式作出响应,甚至可以直接忽略大部分信号量。 虽然有这么多的限制,然而信号量仍然是一种功能强大的十分有用的机制——勿庸置疑,这是Unix IPC中使用最频繁的机制。每当进程退出或者废弃一个空指针时,每当使用Ctrl+C键终止程序运行时,都要传递信号量。 第9章会更详细的讨论IPC机制。对于本章的讨论来说,信号量的内容就足够讨论了。 正如在Linux内核本身的代码注释中所说明的一样,中断(Interrupt)对于内核来说和信号量是类似的。中断一般都是从磁盘之类的硬件设备送往内核,用以提示内核该设备需要加以注意。一个重要的硬件中断源就是定时器设备,它周期性地通知内核已经通过的时间。如同第5章中阐述的一样,中断也可以由用户进程通过软件产生。 在本章中,我们首先讨论一下Linux中信号量和中断的实现,最后再浏览一下Linux的时间处理方式。 虽然内核对代码的要求标准非常严格,本章所涉及的代码仍然特别清晰明白。本章使用的一般方法是首先介绍相关的数据结构和它们之间的关系,接下来讨论操纵和查询它们的函数。 锁的概述 锁的基本思想是限制对共享资源的访问——共享资源包括共享的文件,共享的内存片,以及在一次只能由一个CPU执行的代码段。概括的说,在单处理器上运行的Linux内核并不需要锁,这是因为在编写Linux内核时就已经注意到要尽量避免各种可能需要锁的情况了。但是,在多处理器机器上,一个处理器有时需要防止其它处理器对它的有害的介入。 include/asm-i386/spinlock.h文件(从12582行开始)并不使用难看的#ifdef把所有对锁函数的调用封装起来,它包含一系列对单处理器平台(UP)基本为空的宏,然而在多处理器平台(SMP)上这些宏将展开成为实际代码。因而内核的其它代码对UP和SMP(当涉及到这种特性时)都是相同的,但是它们两个的效果却是迥然不同的。 第10章中涉及SMP的部分会对锁做深入的介绍。但是,由于你在代码中将到处都能够看到对锁宏的调用,特别是在本章所讨论到的代码中这一点尤为明显,所以你应该首先对宏的用途有初步了解——以及为什么现在在大多数情况下我们都可以安全地将其忽略(我们将在讨论的过程中对其中的异常情况进行说明)。 信号量 Linux内核将信号量分为两类: 非实时的(Nonrealtime)——大部分是些传统的信号量,例如SIGSEGV,SIGHUP

1-4章 习题

高回扣习题 第一章习题 一、单选题 (1)当CPU执行操作系统代码时,称处理机处于( )。 A.执行态 B.目态 C.管态 D.就绪态 (2)在下列性质中,( )不是分时系统的特征。 A.多路性 B.交互性 C.独立性 D.成批性 (3)下列仅一条指令( )只能在管态下执行。 A.读取时钟指令 B.访管指令 C.屏蔽中断指令 D.取数指令 二、填空题 (1) 在计算机系统中配置操作系统的主要目的是协助和管理计算机的硬件和软件资源,操作系统的主要功能是管理计算机系统中的硬件和资源,其中包括处理机管理、存储器管理,以及设备管理和文件管理,这里的处理机管理主要是对进程进行管理。 (2) 利用缓冲区能有效地缓和CPU 和I/O设备之间速度不匹配的矛盾,虚拟设备的功能是使一个物理实体变成能被多个进程同时使用的逻辑上的对应物。 第二章习题 一、填空题 (1)对于一个可执行程序文件,该程序与执行它的进程是一对多的关系。 (2)在单CPU系统中实现并发技术后。 A.进程在一个时间段内并行执行,CPU与外设并行工作。 B.进程在一个时刻并行执行,CPU与外设并行工作。 C.进程在一个时间段内并行执行,CPU与外设串行工作。 D.进程在一个时刻并行执行,CPU与外设串行工作。 (3)从静态角度上看,进程是由PCB、程序段,数据段三部分组成。 (4)正在执行的进程由于用完其时间片而被暂停执行,此时进程应从执行状态变成为就绪状态。

(5)引入进程,可带来资源利用率的提高和系统吞吐量的增加的好处,但却增加了系统的空间和时间开销。 (6)临界区是指进程中用于访问临界资源的那段代码。 (7) ①控制变量是一种只能由P和V操作所改变的整型变量,①可用于实现进程的②互斥和③同步。互斥是指排他性地访问临界资源。 ①:A.控制变量B.锁 C.整型信号量 D.记录型信号量 ②,③:A.同步 B.通信 C.调度 D.互斥 (8)设有6个进程共享同一互斥段,若最多允许有3个进程进入互斥段,则所采用的互斥信号量的初值为 3 。 (9)有3个进程共享同一程序段,而每次最多允许两个进程进入该程序段,若用P、V操作作同步机制,则记录型信号量S的取值范围为2,1,0 ,-1。 (10)为实现消息缓冲通信,在PCB中应增加消息队列首指针、消息队列互斥信号量和消息队列资源信号量三个数据项。 (11)若记录型信号量S的初值为2,当前值为-1,则表示有 B 等待进程。 A.0个 B.1个 C.2个 D.3个 (12)当 B 时,进程从执行状态转变为就绪状态。 A.进程被调度程序选中 B.有高优先级进程到来 C.等待某一事件 D.等待的事件发生 (13)在进程转换时,下列 D 转换是不可能发生的。 A.就绪态→执行态 B.执行态→就绪态 C.执行态→阻塞态 D.阻塞态→执行态 (14)下列各项工作步骤中, B 不是创建进程所必须的步骤。 A.建立一个PCB B.阻塞进程 C.为进程分配内存等必要资源 D.将PCB连接入进程就绪队列 (15)在操作系统中,死锁出现指的是 C 。 A.计算机发生了重大故障 B.资源数远远少于进程数 C.若干进程因竞争资源而无限等待其他进程释放已占有的资源

1互斥信号量:

1.互斥信号量: 互斥互斥,意思就是我用了你就不能用,你用了我就不能用。永远都只有一个人独占这个东西~!举个例子:比如说打印机。 我任务1现在让他打印《静夜思》,那么在我还没打印完之前,别的任务就不能命令打印机去打印别的东西。否则如果任务2让他打印《春晓》,那最后打印出来的会是什么~????反正肯定不是任务1想要的,肯定也不是任务2想要的。 上面讲的比较通俗。打印机就是共享资源,谁都可以访问他~!但是同一时间,肯定要保证只有1个任务再操作打印机。那样才能得到大家想要的结果。也就是要独占共享资源的访问权~! ucos2中通过互斥信号量来解决这个问题。简单说就是任务1开始访问打印机的时候,先去查询这个互斥信号量是否有效,有效,说明没人在访问打印机,这时任务1就把这个互斥信号量置无效,然后开始操作打印机。这样,每个任务再操作打印机前都要去查询这个互斥信号量时候有效。无效就等,等到有效才可以访问,或者等到不耐烦了(术语叫等待超时)就不等了~!任务一直到用完了打印机后才把信号量置有效,这时其他任务才有可能去访问,操作打印机。 这里又有一个问题:再任务1操作打印机器件,可能有多个任务申请打印机的所有权。那么再任务1结束后,我应该给谁用呢~~??也许我们马上就反应过来了~废话~!!当然是排队了~~谁先到的谁用啊~~~。没错,这是一种机制,谁最先等待共享资源,就给谁用。但是~!再ucos里面2.52版本还不支持这种方式。他用的另外一种方法!如果你和你BOSS都再等着用打印机,你先到的,这个时候任务1结束了对打印机的操作。你说你敢先用么~???(除非你第二天不想干了~~)你肯定先让老板先用,这就是ucos的实现方式,基于优先级,任务1结束对打印机的操作后,ucos再等待队列中看那个等待任务优先级最高,就先给他用~!即使他是最晚才等待的~!!(这就是BOSS的威力~!) 关于事件等待列表,有兴趣的可以去看看事件控制块ECB的内容,不在本文讨论。当然,ucos中的互斥信号量还有许多要素,比如说他的继承优先级之类的。本文旨在说明它是干嘛用的,至于其他请参考相关书籍。 下面的图解释了互斥信号量的基本用法:(简单的两个任务,没有包含多任务等待的情况)

操作系统信号量PV操作题若干

(一)图书馆有100个座位,每位进入图书馆的读者要在登记表上登记,退出时要在登记表上注销。要几个程序?有多少个进程?(答:一个程序;为每个读者设一个进程) (1)当图书馆中没有座位时,后到的读者在图书馆为等待(阻塞) (2)当图书馆中没有座位时,后到的读者不等待,立即回家。 设信号量S=200;MUTEX=1; P(S) P(MUTEX) 登记 V(MUTEX) 阅读 P(MUTEX) 注销 V(MUTEX) V(S) (2) 设信号量MUTEX=1; 整型变量S=200; P(MUTEX) IF(S==0) { V(MUTEX) RETURN } ELSE{ COUNT=COUNT-1; 登记 V(MUTEX) 阅读 P(MUTEX) COUNT=COUNT+1; 注销 V(MUTEX) RETURN }

解(1 ) 设信号量:S=100; MUTEX=1 P(S) P(MUTEX) 登记 V(MUTEX) 阅读 P(MUTEX) 注销 V(MUTEX) V(S) 解(2) 设整型变量COUNT=100; 信号量:MUTEX=1; P(MUTEX); IF (COUNT==0) { V(MUTEX); RETURN; } COUNT=COUNT-1; 登记 V(MUTEX); 阅读 P(MUTEX); COUNT=COUNT+1; V(MUTEX); RETURN;

(二)有一座东西方向的独木桥;用P,V操作实现: (1)每次只允许一个人过桥; (2)当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待。(3)当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向,只允许一个人单独过桥。(此问题和读者与写者问题相同,东向西的为读者,西向东的为写者)。 (1) 设信号量S=1 P(S) 过桥 V(S) (2) 设信号量S=1 EW=1;(东向西互斥计数量) WE=1;(西向东互斥计数量) 整型变量 CE =0;(东向西桥上人数) CW=0;(西向东桥上人数) 东向西: P(EW) IF(CE==0) { P(S) } CE++; V(EW) 过桥 P(EW) CD--; IF(CD==0){ V(S) } V(EW)

Linux之信号量,比较全面,个人总结。

信号量 一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。 信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。 二.信号量的分类 在学习信号量之前,我们必须先知道——Linux提供两种信号量: POSIX信号量又分为有名信号量和无名信号量。 有名信号量,其值保存在文件中, 所以它可以用于线程也可以用于进程间的同步。无名信号量,其值保存在内存中。 倘若对信号量没有以上的全面认识的话,你就会很快发现自己在信号量的森林里迷失了方向。 三.内核信号量 1.内核信号量的构成 内核信号量类似于自旋锁,因为当锁关闭着时,它不允许内核控制路径继续进行。然而,当内核控制路径试图获取内核信号量锁保护的忙资源时,相应的进程就被挂起。只有在资源被释放时,进程才再次变为可运行。 只有可以睡眠的函数才能获取内核信号量;中断处理程序和可延迟函数都不能使用内核信号量。

count:相当于信号量的值,大于0,资源空闲;等于0,资源忙,但没有进程等待这个保护的资源;小于0,资源不可用,并至少有一个进程等待资源。 wait:存放等待队列链表的地址,当前等待资源的所有睡眠进程都会放在这个链表中。 sleepers:存放一个标志,表示是否有一些进程在信号量上睡眠。 2.内核信号量中的等待队列(删除,没有联系) 上面已经提到了内核信号量使用了等待队列wait_queue来实现阻塞操作。 当某任务由于没有某种条件没有得到满足时,它就被挂到等待队列中睡眠。当条件得到满足时,该任务就被移出等待队列,此时并不意味着该任务就被马上执行,因为它又被移进工作队列中等待CPU资源,在适当的时机被调度。 内核信号量是在内部使用等待队列的,也就是说该等待队列对用户是隐藏的,无须用户干涉。由用户真正使用的等待队列我们将在另外的篇章进行详解。 3.内核信号量的相关函数 (2)申请内核信号量所保护的资源: 4.内核信号量的使用例程 在驱动程序中,当多个线程同时访问相同的资源时(驱动中的全局变量时一种典型的共享资源),可能会引发“竞态“,因此我们必须对共享资源进行并发控制。Linux内核中解决并发控制的最常用方法是自旋锁与信号量(绝大多数时候作为互斥锁使用)。

操作系统第二章练习 答案

1.P、V 操作是 A 。
A.两条低级进程通信原语
B.两组不同的机器指令
C.两条系统调用命令
D.两条高级进程通信原语
2.设系统中有 n(n>2)个进程,且当前不在执行进程调度程序,试考虑下述4
种情况,
不可能发生的情况是 A 。
A.没有运行进程,有2个就绪进程,n 个进程处于等待状态。
B.有1个运行进程,没有就绪进程,n-1个进程处于等待状态。
C.有1个运行进程,有1个就绪进程,n-2个进程处理等待状态。
D.有1个运行进程,n-1个就绪进程,没有进程处于等待状态。
3.若 P、V 操作的信号量 S 初值为2,当前值为-1,则表示有 B 等待进程。
A. 0个
B. 1个
C. 2个
D. 3个
4.用 V 操作唤醒一个等待进程时,被唤醒进程的状态变为 B 。
A.等待
B.就绪
C.运行
D.完成
5.用 P、V 操作可以解决 A 互斥问题。
A.一切
B.某些
C.正确
D.错误
6.多道程序环境下,操作系统分配资源以 C 为基本单位。
A.程序
B.指令
C.进程
D.作业
7.从下面对临界区的论述中,选出一条正确的论述。
(1)临界区是指进程中用于实现进程互斥的那段代码。
(2)临界区是指进程中用于实现进程同步的那段代码。
(3)临界区是指进程中用于实现进程通信的那段代码。
(4)临界区是指进程中用于访问共享资源的那段代码。
(5)临界区是指进程中访问临界资源的那段代码。
8.(A)是一种只能由 wait 和 signal 操作所改变的整型变量,(A)可用于实现
进程的(B)和(C),(B)是排他性访问临界资源。
A:(1)控制变量;(2)锁;(3)整型信号量;(4)记录型信号量。
B:(1)同步;(2)通信;(3)调度;(4)互斥。
C:(1)同步;(2)通信;(3)调度;(4)互斥。
9.对于记录型信号量,在执行一次 wait 操作时,信号量的值应当(A),当其值
为(B)时,进程阻塞。在执行 signal 操作时,信号量的值应当为(C),当其
值为(D)时,应唤醒阻塞队列中的进程。
A:(1)不变;(2)加1;(3)减1;(4)加指定数值;(5)减指定数值。
B:(1)大于0;(2)小于0;(3)大于等于0;(4)小于等于0.
C:(1)不变;(2)加1;(3)减1;(4)加指定数值;(5)减指定数值。
D:(1)大于0;(2)小于0;(3)大于等于0;(4)小于等于0.
10.用信号量 S 实现对系统中4台打印机的互斥使用,S.value 的初值应设置为
(A),若 S.value 的初值为-1,则表示 S.L 队列中有(B)个等待进程。
A:(1)1;(2)0;(3)-1;(4)4;(5)-4
B:(1)1;(2)2;(3)3;(4)4;(5)5;(6)6;(7)0。
11.试选择(A)~(D),以便能正确地描述图2.12所示的前趋关系。
最新范本,供参考!

实验八 uCOS-II的互斥信号量

实验八uCOS的互斥信号量 一:实验目的: 1.理解互斥型信号量。 2.学会使用互斥型信号量实现对共享资源的独占式处理。 3.解决任务在使用独占式资源出现的优先级反转问题。 二:实验内容: 完成教材5-7实验,使用互斥型信号量实现对共享资源的独占式处理。实验中要求要创建互斥型信号量,请求互斥型信号量,发送互斥型信号量,删除互斥型信号量。 三:程序代码: #include "includes.h" #define TASK_STK_SIZE 512 OS_STK StartTaskStk[TASK_STK_SIZE]; OS_STK MyTaskStk[TASK_STK_SIZE]; OS_STK YouTaskStk[TASK_STK_SIZE]; OS_STK HerTaskStk[TASK_STK_SIZE]; INT16S key; char *s1="MyTask running--yangkun"; char *s2="YouTask running--yangkun"; char *s3="HerTask running--yangkun"; char *s4="MyTask pend_Semp"; char *s5="HerTask pend_Semp"; INT8U err; INT8U y=0; INT32U Times=0; OS_EVENT *Semp; void StartTask(void *pdata); void MyTask(void *pdata); void YouTask(void *pdata); void HerTask(void *pdata); void main (void) { OSInit();

操作系统-进程同步-信号量练习题

1【单选题】用P、V操作管理临界区时,互斥信号量的初值应定义为( A)。 ?A,1 ?B,0 ?C,-1 ?D,任意值 2【单选题】在操作系统中,对信号量S的P原语操作定义中,使进程进入相应等待队列等待的条件是( )。 ?A,S>0 ?B,S = 0 ?C,S<0 ?D,S<>0 我的答案:C 3【单选题】信号量S的初值为8,在S上执行了10次wait 操作,6次signal操作后,S的值为(D )。 ?A,10 ?B,8 ?C,6 ?D,4 P操作每执行一次,信号量减1;V操作每执行一次,信号量加1.所以答案为8-10+6 = 4

4【单选题】用V操作唤醒一个等待进程时,被唤醒进程的状态应变成( B)状态。 ?A,执行 ?B,就绪 ?C,阻塞 ?D,挂起 被唤醒的进程由等待状态变为就绪状态。 5【单选题】利用Wait和signal操作可以( )。 ?A,实现进程互斥和同步 ?B,检测死锁 ?C,解除死锁 ?D,防止死锁 我的答案:A 6【单选题】两个并发进程,设互斥信号量mutex(初值为1),若信号量=0;则(B ) ?A,表示没有进程进入临界区 ?B,表示有一个进程进入临界区 ?C,表示有一个进程进入临界区,另一个进程等待进入 ?D,表示两个进程进入临界区 临界区不允许两个进程同时进入,D选项明显错误。mutex初值为1,表示允许一个进程进入临界区,当有一个进程进入临界区且没有进程等待进入时,mutex值减1,变为0。

7【单选题】V操作是对信号量执行加1操作,意味着释放一个单位资源,加1后如果信号量的值等于零,则从等待队列中唤醒一个进程,现进程变为等待状态,否则现进程继续进行。?A,对 ?B,错 我的答案:B 8【单选题】有3个进程,两台打印机,用wait和sigual操作来实现互斥访问打印机,则信号量S的取值范围是( ) ?A,2,1,0,-1 ?B,3,2,1,0 ?C,2,1,0,-1,-2 ?D,1,0,-1,-2 我的答案:如果n个进程共享两个打印机,信号量取值范围:-(n-2)~2; 9【单选题】设与某资源相关的资源信号量K,初值为3,当前值为1,则可用资源个数为( ),等待资源的进程数为( )。 ?A,0,1 ?B,1,0 ?C,1,2 ?D,2,0 我的答案:B

操作系统期末复习题

一、填空题(每空1分,共10分)得分:分1.计算机操作系统是方便用户、管理和控制计算机的系统软件。 2.采用多道程序设计技术能充分发挥与外围设备并行工作的能力。3.程序的执行事现代操作系统的基本特征之一。 4.避免死锁的一个著名的算法时。 5.将程序中的逻辑地址转换为物理地址,这种地址转换工作称为。6.一个号的页面调度算法应该避免和减少现象的发生。 7.文件系统为每个文件另建立一张指示逻辑记录和物理块之间的对应表,有此表和文件本身构成的文件是。 8.UNIX文件系统对空闲磁盘空间的管理方法是。 9.在设备管理中,为了克服独占设备速度较慢、降低设备资源利用率的缺点,引入了___ ___,即用共享设备模拟独占设备。 10.常用的I/O控制方式有:程序直接控制方式、中断方式、和通道方式。 二、单项选择题(每小题1分,共10分)得分:分1.操作系统是一种()。 A.应用软件 B.系统软件 C.通用软件 D.工具软件 2.在分时系统中,时间片一定,(),响应时间越长。 A.内存越多 B.用户数越少 C.用户数越多 D.后备队列 3.进程和程序的本质区别是()。 A.存储在内存和外存 B.顺序和非顺序执行机器指令C.分时使用和独占使用计算机资源 D.动态和静态特征 4.在一段时间内,只允许一个进程访问的资源称为()。 A.共享资源 B.共享区 C.临界资源 D.临界区 5.系统调用的目的是( ) .

A.请求系统服务 B.终止系统服务 C.申请系统资源 D.释放系统资源 6.现有三个同时到达的作业J1、J2和J3,它们的执行时间分别是T1、T2和T3,且 T1

回波损耗的定义与标准中参数规定的理解

在电线电缆2003-2中<对称数字通信电缆结构回波损耗影响因素分析>中提到:当高频信号在电缆及通信设备中传输时,遇到波阻抗不均匀点时,就会对信号形成反射,这种反射不但导致信号的传输损耗增大,并且会使传输信号畸变,对传输性能影响很大。这种由信号反射引起的衰减被称为回波损耗。那么这样理解回波损耗应该是衰减的一部分,那为什么标准中规定回波损耗要大于某个值呢,而且我们努力的都是如何提高回波损耗. 所以我想问回波损耗的定义和性质到底是什么?是理解为反射波引起的损耗,还是反射波的损耗呢?似乎怎么理解的都有,希望大家积极讨论,理清概念. 回波损耗(RETURN LOSS) 回波损耗是电缆链路由于阻抗不匹配所产生的反射,是一对线自身的反射。不匹配主要发生在连接器的地方,但也可能发生于电缆中特性阻抗发生变化的地方,所以施工的质量是减少回波损耗的关键。回波损耗将引入信号的波动,返回的信号将被双工的千兆网误认为是收到的信号而产生混乱。 对于通讯信号分为有用和有害信号,对于有用信号,是衰减得越少越好,比如测试中常见的衰减参数,那是数值越小越好. 但是对于有害信号,比如回波,串音,就需要衰减得越大越好.

如果结构和阻抗稳定合理,则回波会很小,即使有也由于线缆阻抗在长度上比较平滑,不容易叠加而很快被衰减.所以好的线,对回波的衰减大. 比较好理解的是串音,比如NEXT,全称是:近端串音衰减(或近端串音损耗),这个数值也是越大越好. 它是这样测试的:用网络分析仪测量,一个输入信号加在主干扰线对上,同时在近端的被干扰线对输出端测量串音信号. 测得值当然是越小越好,越小就说明串音被线缆结构(比如屏蔽)衰减得越多. 对于NEXT,有人说是近端串音,口头说说可以,但是容易造成误解,因为串音当然是越小越好,怎么要求测量数值越大约好呢,其实后面少了两个字:衰减. 串音衰减定义:用以表示能量从主串回路串入被串回路时的衰减程度。即串音的衰减. 可以理解为串音这种干扰信号的衰减程度,也就是串音衰减越大串音衰减的越多.但回波损耗的定义为由信号反射引起的衰减被称为回波损耗。也就是回波造成的损耗.他们的名词结构是不一致的,这个我也考虑过.从定义到标准中的解释,都可以说回波损耗是一种干扰和衰减,可为什么还要增大这个参数的数值呢? 当高频信号在电缆及通信设备中传输时,遇到波阻抗不均匀点时,就会对信号形成反射,这种反射不但导致信号的传输损耗增大,并且会使传输信号畸变,对传输性能影响很大。这种由信号反射引起的衰减被称为回波损耗。 我也来说说我对回路损失的理解吧!

操作系统习题与解析

第二章进程的描述与控制 【例1】判断题:并发是并行的不同表述,其原理相同。() 答案×。分析并发是指多道程序的执行在时间上是重叠的,一个程序的执行尚未结束,另一个程序的执行已经开始。但对单CPU系统而言,每一时刻只有一个程序在CPU上运行(有可能此时其他的程序在进行输入、输出)。也就是说,占有CPU的只能有一个程序。因此,并发实际上是“在宏观上并行执行,在微观上串行执行”。而并行是真正意义上的并行执行,因此两者的含义是不同的。 【例2】在操作系统中引入“进程”概念的主要目的是()。 A.改善用户编程环境B.提高程序的运行速度 B.C.描述程序动态执行过程的性质D.使程序与计算过程一一对应 答案C 分析操作系统中多道程序的引入,使得它们在并发执行时共享系统资源,共同决定这些资源的状态,因此系统中各道程序在执行过程中就出现了相互制约的新关系,程序的执行出现“走走停停”的新状态。这些都是在程序的动态过程中发生的。而程序本身是机器能够翻译或执行的一组动作或指令,它或者写在纸面上,或者存放在磁盘等介质上,是静止的。很显然,直接从程序的字面上无法看出它什么时候运行、什么时候停顿,也看不出它是否影响其它程序或者一定受其它程序的影响。因此,用程序这个静态概念已不能如实反映程序并发执行过程中的这些特征。为此,人们引入进程的概念来描述程序动态执行过程的性质,这是引入“进程”概念的主要目的。 【例3】下列进程状态的转换中,不正确的是()。 A.就绪 阻塞B.运行 就绪 C.就绪 运行D.阻塞 就绪 答案A 分析回答这道题要知道进程的3种基本状态,以及它们之间的转换关系。通过下图可以看到,凡是图中有箭头指向的转换都是可行的,而没有箭头指向的则不可能。因此A 是不正确的。 如果有的同学记不住这张图,那就从理解的角度进行思考。首先要理解3种状态的含义,然后再理解它们之间的转换。例如:运行的进程能变成就绪吗?可以,如果运行进程的时间片到了,就必修让出CPU,转换为就绪态。就绪的进程能变成阻塞吗?不可以,就绪态的进程已经具备了运行条件,只在等待CPU,怎么可能还退回到还不具备运行条件的阻塞态呢?因此,如果理解了,这张图就可以自己画出来,并不需要死记硬背。 【例4】进程控制块是描述进程状态和特性的数据结构,一个进程()。 A.可以有多个进程控制块B.可以和其他进程共用一个进程控制块

基于Linux的信号量通信机制研究与实现

系统软件与软件工程本栏目责任编辑:谢媛媛Computer Knowledge and Technology 电脑知识与技术第6卷第12期(2010年4月)基于Linux 的信号量通信机制研究与实现 袁玉锦,周群 (邯郸学院网络中心,河北邯郸056005) 摘要:该文以信号量通信理论为基础,通过对Linux 信号量相关系统调用的分析,着重讨论了内核级和用户级的信号量通信、同一进程内线程之间的通信、多用户的进程间的通信等问题,并采用ANSI C 编写了信号量通信的具体实例。 关键词:信号量;Linux ;多进程通信;线程通信 中图分类号:TP316文献标识码:A 文章编号:1009-3044(2010)12-3279-03 1信号量通信理论 操作系统原理中利用信号量来解决多进程互斥访问临界资源的问题,还可来描述多进程之间的前趋关系,即同步问题。 信号量的概念由荷兰学者E.W.Dijkstra 于1965年提出。信号量实际是一个整数,进程(也可以是线程)在信号量上的操作分2种,一种称为P 操作,另一种称为V 操作。P 操作是让信号量的值减1,V 操作是让信号量的值加1。在进行实际的操作之前,进程首先检查信号量的当前值,如果当前值大于0,则可以执行P 操作,否则进程休眠,等待其他进程在该信号量上的V 操作,因为其他进程的V 操作将让信号量的值增加,从而它的P 操作可以成功完成。某信号量在经过某个进程的成功操作之后,其他休眠在该信号量上的进程就有可能成功完成自己的操作,这时系统负责检查休眠进程是否可以完成自己的操作。 在操作系统中,信号量最简单的形式也是最初被提出时定义的形式是一个整数,多个进程可检查并设置信号量的值。这种检查并设置(Test-and-Set)操作是不可中断的,也称为“原子”操作。检查并设置操作的结果是信号量的当前值和设置值相加的结果,该设置值可以是正值,也可以是负值。根据检查并设置操作的结果,进行操作的进程可能会进入休眠状态,而当其他进程完成自己的检查并设置操作后,由系统检查前一个休眠进程是否可以在新信号量值的条件下完成相应的检查并设置操作。这样,通过信号量,就可以协调多个进程的操作,实现多进程之间通信。 操作系统原理中通常把信号、信号量通信称为低级通信,而把管道、消息队列、共享存储区通信称为高级通信。信号量分为有名、无名两种,进程间通信用有名信号量,同一进程内部通信一般用无名信号量。 2Linux 中的信号量 从意义和实现机理上,Unix System V 或Linux 的信号量与以上所述的常规信号量没有什么区别,但System V 提供的信号量机制要复杂得多,并且分为两种不同系统调用类型:一种是用内核级的信号量,有关系统调用在/usr/include/semaphore.h 中包含,一般可用于内核级的进程通信和内核级的线程通信;另一种是用户级信号量,有关系统调用在/usr/include/sys/sem.h 中包含,一般可用于多用户进程之间通信。 2.1内核级的信号量相关系统调用 int sem_init (sem_t *sem ,int pshared ,unsigned int value) 作用:为单个信号量设置初值,第一参数*sem 为指定的信号量对象;第二参数pshared 为共享标志,如值为0表示私有信号量,非0表示可以与其他进程共享的信号量;第三参数value 为要为信号量设置的初值。 相关数据结构如下: struct{struct{long int status ; int spin_lock ;}sem_lock ; int sem_value ; pthread_descr sem_waiting ; }sem_t int sem_wait (sem_t *sem); 作用:对指定的信号量进行P 操作。 Int sem_post (sem_t *sem); 作用:对指定的信号量进行V 操作。 总结:以上是内核级信号量通信常用到的三个系统调用,使用方式较为简单,但主要适用于内核级多线程之间通信,后面将给出多线程通信的具体实例。 收稿日期:2010-02-21 作者简介:袁玉锦(1980-),女,河北曲周人,邯郸学院网络中心,助教,学士,研究方向为计算机网络;周群(1981-),女,河北武安 人,助教,学士,主要研究方向为计算机网络。 ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.6,No.12,April 2010,pp.3279-3281E-mail:xsjl@https://www.doczj.com/doc/5e8753994.html, https://www.doczj.com/doc/5e8753994.html, Tel:+86-551-569096356909643279

操作系统(进程管理)习题与答案1

一、单选题 1、关于进程控制块的描述,如下存在问题的选项是()。 A.操作系统控制和管理并发执行进程的依据 B.进程存在的惟一标志,离散存放于内存空间或对应程序的文件目录项中 C.进程实体的一部分,是拥有描述进程情况及控制进程运行所需的全部信息的记录性数据结构 D.使一个在多道程序环境下不能独立运行的程序,成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程 正确答案:B 2、进程标识符和进程控制块的分配可能发生在进程的()阶段。 A.阻塞 B.挂起 C.创建 D.终止 正确答案:C 3、当一个进程被()时,可能会发生处理器的调度。 ①终止;②挂起;③唤醒;④阻塞 A.①②④ B.①③④ C.①②③④ D.①④ 正确答案:C

4、对于系统服务进程而言,如果当前没有任务,便会引发自身的()事件。 A.进程阻塞 B.进程唤醒 C.进程终止 D.进程挂起 正确答案:A 5、引起进程重新调度的原因不包括()。 A.进程放弃处理器 B.进程从核心态返回用户态 C.进程执行系统调用和陷入内核态 D.时钟中断 正确答案:C 6、关于进程同步机制基本准则:当无进程处于某临界资源所对应的临界区时,可允许一个请求进入(该临界资源所对应的)临界区的进程立即进入自己的临界区,这称之为()。 A.忙则等待 B.有限等待 C.空闲让进 D.让权等待 正确答案:C 7、关于进程同步机制基本准则:当已有进程进入自己的对应于某临界资源的临界区时,所有企图进入该临界资源所对应临界区的进程必须等待,这称之为()。 A.循环等待

B.忙则等待 C.有限等待 D.让权等待 正确答案:B 8、关于进程同步机制基本准则:对要求访问临界资源的进程,应保 证该进程能在有限时间内进入自己的临界区,这称之为()。 A.忙则等待 B.循环等待 C.有限等待 D.让权等待 正确答案:C 9、进程同步机制应遵循让权等待准则,故而当一个进程不能进入自 己的临界区时,其应当释放()。 A.处理器 B.I/O设备 C.内存空间 D.外存空间 正确答案:A 10、利用硬件指令能有效地实现进程互斥,但它却不能满足 ()的准则,造成了处理器时间的浪费,而且也很难将它用 于解决较复杂的进程同步问题。 A.忙则等待 B.空闲让进 C.让权等待 D.有限等待

操作系统复习必备基础概念

操作系统期末复习基础概念 操作系统的定义:计算机操作系统是指控制和管理计算机的软、硬件资源,合理组织计算机的工作流程,方便用户使用的程序集合。 主要特征:并发(Concurrence)共享(Sharing)虚拟(Virtual)异步(Asynchronism)(并非定义的条目,而是要能理解这些特征所指) 操作系统的发展:批处理操作系统(多道批处理)分时系统,实时操作系统,网络操作系统,分布式操作系统,多处理机操作系统,嵌入式操作系统 操作系统的主要功能:处理机管理内存管理文件管理设备管理用户接口 多道程序设计:内存中同时存放几个作业;宏观上并行运行:都处于运行状态,但都未运行完;微观上串行运行:各作业交替使用CPU。 中断:指CPU在收到外部中断信号后,停止原来工作,转去处理该中断事件,完毕后回到原来断点继续工作。 通道:用于控制I/O设备与内存间的数据传输。启动后可独立于CPU运行,实现CPU与I/O的并行。主处理器---通道----控制器---外设 分时:多个用户分享使用同一台计算机。多个程序分时共享硬件和软件资源。通常按时间片(time slice)分配:各个程序在CPU上执行的轮换时间。 操作系统结构:组织形式可以可分为两种: 强内核:传统的集中式内核结构,许多基于Unix的操作系统都是这种结构。 微内核:新的内核组织结构,有灵活性、开放性、可扩充性的优点 传统操作系统结构设计模式:模块化结构设计,分层结构设计 现代操作系统结构设计模式:客户/服务器模式,对象模式 一.用户与操作系统的接口类型,作业级接口,程序级接口,管态与算态,系统调用的概念: 作业级接口:操作系统为用户对作业运行全过程控制提供的功能。 脱机用户接口(批处理) 联机用户接口(交互式),命令行,图形用户界面 程序级接口:系统为用户在程序一级提供有关服务而设置,由一组系统调用命令

《记录型信号量》说课稿

《记录型信号量》说课稿 尊敬的各位评委老师: 大家下午好! 我是来自xxxxxxxx,我说课的内容选自《操作系统》课程,第二章“进程控制”中的记录型信号量。今天的说课从三个方面展开:教学分析、教学设计及教学过程。 一、教学分析 教学分析方面我主要从课程性质、教学内容、教学重难点、教学目标、学情分析五个点展开。 1.课程性质 操作系统课程是计算机软件工程专业的一门专业必修课。也是计算机专业考研的一门必考课程。通过本课程的学习,使学生能够掌握操作系统当中涉及到的基本概念、原理和算法,理解操作系统运行过程中的各种机制以及操作系统的五大管理功能。学习本课程需要具备计算机组成原理、数据结构和高级程序设计语言基础。学好本课程能够为后续软件开发课程如移动平台开发、Cocos 程序设计的学习打下坚实的理论基础。 2.教学内容 进程控制是操作系统课程的核心内容,是保证多进程有序使用操作系统资源的重要措施。信号量机制是一种卓有成效的进程同步机制。本次课在回顾整型信号量的基础上,对记录型信号量展开讲解,包括记录型信号量的数据结构、两个原语操作及其同步应用,同时引出信号量集的概念,为下一节课做铺垫。 3.教学重难点 记录型信号量的数据结构是理解该机制的基础,原语操作是使用该机制解决进程同步的核心,同步应用能帮助学生将知识应用于实践,所以都是教学重点。由于学生之前有一定的数据结构基础,故记录型信号量的数据结构、原语操作不是难点,难点是如何在实践中准确的应用他们来解决问题。 4.教学目标 在确定了教学的重点、难点,依据教学内容在课程中的地位,及课程教学大纲的要求,制定教学目标为:

(1)知识目标:了解信号量的概念和种类;掌握记录型信号量的数据结构和原语操作 (2)能力目标:根据不同应用特点设置信号量。运用wait原语、signal 原语完成进程的同步与互斥控制。 (3)情感目标:激发学生学习的兴趣;培养学生自主学习精神和探索学习精神。 5.学情分析 本学期教学的对象是13级软件工程专业数字媒体方向的学生,学生们通过对计算机导论,C语言,数据结构等先修专业课程的学习,对计算机操作系统中涉及到的一些基本术语、结构有所了解,有一定的理论基础和动手实践能力。但对理论知识兴趣不高,理论联系实际能力欠缺。 二、教学设计 通过教学分析,本课程内容理论性较强,又缺乏实验环节,加上学生学习兴趣不浓,课堂参与度低。 为了改善学生的学习现状,本课程遵循“以学生为主体、以探索为主线、以生活为主题、以兴趣为主流”的教学理念,突出学生在教师的点拨下的自主性学习,研究性学习、体验性学习和愉快性学习。 介于此,我主要采用类比教学法,用生活中形象的事物类比操作系统中抽象的概念,创设真实生动情景,使学生感到抽象的理论不再抽象,提高学生的学习积极性;采用问题驱动法,适时的抛出问题,引导学生积极主动的去分析解决问题,提高课堂的互动性。同时采用动画演示手段让学生更加直观的了解抽象事物。 在具体的教学过程设计上,共分为四个环节: ①导入新课(2); ②详解新课(11); ③知识应用(15); ④课堂小结(2)。 三、教学设计 导入新课阶段,以“知识回顾”的形式回忆信号量概念,在回顾整型信号量机制缺陷的基础上,采用问题驱动教学法抛出“记录型信号量是否能解决忙等缺

相关主题
文本预览
相关文档 最新文档