10、线程文化
1、在Linux2.2内核中,并不存在真正意义上的线程。当时Linux中常用的线程pthread实际上是通过进程来模拟的,也就是说Linux中的线程也是通过fork()创建的“轻”进程,并且线程的个数也很有限,最多只能有4096个进程/线程同时运行。
2、Linux2.4内核消除了这个线程个数的限制,并且允许在系统运行中动态地调整进程数上限。当时采用的是LinuxThread线程库,它对应的线程模型是“一对一”线程模型,也就是一个用户级线程对应一个内核线程,而线程之间的管理在内核外的函数库中实现。
3、在Linux内核2.6之前的版本中,进程是最主要的处理调度单元,并没支持内核线程机制。Linux 2.6内核支持clone()系统调用,从而实现共享地址空间的进程机制。因而Linux系统在1996年第一次获得线程的支持,当时所使用的函数库被称为LinuxThread。该函数库就使用clone()系统调用实现内核级的线程机制,在此前的Linux版本中在用户层实现POSIX线程库。
由Red Hat主导的本地化POSIX线程库(Native POSIX Thread Library,简称为NTPL),现在已经成为GNU C函数库的一部分,同时也成为Linux线程的标准。
4、线程属性
1)绑定属性
Linux中采用“一对一”的线程机制,也就是一个用户线程对应一个内核线程。绑定属性就是指一个用户线程固定地分配给一个内核线程,因为CPU时间片的调度是面向内核线程(也就是轻量级进程)的,因此具有绑定属性的线程可以保证在需要的时候总有一个内核线程与之对应。而与之对应的非绑定属性就是指用户线程和内核线程的关系不是始终固定的,而是由系统来控制分配的。
2)分离属性
分离属性是用来决定一个线程以什么样的方式来终止自己。在非分离情况下,当一个线程结束时,它所占用的系统资源并没有被释放,也就是没有真正的终止。只有当pthread_join()函数返回时,创建的线程才能释放自己占用的系统资源。而在分离属性情况下,一个线程结束时立即释放它所占有的系统资源。这里要注意的一点是,如果设置一个线程的分离属性,而这个线程运行又非常快,那么它很可能在pthread_create()函数返回之前就终止了,它终止以后还就可能将该线程号和系统资源移交给其他的线程使用,这可能会引起错误。
5、互斥量本质是一把锁,提供对共享资源的保护访问。
6、二进制信号量与互斥锁的区别
1)mutex:谁获得,谁释放,而信号量可以由其他线程释放。
2)mutex初始值为1,而信号量可0可1。
7、线程与轻进程
8、linux中使用进程实现线程,所以新创建的线程和源线程进程号可能不同。