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号。

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

  1. java线程池概念_Java 线程池概念、原理、简单实现

    线程池的思想概述 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结東了,这样频繁创建线程就会大大降低系 ...

  2. 线程池概念、线程池作用、线程池的四种创建方式

    线程池 1.1.什么是线程池? 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程.线程池中线程的数量通常完全取决于可用内存数量和应用程 ...

  3. linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...

    你写了一个简单的mandelbrot set程序,也就是说用ps命令行是可以看见多个线程,win32里同一个进程里各个线程之间是共享数据段的,win32的进程管理方式与unix上有着很大区别.adob ...

  4. Java中的线程基础篇-线程基本概念

    线程的概念.创建方式.生命周期.优缺点 一.基础知识 1. 进程.线程.协程 1.1 进程 1.2 线程 1.3 协程 2. 串行.并发.并行 2.1 串行 2.2 并发 2.3 并行 二.线程的创建 ...

  5. Java基础加强重温_08:线程不安全、线程同步、线程状态、线程状态切换、线程池(Executors类、newFixedThreadPool)、死锁、Lambda表达式、Stream

    摘要 Java基础加强重温_08: 线程安全(线程安全概念.线程不安全案例). 线程同步(同步代码块.同步方法.Lock锁,锁对象). 线程状态(new新建.Runnable可运行.Blocked锁阻 ...

  6. 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

    文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...

  7. Linux多线程实践(一)线程基本概念和理论

    线程概念 在一个程序里的一个运行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 对于每一个进程至少有一个运行线程; 进程  VS. 线 ...

  8. Linux 多线程(一)线程概念:线程概念、线程与进程、线程间的独有与共享、多线程与多进程、线程控制

    线程概念 线程与进程 线程间的独有与共享 多线程与多进程 线程控制 线程概念 什么是线程 线程是进程中的一条执行流,执行程序中的某部分代码.linux下没有具体实现的线程,只有库函数用pcb来实现的线 ...

  9. Linux下线程(LWP)的相关概念

    一.概念 线程:一个进程内部的控制序列.或者说在一个程序里的一个执行路线 首先明确一个概念,在Linux下是没有进程的控制块的,使用进程模拟的线程.一个进程中至少有一个线程.所以进程跟线程的数量是一对 ...

  10. [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)

    文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...

最新文章

  1. web.config加密解密批处理
  2. 实验干货分享:用Go语言实现分布式缓存开发之map
  3. 福建计算机及应用专业的大学,33所福建大学公布国家级/省级一流本科专业!
  4. 下列哪个适合做链栈_朋友圈人格图鉴:三天可见 vs 全部可见,哪个更适合做恋人?...
  5. thunderbrid设置中文
  6. 【多线程】创建多少线程才是合适的
  7. 如何准备 Java 初级和高级的技术面试
  8. An ac a day,keep wa away
  9. 视频教程-企业级多语言舆情爬虫系统-Go语言
  10. ARM64体系结构编程1-加载与存储指令
  11. TIT 计算机图形学 实验一 十二面体线框模型
  12. “鬼城”郑州郑东新区蝶变记,助力中部崛起
  13. ORACLE RAC 一节点出现Suspending MMON slave action kewrmrfsa_ for 82800 seconds
  14. 【转帖】lmbench的简单使用
  15. 2021年中国能源消费结构、生产结构及世界能源发展趋势分析:消费结构进一步优化,低成本技术将是企业的核心竞争力[图]
  16. 天气预报接口 心知天气
  17. Spring-框架-ClassUtils类isAssignable方法
  18. uniapp的checkbox样式修改
  19. PDF转word的免费在线工具推荐
  20. MySQL count()

热门文章

  1. 【语音隐写】基于matlab GUI LSB语音信号数字水印【含Matlab源码 619期】
  2. 【人脸识别】基于matlab ksvd字典学习人脸表情识别【含Matlab源码 460期】
  3. openai-gpt_OpenAI的GPT-3:货物崇拜编程人员的终结
  4. fatal error: libmemcached/memcached.h: No such file or directory
  5. linux中程序定时重启脚本,linux 程序定时重启脚本
  6. java优化技巧_Java 性能优化的五大技巧
  7. c语言 json_dumps,关于json.dumps中的参数,例如ensure_ascii
  8. python import as 实例化_python中import list,dictionary常量在class实例化时遇到的坑
  9. 事务影响懒加载 no session or session was closed
  10. vue-cli3.0升级失败,vue-cli卸载不掉,vue-cli升级不了3.0,