来自 美高梅4858mgm 2019-12-11 23:03 的文章
当前位置: 美高梅4858官方网站 > 美高梅4858mgm > 正文

美高梅4858mgmfound问题与解决,线程模型的比较

在FC6系统中从源码安装MySQL时遇上标题如下,提醒Linux thread not found的荒唐,代码如下:

Linux 线程完成机制剖判 Linux 线程完成机制深入分析  Linux 线程模型的相比较:LinuxThreads 和 NPTL

 

从今三十七线程编制程序的定义出今后 Linux 中的话,Linux 多线应用的开垦进取总是与八个难题脱不开干系:宽容性、功用。本文从线程模型入手,通过解析当前 Linux 平台上最流行的 LinuxThreads 线程库的完毕及其不足,描述了 Linux 社区是怎么着对待和消除宽容性和频率那五个难题的。

#./configure --prefix=/usr/local/mysql   …   …   checking "LinuxThreads"... "Not found"   configure: error: This is a linux system and Linuxthreads was not found. On linux Linuxthreads should be used.    Please install Linuxthreads (or a new glibc) and try again.    See the Installation chapter in the Reference Manual for more information. 

意气风发.底子学问:线程和进度

安份守己教科书上的定义,进度是财富管理的细微单位,线程是程序施行的纤维单位。在操作系统设计上,从进度演化出线程,最要紧的目标就是越来越好的支撑SMP以至裁减(进度/线程)上下文切换开支。

不管根据什么样的分法,二个经过起码需求一个线程作为它的吩咐推行体,进度管理着财富(譬喻cpu、内存、文件等等),而将线程分配到有些cpu上进行。一个进程当然能够享有多少个线程,当时,要是经过运营在SMP机器上,它就能够并且利用多少个cpu来实践顺序线程,到达最大程度的人机联作,以提升效能;同有时候,就算是在单cpu的机械上,接受十二线程模型来统筹程序,正如当年利用多进度模型取代单进度模型同样,使设计更简短、功效更康健,程序的施行功效也越来越高,比如利用多少个线程响应多个输入,而那时候多线程模型所达成的职能实在也足以用多进度模型来贯彻,而与前者相比较,线程的上下文切换花销就比进程要小多了,从语义上来讲,相同的时间响应七个输入那样的效应,实际上便是分享了除cpu以外的富有财富的。

本着线程模型的两大要思,分别支付出了骨干级线程和顾客级线程两种线程模型,分类的行业内部首借使线程的调解者在核内依旧在核外。前面多少个更便于并发使用多微处理器的资源,而后面一个则越来越多着想的是上下文切换开支。在眼下的商用系统中,平常都将两端结合起来使用,既提供基本线程以满意smp系统的急需,也协助用线程库的方法在客户态达成另生龙活虎套线程机制,那时八个主导线程相同的时候成为多个客户态线程的调解者。正如广大技巧同样,"混合"平日都能拉动越来越高的频率,但同不日常候也推动越来越大的贯彻难度,出于"轻巧"的布置性思路,Linux从黄金年代开首就从未有过贯彻混合模型的安插,但它在达成上选用了另后生可畏种思路的"混合"。

在线程机制的宛在方今贯彻上,能够在操作系统内核上实现线程,也得以在核外实现,前面一个确定须求核内起码达成了经过,而后面一个则相符须求在核内同不时间也支撑进程。宗旨级线程模型显著供给前面一个的支撑,而客户级线程模型则不必然依据后面一个实现。这种区别,正如前所述,是二种分类方法的正经不意气风发带来的。

