From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_19
Date: Thu, 5 Jan 2012 14:31:49 +0800
郝先生,
关于“进程交换过程“一章,我的疑问如下:
1、420页最后一段起,到421页10.2节之间的内容,我的理解如下:
对
于所有的进程,如果涉及进程的换入/换出,则需要换出的进程全部换出至一个特定的区域中。对于该特定的区域,在本版的unix里,是以第4000扇区为起
始,大小为872个扇区(共计436KB)的一个区域,最多可容纳7个大小不超过64KB的进程映像的存放。该区域的空间使用情况由数组
swapmap[]
进行管理(如涉及空间分配,malloc(swapmap,大小等)。且,换出的进程只能存放在这个区域内,不能存放于磁盘上除该区域外的任何其他地方。
是这样吗?
[郝]:非常正确!2、对于10.2.4节,我有如下2个疑问:
1)
在“调用实例“中,将要的子进程的数据区大小为10KB,而此时系统内存只有4KB,那当父进程要创建子进程时,为何不是先将父进程挂起(以等待系统空闲
内存超过10KB再唤醒它继续创建子进程),反而是将父进程的数据区复制至交换区(作为子进程的数据区)?是否目前的UNIX系统(采用SWAP的方式)
都还是采用该方法?
[郝]:是
的,依然是这样的方法。如果挂起父进程,那么结果就是调用fork的进程会被挂起,在内存不够的情况下。而这个在很多时候用户并不能接受,因为用户可以接
受fork返回失败信息或者其他,但不能够因为系统资源不够就把自己挂起来,这样它后续操作就没法进行,至少应该提供一个选项给用户来决定是否挂起。
而子进程可以被挂起,因为通常情况下用户不一定需要马上得到它的反馈。你认为呢?
我
的理解是:如果先挂起父进程,那当内存空闲空间超过10KB时(期间会有多次调度父进程,但都会因为malloc不成功而不能调度父进程),父进程会继续
创建子进程,对于数据区是将父进程的数据区复制给子进程,整个过程在内存中完成。而对于“书里的调用实例“,我感觉是父进程将整个子进程的创建在“磁盘
“上完成(而不是在内存中),它将子进程的数据区复制(或是“导出“)至交换区(磁盘上),当系统调度子进程时,可以直接进行进程换入。是这样吗?如果是
的话,除此之外,还有别的理由吗?
[郝]:是的。另外就是fork调用可以马上返回子进程ID。
2)426页,第4行,“50*2+1000*10*8/(1.4*1024)=(约等于)150ms“,能解释一下这个公式吗?里面的各个参数都是代表什么的呀?
[郝]:应该是8.5.2节,其实是数据写入时间=平均寻址时间*2 + 数据位数/数据传输率,为什么寻址时间*2后面也有解释,因为块连续而且是20个块,所以在不同的磁道上,这样就会有2次寻址。此外,勘误如下:
421 |
5 |
1 |
“第4章中的main...”,应为 第5章。同样,倒数第2行的:“在第4章中...“应为第5章 |
423 |
|
|
倒数第1段,“在第4章...“,应为第5章。 |
[郝]:谢谢!Steve
《返璞归真--UNIX技术内幕》在全国各大书店及网城均有销售:
阅读(4925) | 评论(0) | 转发(0) |