分页: 1 / 1

11-21 知识点总结-----参考答案

发表于 : 2010-11-22 15:24
xiaobo68688
11-21 知识点总结-----参考答案
这是我自己的一些解释,由于我是初学,所以肯定有很多答案不准确,还请大家在下边贴上自己的看法!谢谢了!
很愿意和您交流,邮箱:onlyformyxiuxiu@qq.com

首先说明一下,我看的书是《Linux内核设计与实现》,也就是大家所说的LKD,和《现代操作系统》,所以有些名词您可能没有听说过,不过不要紧,这仅仅是翻译的问题。

对应知识:《Linux内核设计与实现》第三章 P16 ---- P21
1.进程描述符是什么?由进程描述符你能想到什么知识点?
内核把进程存放在叫做任务队列(task list)的双向循环链表中,链表中的每一项都是类型为stak_struct的结构,该结构称为进程描述符。

2.各个进程的进程描述符存储在什么地方?为什么这样存储?
在2.6以前的内核中,各个进程的task_struct存放在它们内核栈的尾端。这样的话可以直接通过栈指针就能计算出它们的位置。(在这里我有一点疑问,栈的尾端经查就是栈顶,不同的情况栈顶的位置是不一样的,如果这样的话怎么能直接通过栈指针计算它们的位置呢?)

3.由于slab分配器可以动态生成进程描述符,所以只需在栈底(对于向下增长的栈)或栈顶(对于向上增长的栈)创建一个新的结构struct thread_info,请详细说current宏和current_thread_info()函数对于thread_info的操作。
在x86系统上,current把栈指针的后13个有效位屏蔽,用来计算出thread_info的偏移。对于thread_info的存储位置,经查,有两种说法。
第一种,内核为每个进程分配一个task_struct结构时,实际上分配两个连续的物理页面(8192字节)。底部用作task_struct结构(大小约为1K字节),结构的上面用作内核堆栈(大小约为7K字节)。
也就是说,内核会将task_struct结构和内核堆栈分开。
参考资料:http://feizf.blogbus.com/logs/16835565.html

第二种,内核会为内核堆栈分配8KB的空间,然后task_struct从内核堆栈的底部(最下边)划分出大约1KB的空间来。
我们可以看出来,两种说法是一样的。
下面讨论current宏的操作。
在x86系统中,current宏通过current_thread_info()完成,定义如下:

movl $-8192, %eax
andl %esp, %eax

-8192在内存中的存储状态如下:(不明白负整数在内存中存储方式的朋友请看我的博文http://blog.csdn.net/xiaobo68688/archive/2010/11/22/6026722.aspx)
1111 1111 1111 1111 1110 0000 0000 0000
这时候andl所做的工作就是将esp的后13位都设置为0,这时eax中存储的是内核栈的开头,从而得到了指向task_struct的指针(有关这个我不太明白,为什么这时候存储的就是内核栈的开头?)。
解决了这几个问题,剩下的也就不困难了。

4.进程的状态存储在进程描述符的哪个域中?
state域

5.进程的五种状态分别是什么?
TASK_RUNNING (运行)
TASK_INTERRUPTIBLE(可中断)
TASK_UNINTERRUPTIBLE(不可中断)
TASK_ZOMBIE(僵死)
TASK_STOPPED(停止)

对应知识:《现代操作系统》 P100-P103
1.中断和陷入的区别
中断是其它进程或者系统使CPU暂停当前正在执行的进程转而执行其它的任务,是和当前进程无关的。
陷入是当前进程由于请求操作系统服务或者请求设备,或者程序本身产生错误,使CPU由用户态转为核心态,也就是由用户转到内核。是和当前进程密切相关的。
一句话,中断是和当前进程无关的,陷入是和当前进程密切相关的。

2.为什么说一个没有内存抽象的系统也不大可能具有线程抽象的功能?
自我认为,没有内存抽象的话,多道程序设计的实现就很困难,因为你需要在每次调用程序的时候将其中存储的地址改变。而线程抽象要求的是程序能够使用整个系统的内存。(我也不知道说的对不对,还请高手指正!)

3.请描述IBM360并发执行的原理(采取的措施是设置保护键)
内存被划分为2KB的块,每个块被分配为一个4位的保护键。保护键被存储在CPU的一个特殊寄存器中。
程序状态字中存有一个4位码。一个运行的程序如果程序状态字中的4位码和保护键不一样时,硬件就捕获这一错误,也就是说出现错误了。
不同的程序有不同的保护键和对应的4位码,这样,就能实现并发执行多个程序了。

4.把物理地址暴露给程序的坏处
程序能够访问并修改操作系统在内存的中存储的数据,这样会引起错误。
采用物理地址,想要一个CPU同时执行多个程序是很困难的。

5.请简述基址寄存器和界限寄存器的作用
每次装载一个程序时,基址寄存器存储程序的开始地址,界限寄存器存储程序的结束地址。以后装载程序时,基址寄存器中的地址就是上一个进程的界限寄存器存储的地址,界限寄存器存储的地址就是基址寄存器中存储的地址加上程序的长度。
举例来说:第一个程序的基址寄存器中为0,界限寄存器为16384,则第二个程序的基址寄存器中为16384,界限寄存器为32768。

6.两种处理内存超载的通用方法:1.交换技术 2.虚拟内存技术,请简述第一种技术是怎么实现的
把一个进程完整调入内存,使进程运行一段时间,然后把它存回硬盘,再将下一个进程调入内存。

Re: 11-21 知识点总结-----参考答案

发表于 : 2010-12-04 10:00
yyxl
:em20 :em20 :em20 :em20 :em20

Re: 11-21 知识点总结-----参考答案

发表于 : 2010-12-08 18:22
weishantc
论坛好冷清啊...只有发贴的没有回帖的... :em06
顶楼主