pthread线程解析
什么是线程
对于软件开发人员,独立于其主程序运行的“过程”就是一个线程。一个包含多个过程的主程序,所有这些过程能够被安排在操作系统的同时和/或独立运行。 这就是一个“多线程”程序。
要深入理解什么是线程首先我们要清楚的理解什么是进程,一个进程由操作系统创建,并且需要相当数量的“开销”。进程包含了程序有关的资源和程序执行状态的信息,包括:
1.进程ID,进程组ID,用户ID,以及用户组ID
2.进程环境
3.工作目录
4.程序指令
5.栈
5.堆
6.文件描述符
7.信号动作
8.共享库
9.进程间通信工具(消息队列 管道 信号量 共享内存)
上面那副图阐述了进程和线程之间的关系。线程存在于进程之中,并且使用进程的资源,但是线程能够由操作系统进行调度,并作为独立实体运行,这主要是因为它们仅复制使其能够作为可执行代码存在的基本资源。
线程独立的控制流是通过保留以下完成的:
- 堆栈指针
- 寄存器
- 计划属性(如策略或优先级)
- 一组挂起和阻塞的信号
- 线程具体数据
1.线程存在于进程之中,并且使用进程的资源。
2.线程拥有在自己的控制流直到父进程结束。
3.只复制能够独立运行的关键信息。
4.线程是轻量级的,因为大多数资源已经被分配给了他所属的进程。
什么是Pthread?
- 历史上,硬件供应商已经实现了自己的专有版本的线程。这些实现彼此大不相同,使程序员难以开发便携式线程应用程序。
- 为了充分利用线程提供的功能,需要一个标准化的编程接口。
- 对于UNIX系统,此接口由IEEE POSIX 1003.1c标准(1995)指定。
- 遵守这一标准的实现被称为POSIX线程,或Pthreads。
- 大多数硬件供应商现在除了专有的API之外还提供Pthreads。
- Pthreads被定义为一组C语言编程类型和过程调用,用pthread.h头文件/包含文件和线程库实现 - 尽管在某些实现中,该库可能是另一个库的一部分,如libc。
- 在高性能计算环境中考虑使用Pthread的主要动机是实现最佳性能。特别是,如果一个应用程序使用MPI进行节点间通信,则有可能通过使用Pthreads来提高性能。
- MPI库通常通过共享内存实现节点间任务通信,这涉及至少一个内存复制操作(进程处理)。
- 对于Pthreads,不需要中间内存副本,因为线程在单个进程中共享相同的地址空间。本身没有数据传输。它可以像传递一个指针一样有效。
- 在现代的多核机器中,pthreads非常适合并行编程,而且适用于并行编程的任何应用都适用于并行的pthread程序。
- 设计并行程序有许多考虑因素,如:
- 什么类型的并行编程模型要使用?
- 问题分割
- 负载均衡
- 通讯
- 数据依赖
- 同步和竞争条件
- 内存问题
- I / O问题
- 程序复杂性
- 程序员的努力/成本/时间
1.工作可以被多个同时运行的任务所替代
2.潜在的阻塞IO操作
3.在某些地方占据多个CPU周期,在其他地方不占。
4.必须响应异步事件
5.一些任务的重要性要远远高于另一些任务。
几种常见的多线程模型
1.Manager/worker模型:Manager线程处理输入并且把工作分解到其他worker任务。至少两种常见的Manager/worker模型,静态线程池和动态线程池。
2.流水线模型,一个程序被分解程多个独立的子操作,并且由独立的线程运行。类似汽车装配线。
3.对等模型:主线程创建其他线程之后,自己也参与到工作之中。
Pthread线程的一些局限
1.尽管Pthreads API是ANSI / IEEE标准,但不同平台上的实现方式可能不同。(在一个平台上运行良好的程序,可能在另一个平台下挂掉)
2.最大的线程数目以及每个线程的栈空间大小在设计程序是需要重要考虑的两个变量。