From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_26
Date: Sun, 26 Feb 2012 16:34:18 +0800
郝先生,
线程方面碰到的问题如下:
1、689页,倒数第2、3行,里面提到第14章所实现的线程在退出时只会将线程栈释放、而不会释放该线程所分配的堆空间,这是否会造成内存泄漏?
[郝]:如果用户线程在每次调用malloc后,都会调用free来释放它,那么就不会有内存泄漏。否则在线程退出后,这部分内存就不会被释放而导致内存泄漏,直到整个进程
退出为止,到这时进程所有使用的空间(程序、堆和栈)都会被释放,也就不会有内存泄漏了。
2、 关于线程的调度。我的理解是(不是指对第14章所实现的线程的理解),一般来说,系统调度的粒度是进程。先比较就绪进程的优先级,优先级最高的优先被选。 被选上的进程如果有多个进程,则选择优先级最高的线程执行。请问,第14章所实现的线程也是采用这种调度方式吗?我感觉书里应该是695页里提到过线程的 调度,但由于注释不是很多,不是很肯定.....(书里696页,上部的 do-while 循环,感觉“第14章所实现的线程”的系统调度的粒度是线程,也许是我理解错.....)
[郝]:是的。本书中的实现粒度是纯线程级的,和进程无关(唯一相关的就是:如果多个线程优先级相同,则优先调度本进程内线程)。
你所讲的调度粒度是“进程+线程”,这是一种比较常 见的调度方式,比如Windows就采用这样的方式,还有其他一些UNIX系统。但linux实际上还是采用纯线程粒度的调度,因为linux系统中的线 程实际上是LWP(light weight process--轻量级进程)。应该说各有利弊吧。具体利弊要仔细研究了。
这两个问题都很好。可以展开讲很多。
勘误,无
Steve