linux有线程的概念,Linux线程相关概念

POSIX Threads,通常简称为Pthreads,它是指开放系统接口标准―POSIXAPI。

如今,在很多类Unix的POSIX兼容操作系统上,如FreeBSD,NetBSD,OpenBSD,GNU/Linux,Mac OS X和Solaris等,都已实现Pthreads并且可用。

但在早期的Linux系统上,它所提供的线程机制LinuxThreads仅只是部分实现了Pthreads,具体来说,LinuxThreads是通过系统调用clone来实现的,并不是Linux内核真正提供支持,直到Linux 2.6时NPTL的加入为止。也就是说,在Linux 2.6以前,操作系统最小的调度单位是进程而不是线程。

LinuxThreads的主要开发者为大牛Xavier Leroy。LinuxThreads有一些缺点,比如信号处理、进程调度和进程间同步原语等方面(参考1),因此出现了

另外两个互相竞争的项目:一个IBM的组的项目叫做NGPT(Next Generation POSIX Threads,下一代POSIX线程),另一个组是由Red Hat程序员组成的。2003年中NGPT被放弃,几乎与此同时

(参考2)

关于这部分发展历史不做多说,反正就是在当前的Linux系统中,Pthreads是由NPTL实现的,下面逐一讨论几个主题。

1,NPTL的代码位置以及维护者

NPTL的实现代码位于glibc,从man pthreads可以看到,从glibc-2.3.2开始,NPTL已经可用,而从glibc-2.4开始,旧的LinuxThreads不再可用。

NPTL由glibc开发组持续发展和维护,这其中包括另一位大牛Ulrich Drepper。

2,NPTL的线程模型

在讨论这个问题之前需要先了解kernel thread(核心线程)和user thread(用户线程),其

分类标准主要是线程的调度者在核内还是在核外。前者更利于并发使用多处理器的资源,而后者则更多考虑的是上下文切换开销。

(参考1,参考6)

线程模型分为三种:1:1 (Kernel-level threading)、N:1 (User-level threading)和M:N (Hybrid threading)。

对于Linux系统而言,采用的是1:1线程模型,这意味着对于有N个用户线程的程序,就有N个核心线程与此一一对应,这也被认为是最容易用代码实现并且在实践中最高效的模型。

3,同一个进程的多个线程之间共享了哪些数据,各自单独拥有哪些数据。

共享数据(参考4):

程序指令(Process instructions)

大部分数据(Most data)

打开文件描述符(open files (descriptors))

信号与信号处理(signals and signal handlers)

当前工作目录(current working directory)

用户id和组id(User and group id)

单独享有(参考4):

线程id(Thread ID)

部分寄存器和栈指针(set of registers, stack pointer)

栈局部变量和返回地址(stack for local variables, return addresses)

信号掩码(signal mask)

调度优先级(priority)

返回值(Return value: errno)

实例:

可以看到三个线程的栈指针是不一样的。另外,我在上面的代码基础上做了一下改动,创建5个相同的线程,查看它们的rsp分别为:

上面第一行为线程1(即主线程)的rsp,然后依次为线程2、3、4、5、6的rsp,可以看到,它们各自的可用栈空间是不重叠的,每个栈大小为0×801000,即8196KB,这刚好匹配我的系统设置(各个栈之间应该是留了一页内存作为分割屏障):

设置栈大小为1024后,测试各个线程之间的rsp相差:

0x7ffff7fd5ca0 – 0x7ffff7ed4ca0 = 0×101000

即1028KB。

新开终端用ps命令查看:

PID和PPID相同,而LWP为thread ID,是各不相同的,NLWP表示number of threads,都为3,PSR列表示线程当前所在的cpu号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值