四级数据库工程师常见疑难题型解析.docx
《四级数据库工程师常见疑难题型解析.docx》由会员分享,可在线阅读,更多相关《四级数据库工程师常见疑难题型解析.docx(27页珍藏版)》请在冰豆网上搜索。
四级数据库工程师常见疑难题型解析
四级数据库工程师常见疑难题型解析
作者:
老胡少侠
写在前面:
也许,对于多年考试、考试多年的学子来说,没有考试的压力,提不起学习的动力!
大学毕业十年了,能促使自己重新打开书本,认真阅读当年熟悉现在陌生的专业书籍,也许只有那花了票子报了名参加的考试吧!
我们大多数人,都是普通人一枚,需要通过勤奋的学习,才能获取一些知识;我们大多数人,都为了考试而考试,考试前刻苦学习的知识考过后很快就忘了;我们大多数人,都非常希望花一点点时间,就掌握了考试的重点与难点,然后通过考试拿证在手。
本篇学习小结,针对的阅读群体,当然不是专业学者,也肯定不是学霸学精,只是为大多数的普通学子提供一些辛苦整理的资料,让我们知其然知其所以然;本篇学习小结,是按照笔者自己学习过程中遇到难题的顺序总结的,没有区分是数据库类还是操作系统类题目,比较杂乱,读者可以自己下载后重新组织;本篇学习小结,是针对常考、常错、比较难的十三种类型(共十二页)的题目,参考网上不同的解题方法,选择比较容易理解和掌握的解题方法,整理在题目的解析里,是笔者辛苦的结晶,望珍惜、望学好、望通过!
PS:
考试资料只需要购买未来教育的计算机等级考试题库,无论你是专业还是非专业的,因为考试题目就是题库中原题,如果你认真做完18套真题,即1440道题目,通过考试完全没问题。
如果记忆力很好的话,甚至能拿优秀。
四级数据库工程师常见疑难题型解析
作者:
老胡少侠
1、在某页式存储管理系统中,页面大小为1KB,物理内存为256MB,进程地址空间为512MB,只考虑一级页表,则页表长度(页表项个数)为:
解析:
进程地址空间即逻辑地址空间为512MB=2^29B,页面大小为1KB即页内地址空间为2^10B,那么页号空间即页表长度为:
2^(29-10)=2^19。
这里物理内存256MB是干扰项。
扩展:
简单页式存储管理方案中,若地址用m个二进制位表示,页内地址部分占用n个二进制位,则最大允许进程有多少个页面:
m-n位用于描述页面编号,所以最大允许进程有2^(m-n)个页面。
页号m-n位
页内地址n位
逻辑地址m位:
2、有一个虚拟页式存储系统,采用最近最少使用(LRU)页面置换算法,系统分给每个进程3页内存,其中一页用来存放程序和变量i,j(不作他用)。
假设一个页面可以存放P个整数变量。
某进程程序如下:
代码一(按行初始化访问):
代码二(按列初始化访问):
VARA:
ARRAY[1..M,1..N]OFinteger;VARA:
ARRAY[1..M,1..N]OFinteger;
i,j:
integer;i,j:
integer;
FORi:
=1toMDOFORj:
=1toNDO
FORj:
=1toNDOFORi:
=1toMDO
A[i,j]:
=0;A[i,j]:
=0;
设变量i,j放在程序页面中,初始时,程序及变量i,j已在内存,其余两页为空。
矩阵A按行序存放。
试问当程序执行完后,共缺页多少次?
解析:
上述代码的区别在于,代码一是按行访问,代码二是按列访问,但矩阵是按行序存放。
假设页面总量P=300,列数N=300,行数M=200,计算公式如下:
当采取代码一的访问方式,存放方式与访问方式相同,按行存放一页可存储(P÷N)行,按行访问M行,第一行缺页一次,第(P÷N)+1行缺页一次,即缺页M÷(P÷N)次,则题设中缺页200次。
当采取代码二的访问方式,存放方式与访问方式不同,按行存放一页可存储(P÷N)行,按列访问M×N个列元素,第一列第一行缺页一次,第一列第(P÷N)+1行缺页一次,即缺页M×N÷(P÷N),则缺页300*200次。
如下是按列访问的图示例子:
12345678A:
ARRAY[1..6,1..8],每一页存放16个整数变量
1○○○○○○○○一页可以存放两行,当按列访问A[1,1]时缺页,
2○○○○○○○○A[2,1]不缺页,A[3,1]缺页,A[4,1]不缺页,
3○○○○○○○○A[5,1]缺页,A[6,1]不缺页,共缺页三次。
4○○○○○○○○以此类推,每一列都缺页三次,共计缺页8*3次。
5○○○○○○○○即M×N÷(P÷N)=6×8÷(16÷8)=24次
6○○○○○○○○
1234A:
ARRAY[1..6,1..4],每一页存放12个整数变量
1○○○○一页可以存放三行,当按列访问A[1,1]时缺页,
2○○○○A[2,1]不缺页,A[3,1]不缺页,A[4,1]缺页,
3○○○○A[5,1]不缺页,A[6,1]不缺页,共缺页二次。
4○○○○以此类推,每一列都缺页二次,共计缺页4*2次。
5○○○○即M×N÷(P÷N)=6×4÷(12÷4)=8次
6○○○○
3、假设某计算机系统的主存大小为256KB,在某一时刻主存的使用情况如表3-3所示。
此时,若进程顺序请求20KB、10KB和5KB的存储空间,系统采用______算法为进程依次分配主存,则分配后的主存情况如表3-4所示。
解析:
首先,理解最差适配、最佳适配、首次适配、下次适配算法:
最差适配,从全部空闲区中找出能满足作业要求的、且大小最大的空闲分区,从而使链表中的结点大小趋于均匀,适用于请求分配的内存大小范围较窄的系统。
为适应此算法,空闲分区表(空闲区链)中的空闲分区要按大小从大到小进行排序,自表头开始查找到第一个满足要求的自由分区分配。
该算法保留小的空闲区,尽量减少小的碎片产生。
最佳适配,从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。
为适应此算法,空闲分区表(空闲区链)中的空闲分区要按大小从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。
该算法保留大的空闲区,但造成许多小的空闲区。
首次适配(最先适配),从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲分区分配给作业,这种方法目的在于减少查找时间。
为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。
该算法优先使用低地址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
下次适配(临近适配),其工作方式和首次适配算法相同,不同的是每次找到合适的空闲的分区时就记住它的位置,以便下次就从该位置开始往下查找,而不是每次都像首次适配算法那样从头开始查找。
这种算法的总体结果通常要比首次适配算法差。
由于它经常会在内存的末尾分配存储分区,使位于存储空间末尾的最大分区被撕裂成小的外部碎片,因此必须经常不断地进行存储紧凑。
在该算法中应采取循环查找方式,即最后上个空闲区的大小仍不能满足要求时,应再从第一个空闲区开始查找,故又称为循环造就算法。
其次,根据题目中条件,逐步解答此题。
分析表3-3可知:
1、空闲区最大的是起始地址为20KB,容量30KB;
2、空闲区最小的是起始地址为100KB,容量5KB;
3、低地址部分第一个空闲区是起始地址为20KB,容量30KB。
顺序请求20KB、10KB和5KB的存储空间后,分析表3-4可知:
1、起始地址20KB的空闲区被使用,容量20KB;
2、起始地址135KB的空闲区被使用,容量10KB;
3、起始地址195KB的空闲区被使用,容量5KB;
该算法选择了空闲区最大、低地址部分第一个空闲区分配给存储空间为20KB的请求进程,排除最佳适配算法的可能;空闲区满足10KB请求的低地址部分第一个空闲区是40KB,容量刚好10KB,表中算法未选择分配,排除首次适配和下次适配的可能;空闲区大小第二的是起始地址为135KB和195KB,都被该算法选择分配给请求进程,所以系统采用的是最差适配算法。
最后,分别采用剩下的三种算法对题目中顺序请求20KB、10KB和5KB的存储空间进行分配如下表:
表3-0最优适配
起始地址
0KB
20KB
50KB
90KB
100KB
105KB
135KB
145KB
160KB
175KB
195KB
220KB
状态
已用
未用
已用
已用
已用
已用
已用
未用
已用
已用
未用
已用
容量
20KB
30KB
40KB
10KB
5KB
30KB
10KB
15KB
15KB
20KB
25KB
36KB
表3-1首次适配和下次适配(对本题两个算法分配结果可以相同)
起始地址
0KB
20KB
40KB
50KB
90KB
100KB
105KB
145KB
160KB
175KB
195KB
220KB
状态
已用
已用
已用
已用
已用
已用
已用
未用
已用
未用
未用
已用
容量
20KB
20KB
10KB
40KB
10KB
5KB
30KB
25KB
15KB
20KB
25KB
36KB
表3-2下次适配的起始位置不一样,分配结果不一样,如下:
起始地址
0KB
20KB
50KB
90KB
100KB
105KB
135KB
155KB
160KB
175KB
185KB
190KB
195KB
220KB
状态
已用
未用
已用
已用
未用
已用
已用
未用
已用
已用
已用
未用
未用
已用
容量
20KB
30KB
40KB
10KB
5KB
30KB
20KB
5KB
15KB
10KB
5KB
5KB
25KB
36KB
4、在实现文件系统时,可采用“目录项分解法”加快文件目录的检索速度。
假设目录文件存放在磁盘上,每个磁盘块为1024B,文件控制块占32字节(即32B),其中文件名占8B。
文件控制块分解后,第一部分占10B(包括文件名和文件内部号),第二部分占26B(包括文件内部号和文件其他描述信息)。
假设某一个目录文件共有256个文件控制块,试分别计算采用目录项分解法前和分解法后,查找该目录文件的某一个文件控制块的平均访问磁盘次数。
解析:
此题是常考题,一定要分清计算的是采用分解法前还是采用分解法后。
如题,某一个目录文件共有256个文件控制块,每个磁盘块大小为1024字节,文件控制块大小为32字节。
首先,采用目录项分解法前,文件控制块是一个整体,每个磁盘块可存放1024÷32=32个文件控制块;对于某一个共有256个文件控制块的目录文件,则需要存放在256÷32=8个磁盘块中;查找该目录文件的某一个文件控制块,最少访问一个磁盘块,最多每个磁盘块都访问一次即8次才检索到,那么平均访问磁盘次数=(1+8)÷2=4.5。
其次,采用目录项分解法后,文件控制块被分成两部分,第一部分占10B(包括文件名和文件内部号),一个磁盘块可存放1024÷10≈102个文件控制块第一部分;对于某一个共有256个文件控制块的目录文件,则第一部分存放在256÷102≈3个磁盘块中;查找该目录文件的某一个文件控制块,首先查找该文件控制块的第一部分,最少访问一个磁盘块,最多每个磁盘块都访问一次即3次才检索到,那么查找第一部分的平均访问磁盘次数=(1+3)÷2=2;然后根据第一部分记录的文件内部号,需要再访问一次磁盘,读取该文件控制块的第二部分。
故查找该目录文件的某一个文件控制块的平均访问磁盘次数=(1+3)÷2+1=3次。
最后,可总结出计算公式如下:
分解前,计算出目录文件存放在多少个磁盘块中,设为N,则平均访问磁盘次数为:
(N+1)÷2次;
分解后,计算出目录文件第一部分存放在多少个磁盘块中,设为M,则平均访盘次数为:
((1+1)+(M+1))÷2=(M+3)÷2次。
备注:
何为目录项分解法?
即把目录项(文件控制块)分为两部分:
第一部分为名号目录项,包含文件名以及相应的文件内部号;第二部分为基本目录项,包含了除文件名外文件控制块的其他全部信息。
目录文件也分为名号目录文件和基本目录文件。
查找一个目录项就分成两步:
首先访问名号目录文件,根据文件名查找相应的文件内部号;然后访问基本目录文件,根据文件内部号,可直接计算出相应基本目录项所在基本目录文件中的相对位置和物理位置,并将它直接读入内存。
目录项分解法的优点是提高了文件目录检索的速度。
5、在一个采用三级索引结构的UNIX文件系统中,假设物理块大小为1KB,用32位表示一个物理块号。
主索引表含有13个块地址指针,其中前10个直接指向盘块号,第11个指向一级索引表,第12个指向二级索引表,第13个指向三级索引表,那么,一个文件最大可有多少块?
解析:
题目中主索引表有13个块地址指针,前10个索引项直接存放物理块号(直接寻址),最多寻址10个物理块;第11个、12个、13个块地址指针指向的也是物理块,只不过物理块里存放的是索引表,说明一级索引表、二级索引表、三级索引表的大小为物理块大小1KB;而一个物理块号用32位表示,即在索引表中存放的空间大小为4B;一级索引表可以存放多少个物理块号,即可以寻址多少个物理块(一次间接寻址),即1KB÷4B=256个;二级索引表可存放多少个物理块号(二次间接寻址),即256×256个;三级索引表可以存放多少个物理块号(三次间接寻址),即256×256×256个。
那么,一个文件最大可以有:
(10+256+256×256+256×256×256)块。
扩展:
同类题型,另一种表述方法如下:
某文件系统采用UNIX三级索引结构,I节点中包含13个地址项,其中0-9项为直接地址,10为一次间接索引项,11为二次间接索引项,12为三级间接索引项。
若磁盘块大小为4096B,地址项占用4B,则该文件系统中文件的最大尺寸不能超过下列哪项数值?
答案:
(10+1024+1024×1024+1024×1024×1024)×4096B
备注:
UNIX文件系统采用多级索引结构,每个文件的索引表为13个索引项,每项2个字节。
一级文件索引(直接索引)结构中:
在文件目录表项中有一组表项用于索引,每一个表项登记的是逻辑记录所在的磁盘块号。
逻辑记录与磁盘块号的大小相等,都为512B。
二级文件索引(一级间接索引)结构中:
文件目录中有一组表项,其内容登记的是第一级索引表块的块号。
第一级索引表块中的索引表登记的是文件逻辑记录所在的磁盘块号。
三级文件索引(二级间接索引)结构中:
文件目录项中有一组表项,其内容登记的是第二级索引表块的块号。
第二级索引表块中的索引表项登记的是第一级索引表块的块号,第一级索引表项中登记的是文件逻辑记录所在的磁盘块号。
6、某计算机系统中共有3个进程P1、P2和P3,4类资源r1、r2、r3和r4。
其中r1和r3每类资源只有1个实例,r2资源有2个实例,r4有3个实例。
当前的资源分配状态如下:
E={,,,,,}
若进程P3申请一个r2类资源,则系统可能会发生下列哪一种现象?
A.死锁B.无死锁C.活锁D.饥饿
解析:
将题目中的资源分配状态图标上有向箭头,如下:
红色箭头表示申请资源等待分配,绿色箭头表示已经分配等待释放。
通过观察上图,发现存在两条回路p1->r1->p2->r3->p3->r2->p1、p2->r3->p3->r2->p2,因此系统可能会发生死锁现象。
扩展:
某操作系统的当前资源分配状态如下表所示:
进程
最大资源需求
已分配资源数量
待分配资源数量
R1R2R3
R1R2R3
R1R2R3
P1
753
010
743
P2
322
200
122
P3
902
302
600
P4
222
211
011
P5
433
002
431
假设当前系统可用资源R1、R2和R3的数量为(3,3,2),且该系统目前处于安全状态,那么下列哪些是安全序列?
(ACDE)
A.P2P4P1P5P3B.P4P5P3P1P2C.P2P5P4P1P3D.P4P2P1P3P5E.P2P4P3P5P1
常规思路:
比较每一次当前进程运行结束后的可用资源数是否满足下一个进程的运行资源需求。
如:
B项P4P5运行结束后,可用资源数为(5,4,5),准备分配给P3,P3当前资源需求量为(6,0,0),则发现R1资源不足以分配给P3,因此B项不是安全序列。
快速排除:
在表尾部加上一列待分配资源数量,可以判断当前系统可用资源,只能分配给进程P2或P4,如分配给P4运行结束后,则可用资源扩大为(5,4,3),只能分配给进程P2或P5,如分配给P5运行结束后,则可用资源扩大为(5,4,5),只能分配给进程P2。
7、有如下C语言程序
void*th_f(void*arg)
{
printf("HelloWorld");
pthread_yield(0);
}
intmain(void)
{
pthread_ttid;
intst;
st=pthread_create(&tid,NULL,th_f,NULL);//创建线程后,运行该线程,线程名为th_f。
if(st==0)
printf("Oops,Icannotcreatethread\n");
exit(NULL);
}
针对上述程序,下列叙述中哪一个是正确的?
解析:
程序中pthread_yield(0)表示线程th_f运行后主动释放CPU给其他线程。
其他函数描述如下:
pthread_exit(0):
表示线程th_f运行后主动退出;程序运行中最多存在2个线程。
pthread_join
(2):
表示线程th_f运行后等待一个特定的线程退出;
没有函数调用,表示线程th_f运行后退出。
8、对于如下C语言程序
intmain()
{
printf("HelloWorld\n");
fork();
fork();//再加上一行fork();
printf("HelloWorld\n");
}
在UNIX操作系统中正确编译链接后,其正确的运行结果为
A.共打印出2行HelloWorld
B.共打印出3行HelloWorld
C.共打印出4行HelloWorld
D.共打印出5行HelloWorld
答案:
D
解析:
程序中fork()函数,若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;若出错,返回-1。
在创建子进程之前输出一行HelloWorld,假设程序正确运行并创建子进程成功,fork()函数两次调用将有四个进程,故输出2×2=4行HelloWorld,共计打印出5行HelloWorld。
如果fork()函数三次调用,也就是再加上一行fork();,那么将创建2×2×2=8个进程,共打印出9行HelloWorld。
扩展1:
于如下C语言程序
intmain()
{
pid_tpid;
inta=1;
pid=fork();
if(pid==0)
printf("Thisisthechildprocess,x=%d\n",++a);
else
printf("Thisistheparentprocess,x=%d\n",--a);
}
在UNIX操作系统中正确编译链接后,其正确的运行结果是
Thisisthechildprocess,a=2
Thisistheparentprocess,a=0
扩展2:
于如下C语言程序
intmain()
{
inti;
for(i=0;i<3;i++)
{
fork();
Printf(“HelloWorld\n”)
}
}
在UNIX操作系统中正确编译链接后,其运行结果为:
共打印出14行HelloWorld。
详解:
第一次调用时,i=0,父进程A,创建子进程B,都执行一次打印,输出两行HelloWorld;随后i++,i=1,父进程A再次创建子进程C,子进程B创建其子进程D,都执行一次打印,输出四行HelloWorld;随后i=2,父进程A再次创建子进程E,子进程B创建其子进程F,子进程C创建其子进程G,子进程D创建其子进程H,都执行一次打印,输出八行HelloWorld;共打印出2+4+8=14行HelloWorld。
扩展3:
某一单核处理机的计算机系统中共有20个进程,那么处于运行状态的进程最多有__个,最少有__个;处于就绪状态的进程最多有__个,最少有__个;处于阻塞状态的进程最多有__个,最少有__个;这些进程是____运行的。
解析:
单核处理机的计算机系统中,处于运行状态的进程最多有1个,最少有0个;处于就绪状态的进程,最多有19个,最少有0个;处于阻塞状态的进程,最多有20个,最少有0个;这些进程是并发运行的。
9、下列关于函数依赖的叙述中,哪一条是错误的()
A.若X→Y,X→Z,则X→YZ(合并规则)
B.若XY→Z,则X→Z,Y→Z
C.若X→Y,Y→Z,则X→Z(传递律)
D.若X→Y,Y’∈Y,则X→Y’(分解规则)
答案:
B
解析:
Armstrong公理:
设U是关系模式R的属性集,F是R上成立的只涉及U中属性的函数依赖集。
函数依赖的推理规则有以下三条:
自反律:
若属性集Y包含于属性集X,属性集X包含于U,则X→Y在R上成立。
(此处X→Y是平凡函数依赖)
增广律:
若X→Y在R上成立,且属性集Z包含于属性集U,则XZ→YZ在R上成立。
传递律:
若X→Y和Y→Z在R上成立,则X→Z在R上成立。
推论:
合并规则:
若X→Y,X→Z同时在R上成立,则X→YZ在R上也成立。
分解规则:
若X→W在R上成立,且属性集Z包含于W,则X→Z在R上也成立。
伪传递规则:
若X→Y在R上成立,且WY→Z,则XW→Z。
扩展1:
下列关于部分函数依赖的叙述中,哪一条是正确的()
A.若X→Y,且存在属性集Z,Z∩Y≠∅,X→Z,则称Y对X部分函数依赖
B.若X→Y,且存在属性集Z,Z∩Y≠∅,X→Z,则称Y对X部分函数依赖
C.若X→Y,且存在X的真子集X’,X’→Y,则称Y对X部分函数依赖
D.若X→Y,且对于X的任何真子集X’,都有X’→Y,则称Y对X部分函数依赖
答案:
C
备注:
术语
(1)若X→Y,则X称作决定因素(Determinant)
(2)若X→Y,Y→X,称作X<->Y。
(3)若Y不函数依赖于X,称作X-/->Y。
(4)X→Y,若Y不包含X,则称X→Y为非平凡的函数依赖。
正常讨论的都是非平凡的函数依赖。
(5)X→Y,若Y包含X,则称X→Y为平凡的函数依赖。
(6)完全函数依赖(fullfunctionaldependency):
在R(U)中,设X、Y是关系模式R(U)中不同的属性子集,若存在X→Y,且不存在 X的任何真子集X',使得X'→Y,则称Y完全函