转自:http://blog.youkuaiyun.com/wangwenjing90/article/details/8853013?reload
1、构成死锁的必要条件是什么,如何检测死锁,解除死锁?
操作系统中有若干进程并发执行,它们不断申请、使用、释放系统资源,虽然系统的进程协调、通信机构会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能继续运行,否则就阻塞的情况。此时,若不借助外界因素,谁也不能释放资源,谁也不能解除阻塞状态。根据这样的情况,操作系统中的死锁被定义为系统中两个或者多个进程无限期地等待永远不会发生的条件,系统处于停滞状态,这就是死锁。产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
死锁的解除与预防:
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。
2、画出星形、树形、总线形、环形网络拓扑结构,并写出星形、总线形网络拓扑结构的特点。
最后一个是总线型。
星形网络拓扑结构:以一台中心处理机(通信设备)为主而构成的网络,其它入网机器仅与该中心处理机之间有直接的物理链路,中心处理机采用分时或轮询的方法为入网机器服务,所有的数据必须经过中心处理机。
星形网的特点:
(1)网络结构简单,便于管理(集中式);
(2)每台入网机均需物理线路与处理机互连,线路利用率低;
(3)处理机负载重(需处理所有的服务),因为任何两台入网机之间交换信息,都必须通过中心处理机;
(4)入网主机故障不影响整个网络的正常工作,中心处理机的故障将导致网络的瘫痪。
适用场合:局域网、广域网。
总线形网络拓扑结构:所有入网设备共用一条物理传输线路,所有的数据发往同一条线路,并能够由附接在线路上的所有设备感知。入网设备通过专用的分接头接入线路。总线网拓扑是局域网的一种组成形式。
总线网的特点:
(1)多台机器共用一条传输信道,信道利用率较高;
(2)同一时刻只能由两台计算机通信;
(3)某个结点的故障不影响网络的工作;
(4)网络的延伸距离有限,结点数有限。
适用场合:局域网,对实时性要求不高的环境。
3、写SQL语句。给出学生基本信息表(学号,姓名,年龄)、选课成绩表(学号、课程号、成绩),用SQL语句找出没有选择课程号=1012的学生的学号和姓名。
答:select 学号,姓名 from 学生表S where S.学号 not in (select 学号 from 成绩表G where G.课程号='1012')
4、给出一段C语言程序,写出该程序的输出结果。
- void main()
- {
- static char arr[5]={'*','*','*','*','*'};
- int i,j,k;
- for(i = 0;i < 5; i ++)
- {
- printf("\n");
- for(j = 0; j < i; j ++) printf(" ");
- for(k = 0; k < 5; k ++) printf("%c",arr[k]);
- }
- }
- void main()
- {
- static char arr[5]={'*','*','*','*','*'};
- int i,j,k;
- for(i = 0;i < 5; i ++)
- {
- printf("\n");
- for(j = 0; j < i; j ++) printf(" ");
- for(k = 0; k < 5; k ++) printf("%c",arr[k]);
- }
- }
void main()
{
static char arr[5]={'*','*','*','*','*'};
int i,j,k;
for(i = 0;i < 5; i ++)
{
printf("\n");
for(j = 0; j < i; j ++) printf(" ");
for(k = 0; k < 5; k ++) printf("%c",arr[k]);
}
}
输出结果:
由星号组成的平行四边形
5、给出一段C语言程序,写出该程序的功能。
- void main()
- {
- int a, b, c,p;
- scanf("%d,%d,%d",&a,&b,&c);
- if(a > b) {p=a;a=b;b=p;}
- if(a > c) {p=a;a=c;c=p;}
- if(b > c) {p=b;b=c;c=p;}
- printf("%d,%d,%d\n",a,b,c);
- }
- void main()
- {
- int a, b, c,p;
- scanf("%d,%d,%d",&a,&b,&c);
- if(a > b) {p=a;a=b;b=p;}
- if(a > c) {p=a;a=c;c=p;}
- if(b > c) {p=b;b=c;c=p;}
- printf("%d,%d,%d\n",a,b,c);
- }
void main()
{
int a, b, c,p;
scanf("%d,%d,%d",&a,&b,&c);
if(a > b) {p=a;a=b;b=p;}
if(a > c) {p=a;a=c;c=p;}
if(b > c) {p=b;b=c;c=p;}
printf("%d,%d,%d\n",a,b,c);
}
功能:从键盘读入三个数,按由小到大的顺序输出。
6、给出表达式的中缀式,写出它的后缀式。
A*(B+C)*D-E
A^B^C/D
-A+B*C+D/E
(A+B)*C-E/(F+G/H)-D
8/(5+2)-6
分别写出它们的后缀式。
后缀式:
ABC+*D*E-
AB^CD/^
-ABC*+DE/+
AB+C*EFGH/+/-D-
852+/6-
7、给出a,b,c,d,e,f 6个字母各自出现的概率,分别为0.19,0.26,0.15,0.07,0.25,0.08,写出它的最优二进制编码,并画出最优二叉树和计算出平均码长。
哈夫曼编码如下:
a 10
b 01
c 001
d 0000
e 11
f 0001
二叉树:
平均码长:0.19*2+0.26*2+0.15*3+0.07*4+0.25*2+0.08*4 = 2.45