linux下线程属性常用操作有哪些LinuxThread的线程机制
LinuxThreads是目前Linux平台上使用最为广泛的线程库linux调用线程的命令,由Xavier Leroy (Xavier.Leroy@inria.fr) 负责开发完成linux调用线程的命令,并已绑定在GLIBC中发行 。它所实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程 , 而线程之间的 管理在核外函数库中实现 。
1.线程描述数据结构及实现限制
LinuxThreads定义了一个struct _pthread_descr_struct数据结构来描述线程,并使用全局数组变量 __pthread_handles来描述和引用进程所辖线程 。在__pthread_handles中的前两项,LinuxThreads定义了两个全 局的系统线程linux调用线程的命令:__pthread_initial_thread和__pthread_manager_thread,并用 __pthread_main_thread表征__pthread_manager_thread的父线程(初始为 __pthread_initial_thread) 。
struct _pthread_descr_struct是一个双环链表结构,__pthread_manager_thread所在的链表仅包括它 一个元素 , 实际上,__pthread_manager_thread是一个特殊线程,LinuxThreads仅使用了其中的errno、p_pid、 p_priority等三个域 。而__pthread_main_thread所在的链则将进程中所有用户线程串在了一起 。经过一系列 pthread_create()之后形成的__pthread_handles数组将如下图所示:
图2 __pthread_handles数组结构
新创建的线程将首先在__pthread_handles数组中占据一项,然后通过数据结构中的链指针连入以__pthread_main_thread为首指针的链表中 。这个链表的使用在介绍线程的创建和释放的时候将提到 。
LinuxThreads遵循POSIX1003.1c标准,其中对线程库的实现进行了一些范围限制 , 比如进程最大线程数,线程私有数据区大小等等 。在 LinuxThreads的实现中,基本遵循这些限制 , 但也进行了一定的改动,改动的趋势是放松或者说扩大这些限制,使编程更加方便 。这些限定宏主要集中 在sysdeps/unix/sysv/linux/bits/local_lim.h(不同平台使用的文件位置不同)中,包括如下几个:
每进程的私有数据key数 , POSIX定义_POSIX_THREAD_KEYS_MAX为128,LinuxThreads使用 PTHREAD_KEYS_MAX,1024linux调用线程的命令;私有数据释放时允许执行的操作数,LinuxThreads与POSIX一致 , 定义 PTHREAD_DESTRUCTOR_ITERATIONS为4;每进程的线程数,POSIX定义为64,LinuxThreads增大到1024 (PTHREAD_THREADS_MAX);线程运行栈最小空间大?。琍OSIX未指定 , LinuxThreads使用 PTHREAD_STACK_MIN,16384(字节) 。
2.管理线程
"一对一"模型的好处之一是线程的调度由核心完成了,而其他诸如线程取消、线程间的同步等工作,都是在核外线程库中完成的 。在LinuxThreads 中,专门为每一个进程构造了一个管理线程,负责处理线程相关的管理工作 。当进程第一次调用pthread_create()创建一个线程的时候就会创建 (__clone())并启动管理线程 。
在一个进程空间内,管理线程与其他线程之间通过一对"管理管道(manager_pipe[2])"来通讯,该管道在创建管理线程之前创建,在成功启动 了管理线程之后,管理管道的读端和写端分别赋给两个全局变量__pthread_manager_reader和 __pthread_manager_request,之后,每个用户线程都通过__pthread_manager_request向管理线程发请求,但管理线程本身并没有直接使用__pthread_manager_reader,管道的读端(manager_pipe[0])是作为__clone ()的参数之一传给管理线程的,管理线程的工作主要就是监听管道读端,并对从中取出的请求作出反应 。
创建管理线程的流程如下所示:
(全局变量pthread_manager_request初值为-1)
图3 创建管理线程的流程
初始化结束后,在__pthread_manager_thread中记录了轻量级进程号以及核外分配和管理的线程id, 2*PTHREAD_THREADS_MAX+1这个数值不会与任何常规用户线程id冲突 。管理线程作为pthread_create()的调用者线程的 子线程运行,而pthread_create()所创建的那个用户线程则是由管理线程来调用clone()创建,因此实际上是管理线程的子线程 。(此处子 线程的概念应该当作子进程来理解 。)
推荐阅读
- 怎么改路由器重启时间限制,路由器重新调整
- 二叉树建立java代码,先序建立二叉树代码
- 微信公众号粉丝线上互动,微信公众号粉丝线上互动怎么做
- 取余函数python 取余函数matlab
- 新款什么电视较好,新款什么电视较好用
- ubuntudhcp服务器,ubuntu20 dhcp
- 直播射箭虎牙主播,虎牙射手主播
- c语言函数运用实例 c语言函数用法举例
- python数组点除,Python循环写入数组