linux 没有线程的,,Linux 到现在还是没有线程呀?
Linux中的多线程编程可使用pthread库。它的用法相对简单,不过对于其内部的工作原理,相关的技术资料并不多见。本文将讨论Linux下的线程模型及其工作原理。 我们先从pthread库的应用示例开始。我们通常所用的pthread库是GNU的C库glibc的一部分,通常你可以在Linux的/lib目录找到名为libpthread-x.x.so(x.x是版本号)的库,这就是多线程编程时所需要的pthread库。pthread可看作是POSIX thread的简写,POSIX对线程定义了一系列的标准,而glibc的pthread库则是对POSIX线程标准的实现。 下面的代码示例了一个简单的多线程程序:
#include
#include
void* threadFunc(void* arg)
{
printf("I am running in sub thread.\n");
}
int main()
{
pthread_t tid;
pthread_create(&tid, NULL, threadFunc, NULL);
pthread_join(tid, NULL);
printf("I am running in main thread.\n");
return 0;
}
这个程序在链接时需要指定链接pthread库,否则将出现链接错误。这是因为pthread库相对标准C库libc.so来说,是一个单独的库,而libc则是默认被链接的。
下面的命令可顺利编译上面的代码,注意-l参数的使用,用来指定链接pthread库:
# gcc -o test thread.c –lpthread
上面的代码非常简单,仅仅是示例了使用pthread_create()函数创建了一个线程,对pthread库中函数的用法本文不作详细解释,不熟悉的读者可用man命令阅读相关文档。
glibc的pthread库是glibc利用Linux内核提供的系统调用来实现的线程库,对于2.4和2.6的内核,由于对线程的支持有所不同,其实现效率也有所差别。简言之,采用2.4及之前的内核的Linux系统通常使用较老的LinuxThreads项目提供的线程模型(当然这并不绝对,采用2.4内核的Redhat较早的试用了NPTL),而采用2.6内核的系统则通常采用新的NPTL项目提供的线程模型,后者的效率比前者要高得多,也更符合POSIX标准。
在Linux的内核中,进程是进行调度的最小单位,并没有真正的对线程的支持,可以说线程只是用户空间的概念,在内核中只能用进程来实现线程。一个进程的多个线程在内核中只是多个特殊的进程,它们虽然有各自的进程描述结构,却共享同一个代码上下文。在Linux上,这样的进程称为轻量级进程(Light weight process)。
同时,Linux内核提供了clone()系统调用,用来创建进程的一个拷贝,这个拷贝与被拷贝的进程共享相同的地址空间。LinuxThreads 项目正是使用这个调用来完全在用户空间模拟对线程的支持。这个任务在当时内核支持不够的条件下,具体的实现非常复杂。由于内核并没有线程组的概念,LinuxThreads模型只能在pthread库中,对每个进程下的线程组都增加一个额外的线程来进行管理,这就是LinuxThreads模型中著名的管理线程(Manager Thread)。这个管理进程负责对管理同一进程下的其他线程的创建、退出,资源的分配和回收,及线程切换等,非常复杂,开销也很大,而且一旦管理线程被杀死,其他线程都不能正确回收。另外,由于当时内核中缺乏对线程同步操作的支持,因此pthread库中的互斥量mutex等只能采用信号来实现,效率非常低。LinuxThreads模型在某些方面也不符合POSIX标准,比如用它在同一进程中创建的线程,都有自己唯一的进程ID,而不是同一个ID,而且接收信号的时候也只能按线程接收。
正是由于LinuxThreads模型的这些问题,Redhat的一些开发人员发起了NPTL(Native POSIX Thread Library)项目,来改进pthread线程库的这些缺点。目前基于NPTL模型实现的pthread线程库已被多数2.6内核的Linux系统采用,你可以用下面的命令来查看所使用的线程模型是NPTL还是LinuxThreads:
# getconf GNU_LIBPTHREAD_VERSION
如果得到的结果是类似于“NPTL 2.5”则是使用NPTL,如果是“linuxthreads-0.10”则是LinuxThreads。
NPTL模型仍然采用clone()系统调用,在内核中还是通过进程来模拟线程,不过对LinuxThreads的一些主要缺点有很大的改进:
• 在内核中改进了clone()系统调用并引入新的exit_group()系统调用,优化了线程创建和结束,并且使得pthread库中不再需要管理线程,减少了很多开销。
• 在内核中引入新的线程同步原语Futex,并基于Futex来实现线程同步操作如互斥量、条件变量等,改进了原来LinuxThreads基于信号实现时的低效率。
• 符合POSIX标准:发送信号时能发送到同一进程下的所有线程;getpid()会为同一进程下的所有线程返回相同的进程ID。
linux 没有线程的,,Linux 到现在还是没有线程呀?相关推荐
- 通用线程: 学习 Linux LVM
为什么80%的码农都做不了架构师?>>> 通用线程: 学习 Linux LVM "逻辑卷管理"为存储器管理带来的魔力 Daniel Robbins ( dr ...
- 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )
文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...
- linux的线程要makefile,Linux内核线程之父pid=2的kthreadd线程
这里所谓的内核线程,实际上是由kernel_thread函数创建的一个进程,有自己独立的task_struct结构并可被调度器调度,这种进程的特殊之处在于它只在内核态运行. 在Linux source ...
- java线程和linux线程,Java线程与Linux内核线程的映射关系
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上仍是轻量级进程(LWP). Java里的线程是由JVM来管理的,它如何对应到操做 ...
- linux线程并不真正并行,Linux系统编程学习札记(十二)线程1
Linux系统编程学习笔记(十二)线程1 线程1: 线程和进程类似,但是线程之间能够共享更多的信息.一个进程中的所有线程可以共享进程文件描述符和内存. 有了多线程控制,我们可以把我们的程序设计成为在一 ...
- linux 线程pthread_detach,linux线程之pthread_join和pthread_detach
在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...
- OS / Linux / clone、fork、vfork 与 pthread_create 创建线程有何不同
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的过程就是这些数 ...
- 【Linux系统编程】Linux线程浅析
00. 目录 文章目录 00. 目录 01. 进程和线程区别 02. LinuxThreads 03. NPTL 04. NGPT 05. 附录 01. 进程和线程区别 在许多经典的操作系统教科书中, ...
- 【Linux系统编程】Linux 线程浅析
进程和线程的区别与联系 在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至 ...
最新文章
- 关于mtl_transactions_interface表序列
- maven集成tomcat进行web应用测试
- 如何自学python数据分析-如何轻松学习Python数据分析?
- JS 几种数据类型及其转换
- 华为P40 Pro Plus:徕卡五摄加持 称霸DxOMark几无悬念
- mysql intt默认值_MySQL如何处理隐式默认值
- azure云数据库_在Azure SQL数据库中实现动态数据屏蔽
- 使用jQuery.form插件,实现完美的表单异步提交
- 三维随机介质模型matlab,基于随机介质理论的复合材料孔隙二维形貌几何仿真
- python实现匿名发邮件_Python 实现邮件发送功能(初级)
- 计算机键盘功能教案,键盘认识教案
- 电视盒子显示ntp服务器异常,云计算-更换VRM主节点所在服务器主板后,出现VRM与NTP服务器状态异常的处理方法...
- 全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题]
- Html5 文件上传
- Linux系统调用七、与文件权限有关的系统API串讲
- EP21 Activity在非正常行为下的数据保存和恢复
- 区块链安全100问 | 第七篇:智能合约审计流程及审计内容
- Spring Cloud Eureka整合 Seata 实现分布式事务
- java用一张一元票换一分,把一元纸币换成一分、二分、五分硬币(每种至少一枚),有多少种换法?使用递归...
- 如何应对客户投诉,对上游部门如何投诉
热门文章
- 解决Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz国内下载速度缓慢的问题
- 稠密峰值聚类 - Science2014
- c++与Delphi中的类型转换
- Beej网络编程指南《三》
- P3 计算机硬件的基本组成
- Git完整入门教程(从0开始)
- 在 Windows 上部署 gitblit
- 程序员面试系列——有符号数的溢出
- C语言实现通用链表初步(一)
- 「 Modbus-RTU报文解析」解析03、06、10功能码报文示例