当核内既支持进程也援助线程时,就足以兑现线程-进度的"多对多"模型,即一个进度的某部线程由核内调整,而与此同一时候它也得以视功效户级线程池的调节者,选拔适当的顾客级线程在其空间中运营。那正是日前提到的"混合"线程模型,既可知足多管理机系统的内需,也足以最大限度的减少调解开支。绝大多数生意操作系统(如Digital Unix、Solaris、Irix)都选择的这种能够完全贯彻POSIX1003.1c规范的线程模型。在核外完成的线程又能够分为"风流洒脱对风华正茂"、"多对大器晚成"三种模型,前面叁个用三个基本进度(恐怕是轻量进度)对应多少个线程,将线程调治等同于进度调治,交给大旨达成,而后人则一心在核外实现八十多线程,调节也在顾客态达成。后面一个正是前方提到的单独的客商级线程模型的兑现方式,鲜明,这种核外的线程调节器实际上只须要做到线程启动栈的切换,调节费用相当小,但还要因为基本时限信号(不论是同步的照旧异步的)都以以进度为单位的,因此不能够稳固到线程,所以这种完毕情势无法用来多微机系统,而这几个须求正变得尤为大,由此,在实际中,纯顾客级线程的兑现,除算法商讨目标以外,差不离已经破灭了。

Linux内核只提供了轻量进度的帮忙,节制了更迅捷的线程模型的完成,但Linux注重优化了经过的调节开支,一定水准上也弥补了那风流罗曼蒂克弱点。近年来最流行的线程机制LinuxThreads所接纳的就是线程-进度"意气风发对意气风发"模型,调整交给宗旨,而在客户级达成三个囊括非确定性信号管理在内的线程管理机制。Linux-LinuxThreads的运维机制便是本文的汇报入眼。

 

回页首

在网络随便搜一下注重字“Linuxthreads was not found”能够找到非常多荣辱与共的帖子,但基本上都未曾提供整机建设方案。

二.Linux 2.4水源中的轻量进度实现

