Linux下thread编程 (一)
作者:Sam (甄峰) sam_code@hotmail.com
Sam前些天在提供一个库给别的公司时,因为不喜欢使用pthread_jion等函数,被人骂为垃圾程序。呵呵,之前因为在写多thread程序时,习惯让每个thread都为detach属性,这样他们就可以自我管理。而不需要再由别人回收资源。呵呵,不说这么多了,把POSIX thread方面的东西记下来吧。
Linux下thread历史(Old pthread与NPTL):
Linux创建之初,并不能真正支持thread. LinuxThreads 项目使用clone()这个系统调用实现对thread的模拟。在_clone本来的意图是创建一个可定义各种配置的对当前进程的拷贝。LinuxThreads项目则利用了这一点,配置了一个与调用进程拥有相同地址空间的拷贝,把它作为一个thread. 所以,常常有人说,linux下面没有进程线程之分,其实就是这个意思。但这个方法也有问题,尤其是在信号处理、调度和进程间同步原语方面都存在问题。另外,这个线程模型也不符合 POSIX 的要求。
如果要改进LinuxThread. 很明显,需要kernel层的支持。IBM和RedHat分别进行了研究,随着IBM的放弃,RedHat的Native POSIX Thread Library(NPTL)就成唯一的解决方案了。这就是NPTL。
LinuxThreads 最初的设计相信相关进程之间的上下文切换速度很快,因此每个内核线程足以处理很多相关的用户级线程。这就导致了一对一 线程模型的革命。
LinuxThreads 设计细节的一些基本理念:
LinuxThreads 非常出名的一个特性就是管理线程(manager thread)。管理线程可以满足以下要求:
系统必须能够响应终止信号并杀死整个进程。
以堆栈形式使用的内存回收必须在线程完成之后进行。因此,线程无法自行完成这个过程。
终止线程必须进行等待,这样它们才不会进入僵尸状态。
线程本地数据的回收需要对所有线程进行遍历;这必须由管理线程来进行。
如果主线程需要调用 pthread_exit(),那么这个线程就无法结束。主线程要进入睡眠状态,而管理线程的工作就是在所有线程都被杀死之后来唤醒这个主线程。
为了维护线程本地数据和内存,LinuxThreads 使用了进程地址空间的高位内存(就在堆栈地址之下)。
原语的同步是使用信号 来实现的。例如,线程会一直阻塞,直到被信号唤醒为止。
在克隆系统的最初设计之下,LinuxThreads 将每个线程都是作为一个具有惟一进程 ID 的进程实现的。
终止信号可以杀死所有的线程。LinuxThreads 接收到终止信号之后,管理线程就会使用相同的信号杀死所有其他线程(进程)。
根据
相关文档:
Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......
什么是 yum?
yum 是 yellowdog updater modified 的缩写。yellowdog 是一个 Linux 的 distribution,RH 将这种升级技术利用到自己的 distribution 形成了现在的 yum,感觉上 yum 和 apt 的原理类似,但是 apt 是编译代码,执行效率远高于使用 python 写成的 yum。这是 yum 的主页。
yum 的理念是使用一个中心仓 ......
1. 系统启动后,在出现grub画面时,用上下键选中你平时启动linux的那一项,然后按e键
2. 再次用上下键选中你平时启动linux的那一项(类似于kernel/boot mlinuz-2.4.18-14 ro root=LABEL=/),然后按e键
3. 修改你现在见到的命令行,加入single,结果如下:
kernel /boot mlinuz-2.4.18-14 single ro ......
用 GDB 调试程序
GDB 概述
————
GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像 VC 、 BCB 等 IDE 的调试,但如果你是在 UNIX 平台下做软件,你会发现 GDB 这个调试工具有比 VC 、 BCB 的图形化调试器更强大的功能。所谓 “ ......
随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中。面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后,都将面临着同样的问题,即如何将源代码融入到 Linux 内核中,增加相应的 Linux 配置选项,并最终被编译进 Linux 内核。这就需要了解 Linu ......