linux线程操作命令 linux系统线程( 三 )


__pthread_manager()就是管理线程的主循环所在,在进行一系列初始化工作后,进入while(1)循环 。在循环中,线程以2秒为 timeout查询(__poll())管理管道的读端 。在处理请求前 , 检查其父线程(也就是创建manager的主线程)是否已退出,如果已退出就退出 整个进程 。如果有退出的子线程需要清理 , 则调用pthread_reap_children()清理 。
然后才是读取管道中的请求,根据请求类型执行相应操作(switch-case) 。具体的请求处理 , 源码中比较清楚,这里就不赘述了 。
3.线程栈
在LinuxThreads中,管理线程的栈和用户线程的栈是分离的,管理线程在进程堆中通过malloc()分配一个THREAD_MANAGER_STACK_SIZE字节的区域作为自己的运行栈 。
用户线程的栈分配办法随着体系结构的不同而不同,主要根据两个宏定义来区分,一个是NEED_SEPARATE_REGISTER_STACK,这个属 性仅在IA64平台上使用;另一个是FLOATING_STACK宏 , 在i386等少数平台上使用,此时用户线程栈由系统决定具体位置并提供保护 。与此同 时,用户还可以通过线程属性结构来指定使用用户自定义的栈 。因篇幅所限,这里只能分析i386平台所使用的两种栈组织方式:FLOATING_STACK 方式和用户自定义方式 。
在FLOATING_STACK方式下,LinuxThreads利用mmap()从内核空间中分配8MB空间(i386系统缺省的最大栈空间大?。?如 果有运行限制(rlimit),则按照运行限制设置),使用mprotect()设置其中第一页为非访问区 。该8M空间的功能分配如下图:
图4 栈结构示意
低地址被保护的页面用来监测栈溢出 。
对于用户指定的栈,在按照指针对界后,设置线程栈顶,并计算出栈底,不做保护,正确性由用户自己保证 。
不论哪种组织方式 , 线程描述结构总是位于栈顶紧邻堆栈的位置 。
4.线程id和进程id
每个LinuxThreads线程都同时具有线程id和进程id,其中进程id就是内核所维护的进程号,而线程id则由LinuxThreads分配和维护 。
关于linux线程操作命令和linux系统线程的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

推荐阅读