早先时代的经过定义都满含程序、能源及其试行三片段,当中等射程序常常指代码,能源在操作系统层面上平常包涵内部存款和储蓄器财富、IO财富、功率信号管理等局地,而前后相继的试行平常精通为推行上下文,包罗对cpu的据有,后来向上为线程。在线程概念现身从前,为了减弱进程切换的开支,操作系统设计者逐步改善进程的概念,逐步允许将经过所占有的能源从其核心分离出来,允许一些进度分享生龙活虎部分能源,比方文件、能量信号,数据内部存款和储蓄器,以至代码,那就向上出轻量进度的概念。Linux内核在2.0.x版本就早就落到实处了轻量进度,应用程序可以通过三个联结的clone(卡塔尔国系统调用接口,用差别的参数钦点创设轻量进程照旧普通进度。在基本中,clone(卡塔尔(英语:State of Qatar)调用经过参数字传送递和解释后会调用do_fork(卡塔尔,那么些核内函数同一时间也是fork(卡塔尔(قطر‎、vfork(卡塔尔系统调用的最后兑现

<linux-2.4.20/kernel/fork.c>
int do_fork(unsigned long clone_flags, unsigned long stack_start, 
struct pt_regs *regs, unsigned long stack_size)

其中的clone_flags取自以下宏的"或"值:

<linux-2.4.20/include/linux/sched.h>
#define CSIGNAL      0x000000ff  
/* signal mask to be sent at exit */
#define CLONE_VM    0x00000100 
/* set if VM shared between processes */
#define CLONE_FS        0x00000200  
/* set if fs info shared between processes */
#define CLONE_FILES     0x00000400  
/* set if open files shared between processes */
#define CLONE_SIGHAND  0x00000800 
/* set if signal handlers and blocked signals shared */
#define CLONE_PID    0x00001000  
/* set if pid shared */
#define CLONE_PTRACE  0x00002000  
/* set if we want to let tracing continue on the child too */
#define CLONE_VFORK  0x00004000  
/* set if the parent wants the child to wake it up on mm_release */
#define CLONE_PARENT  0x00008000  
/* set if we want to have the same parent as the cloner */
#define CLONE_THREAD  0x00010000  
/* Same thread group? */
#define CLONE_NEWNS  0x00020000  /* New namespace group? */
#define CLONE_SIGNAL   (CLONE_SIGHAND | CLONE_THREAD)

在do_fork()中,不同的clone_flags将促成不相同的展现,对于LinuxThreads,它选拔(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)参数来调用clone(卡塔尔(قطر‎创设"线程",表示分享内部存款和储蓄器、共享文件系统访谈计数、分享文件陈诉符表,以致分享信号管理方式。本节就照准这多少个参数,看看Linux内核是如何落到实处那些能源的分享的。

1.CLONE_VM

do_fork(卡塔尔(قطر‎须要调用copy_mm()来设置task_struct中的mm和active_mm项,这两个mm_struct数据与经过所提到的内部存款和储蓄器空间相呼应。假诺do_fork(卡塔尔国时钦赐了CLONE_VM开关,copy_mm(卡塔尔将把新的task_struct中的mm和active_mm设置成与current的同等,同有的时候候进步该mm_struct的使用者数目(mm_struct::mm_users)。也正是说,轻量级进度与父进度分享内部存款和储蓄器地址空间,由下图表示能够看来mm_struct在进度中的地位:

上边来深入分析一下下面的失误景况,并就此提供叁个缓慢解决方案。从上边的失误能够很显然的收看是说系统缺乏线程库。未有线程,Linux能够运转吧?呵呵,那本来十一分。既然未有linuxthread这今后用的是哪些啊?

美高梅4858mgm 1

2.CLONE_FS

task_struct中利用fs(struct fs_struct *)记录了经过四方文件系统的根目录和当前目录消息,do_fork()时调用copy_fs(卡塔尔国复制了那些组织;而对此轻量级进度则仅增添fs->count计数,与父进程分享相仿的fs_struct。也正是说,轻量级进度未有单独的文件系统相关的音讯,进度中其它八个线程改造当前目录、根目录等新闻都将直接影响到此外线程。

3.CLONE_FILES

三个历程恐怕张开了有个别文本,在经过组织task_struct中利用files(struct files_struct *)来保存进程展开的公文构造(struct file)消息,do_fork(卡塔尔中调用了copy_files(卡塔尔(英语:State of Qatar)来管理这几个历程属性;轻量级进度与父进程是分享该组织的,copy_files(卡塔尔时仅增添files->count计数。那豆蔻年华分享使得其余线程都能访谈进程所保险的展开文件,对它们的操作会直接浮现到过程中的别的线程。

4.CLONE_SIGHAND

每多个Linux进程都足以自行定义对功率信号的管理格局,在task_struct中的sig(struct signal_struct)中运用七个struct k_sigaction结构的数组来保存这几个结构音讯,do_fork()中的copy_sighand(卡塔尔国担当复制该新闻;轻量级进度不开展复制,而单独扩张signal_struct::count计数,与父进程分享该组织。也便是说,子进度与父进程的数字信号管理方式完全雷同,何况能够互相校正。

do_fork(卡塔尔国中所做的劳作相当多,在那不详细描述。对于SMP系统,全数的长河fork出来后,都被分配到与父进度相似的cpu上,从来到该进程被调整时才交易会开cpu选取。

就算Linux帮忙轻量级进度,但并不可能说它就扶助中央级线程,因为Linux的"线程"和"进度"实际上处于三个调解档案的次序,分享三个过程标志符空间,这种范围使得不容许在Linux上达成完全意义上的POSIX线程机制,因此不菲的Linux线程库达成尝试都只可以尽量达成POSIX的绝大部分语义,并在功用上尽量靠拢。

 

回页首

答案是NPTL

三.LinuxThread的线程机制

Linux就以此范儿 第15章 多种火器

   在开班时,Linux是全然的Unix克隆,在根本中并不帮助线程。不过它确实能够透过clone(卡塔尔国系统调用将经过作为调解的实体。那个调用创造了调用过程的叁个拷贝,这一个拷贝与调用进度分享肖似之处空间。LinuxThreads万案使用那几个调用来完全在客户空间模拟对线程的支撑。不幸的是,那个方案有太多短处,让Windows总是有生机勃勃种“一贯被追赶从未被当先”的骄傲。

LinuxThreads是日前Linux平台上利用最为布满的线程库,由Xavier Leroy(Xavier.Leroy@inria.fr卡塔尔(قطر‎担当开垦成功,并已绑定在GLIBC(glibc库)中国发展银行它所完结的正是依据大旨轻量级进度的"生机勃勃对生龙活虎"线程模型,二个线程实体对应七个宗旨轻量级进度,而线程之间的管理在核外函数库中落到实处。

NPTL是后生可畏种1:1的线程方案,八个线程会与底蕴的三个调治实体生机勃勃大器晚成对应,线程的创
建和回笼都由底工担当,这样就能够避炒乌里黑LinuxThreads的整整难点。那是大器晚成种最轻松易行的创建线程实现方案。但是产业界还会有别的叁个备选方案,就是m:n方案。这种方案中顾客线程要多于调整实体。假如NPTL接纳以这种艺术贯彻的话,会使得线程上下文切换越来越快,因为它防止了系统调用。可是m:n的方案是以种类复杂度为代价的。既然Linux的骨架里有个别“笨”,复杂性的东西是搞不来的,所以NPTL采取的仍是1:1的线程方案。

NPTL是在Linux 2.6内核初叶引进的。叁个相比较风趣的地点是,Linux内核本人的多职责调节实体被叫做“内核线程”。并且平日常有人会十二分欢快的说,Linux已经跟Windows 同样了,是以线程为调解实体的。的确不假,从2.6开首,线程是Linux原生协理的性状了,唯独与Windows照旧有极大差其余。

作为剔除过时的LinuxThreads 库的贰个步骤,在 Fedora Core 5 test1中编译和一而再的代码未来自行使用NPTL头文件和库。在过去的版本中,从 Red Hat Linux 9 开头,暗中同意的线程模型是LnuxThreads,因为接口是最通用的。NPTL 接口的帮助和益处在于,线程打消的拍卖更加快 (使用 -fexception 参数时,尽管在 C 代码中卡塔尔国。现在附加的接口也已可用,无需特别的编写翻译器和连接器参数。

1.线程陈说数据构造及实现限定

LinuxThreads定义了三个struct _pthread_descr_struct数据布局来陈述线程,并采纳全局数组变量__pthread_handles来描述和援用进度所辖线程。在__pthread_handles中的前两项,LinuxThreads定义了三个全局的种类线程:__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数组将如下图所示:

上面言归正转,怎么着缓和?

美高梅4858mgm 2

新创造的线程将率先在__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,1024;私有数据释放时允许实践的操作数,LinuxThreads与POSIX风度翩翩致,定义PTHREAD_DESTRUCTOR_ITERATIONS为4;每经过的线程数,POSIX定义为64,LinuxThreads增大到1024(PTHREAD_THREADS_MAX);线程运行栈最小空间尺寸,POSIX未钦点,LinuxThreads使用PTHREAD_STACK_MIN,16384(字节)。

能够修正程序去支撑NPTL,也得以在编写翻译时累计对原有thread库的支撑。作者选择了前者,那样能够不动MySql的源代码。在mysql手册中搜关键字thread,能够查到在Chapter 2. Installing and Upgrading MySQL。

2.拘禁线程

而且管理线程只好在四个CPU上运转,鲜明不适合现在的多核CPU。 Linux就以此范儿 第15章 各类火器

"后生可畏对大器晚成"模型的补益之一是线程的调整由基本达成了,而别的诸如线程废除、线程间的一同等专门的学问,都以在核外线程库中完毕的。在LinuxThreads中,特地为每三个进度组织了一个管理线程,负担管理线程相关的管总管业。当进度第贰遍调用pthread_create(卡塔尔(英语:State of Qatar)创制三个线程的时候就能够创设(__clone(卡塔尔)并运行拘系线程。

在三个历程空间内,管理线程与其他线程之间通过风流浪漫对"管理管道(manager_pipe[2])"来电视发表,该管道在成立管理线程以前创制,在功成名就运转了保管线程之后,管理管道的读端和写端分别赋给多少个全局变量__pthread_manager_reader和__pthread_manager_request,之后,各样客商线程都经过__pthread_manager_request向管理线程发必要,但拘留线程自身并不曾直接行使__pthread_manager_reader,管道的读端(manager_pipe[0])是作为__clone(卡塔尔的参数之一传给管理线程的,管理线程的劳作首要就是监听管道读端,并对从当中抽出的伏乞作出反应。

创制处理线程的流水生产线如下所示: 
(全局变量pthread_manager_request初值为-1)

2.8.5. MIT-pthreads Notes

美高梅4858mgm 3

初阶化甘休后,在__pthread_manager_thread中记录了轻量级进度号甚至核外分配和保管的线程id,2*PTHREAD_THREADS_MAX+1那个数值不会与其他正规顾客线程id冲突。管住线程作为pthread_create(卡塔尔(英语:State of Qatar)的调用者线程的子线程运营,而pthread_create(卡塔尔所创办的万分客户线程则是由管理线程来调用clone(卡塔尔(英语:State of Qatar)创设,因而实际是扣押线程的子线程。(此处子线程的概念应该当作子进程来理解。)

__pthread_manager(卡塔尔国正是拘留线程的主循环所在,在展开生龙活虎多元开端化工作后,走入while(1卡塔尔循环。在循环中,线程以2秒为timeout查询(__poll(卡塔尔(قطر‎)处理管道的读端。在拍卖诉求前,检查其父线程(也正是创办manager的主线程)是还是不是已退出,假若已脱离就退出整个经过。假诺有分离的子线程须要清理,则调用pthread_reap_children()清理。

下一场才是读取管道中的央浼,依照须求类型实施相应操作(switch-case)。具体的呼吁管理,源码中相比较清楚,这里就不赘述了。

If your system does not provide native thread support, you should build MySQL using the MIT-pthreads package.    This includes older FreeBSD systems, SunOS 4.x, Solaris 2.4 and earlier, and some others. See Section 2.1.1, “Operating Systems Supported by MySQL”.   Beginning with MySQL 4.0.2, MIT-pthreads is no longer part of the source distribution.    If you require this package, you need to download it separately from http://www.mysql.com/Downloads/Contrib/pthreads-1_60_beta6-mysql.tar.gz   After downloading, extract this source archive into the top level of the MySQL source directory.    It creates a new subdirectory named mit-pthreads. 

3.线程栈

在LinuxThreads中,管理线程的栈和客商线程的栈是抽离的,管理线程在进程堆中经过malloc(卡塔尔(英语:State of Qatar)分配三个THREAD_MANAGER_STACK_SIZE字节的区域作为友好的运营栈。

客商线程的栈分配办公室法随着系统布局的不等而不一样,首要根据八个宏定义来分歧,多少个是NEED_SEPARATE_REGISTER_STACK,那特个性仅在IA64阳台上采纳;另贰个是FLOATING_STACK宏,在i386等个别平台上选择,那个时候客商线程栈由系统调整具体地点并提供珍视。与此同期,客商还足以由此线程属性布局来内定使用客户自定义的栈。因篇幅所限,这里只好分析i386平台所使用的二种栈社团办公室法:FLOATING_STACK方式和顾客自定义格局。

在FLOATING_STACK方式下,LinuxThreads利用mmap(卡塔尔(英语:State of Qatar)从根本空间中分配8MB空间(i386系统缺省的最大栈空间大小,假使有运营限定(rlimit),则依据运转限定设置),使用mprotect(卡塔尔(قطر‎设置个中第意气风发页为非访谈区。该8M空间的意义分配如下图:

从上可以看来:只要下到mit-thread源码就足以了。但不清楚干什么官方网站上业已远非下了的了(笔者又找了二个官方网站的镜像仍旧还未有,忧愁ing卡塔尔(英语:State of Qatar)。再留心看一下上边,只是将线程源码放到MySql源码目录的根目录下以mit-pthreads命名的目录。官方还未协和去下叁个也是同生龙活虎的,只要解压后放置上述任务就可了。

美高梅4858mgm 4

低地址被有限扶持的页面用来监测栈溢出。

对于顾客钦定的栈,在服从指针对界后,设置线程栈顶,并考虑出栈底,不做掩护,精确性由客户自身保障。

无论哪个种类集体章程,线程描述布局总是坐落于栈顶西濒商旅的任务。

本文由美高梅4858官方网站发布于美高梅4858mgm,转载请注明出处:美高梅4858mgmfound问题与解决,线程模型的比较

关键词: