添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

(一)、N:1用户线程模型

“线程实现”建立在“进程控制”机制之上,由用户空间的程序库来管理。OS内核完全不知道线程信息。这些线程称为用户空间线程。这些线程都工作在“进

程竞争范围”(process contention scope):各个线程在同一进程竞争“被调度的CPU时间”(但不直接和其他进程中的线程竞争)。

在N:1线程模型中,内核不干涉线程的任何生命活动,也不干涉同一进程中的线程环境切换。

在N:1线程模型中,一个进程中的多个线程只能调度到一个CPU,这种约束限制了可用的并行总量。

第二个缺点是如果某个线程执行了一个“阻塞式”操作(如read),那么,进程中的所有线程都会阻塞,直至那个操作结束。为此,一些线程的实现是为

这些阻塞式函数提供包装器,用非阻塞版本替换这些系统调用,以消除这种限制。

(二)、1:1核心线程模型 pthread 线程库 --NPTL(Native POSIX Threading Library)

在1:1核心线程模型中,应用程序创建的每一个线程(也有书称为LWP)都由一个核心线程直接管理。OS内核将每一个核心线程都调到系统CPU上,

因此,所有线程都工作在“系统竞争范围”(system contention scope):线程直接和“系统范围”内的其他线程竞争。

这种线程的创建与调度由内核完成,因为这种线程的系统开销比较大(但一般来说,比进程开销小)

(三)、N:M混合线程模型 NGPT(Next Generation POSIX Threads)

N:M混合线程模型提供了两级控制,将用户线程映射为系统的可调度体以实现并行,这个可调度体称为轻量级进程(LWP:light weight process),LWP 再一一映射到核心线程。如下图所示。OS内核将每一个核心线程都调到系统CPU上,因此,所有线程都工作在“系统竞争范围”。

按照2003年3月NGPT官方网站上的通知,NGPT考虑到NPTL日益广泛地为人所接受,为避免不同的线程库版本引起的混乱,今后将不再进行进一步开发,而今进行支持性的维护工作。也就是说,NGPT已经放弃与NPTL竞争下一代Linux POSIX线程库标准。

二、posix 线程概述

我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候

线程就派上了用场,比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文

件,等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门负责与用户交互,另外几个线

程每个线程负责和一个网络主机通信。

以前我们讲过,main函数和信号处理函数是同一个进程地址空间中的多个控制流程,多线程也是如此,但是比信号处理函数更加灵活,信号处理函数的

控制流程只是在信号递达时产生,在处理完信号之后就结束,而多线程的控制流程可以长期并存,操作系统会在各线程之间调度和切换,就像在多个进

程之间调度和切换一样。由于同一进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程

中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:

文件描述符表

每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)

当前工作目录

用户id和组id


但有些资源是每个线程各有一份的:

上下文,包括各种寄存器的值、程序计数器和栈指针

errno变量

信号屏蔽字

调度优先级

我们将要学习的线程库函数是由POSIX标准定义的,称为POSIX thread或者pthread。在Linux上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项。

注: linux 2.6 以后的线程就是 由用户态的 pthread 库实现的 . 使用 pthread 以后 , 在用户看来 , 每一个 task_struct 就对应一个线程 , 而一组线程以及它们所共同引用的一组资源就是一个进程 . 在linux 2.6中, 内核有了线程组的概念, task_struct结构中增加了一个tgid(thread group id)字段. getpid(获取进程ID)系统调用返回的也是tast_struct中的tgid, 而tast_struct中的pid则由gettid系统调用来返回。 标识套接字。包含套接字相关的信息,包括指向 TCB 的指针。存储连接状态、IP地址、端口号等关键信息。bind() 函数 通过文件描述符查找套接字结构,然后将IP地址和端口号设置进去,最终在TCB中反映这些信息。这确保了在TCP连接建立和数据传输过程中使用正确的地址和端口。listen() 函数 :将套接字的状态设置为 LISTEN,并创建一个连接请求队列。传输控制块(TCB):在调用 listen() 时,TCB 中的状态字段被更新为 LISTEN,表示该套接字正在监听传入的连接请求。 什么是 线程 线程 是参与系统调度的最小单位。它被包含在进程之中,是进程中的实际运行单位。一个 线程 指的是进程中一个单一顺序的控制流,一个进程中可以创建多个 线程 ,多个 线程 实现并发运行,每个 线程 执行不同的任务。 线程 具有以下一些特点:⚫ 线程 不单独存在、而是包含在进程中;⚫ 线程 是参与系统调度的基本单位;⚫ 可并发执行。同一进程的多个 线程 之间可并发执行,在宏观上实现同时运行的效果;⚫ 共享进程资源。 public class Thread Demo3 implements Runnable { public StringBuffer log = new StringBuffer(); @Override public void run() { for (int i = 1; i <= 100; i++) { 优点:多核扩展性好,起多个用户 线程 可以跑在多个cpu上 缺点:多个用户 线程 之间数据交互,互斥访问增加代码复杂度,即使用原子变量,当用户 线程 从cpu0 切换 到cpu1时,data要从L1 cache同步到其他cpu(锁住总线),所以起太多的p thread 对于内核调度压力较大 协程(改进):n:1,n个用户 线程 跑在一个内核 线程 (一个cpu) 优点:无 多线程 竞争,写代码容易些,因为跑在一个cpu上, 【Q1】如果在callback里阻塞整个worker,其他worker会偷过来运行,但是万一所有worker都被阻塞住,那就gg了。 【Q2】如果在callback里发起brpc,只会阻塞当前b thread ,底层的worker不受影响,他发现后就移出rq,这时,这个callback void pa_mysql_connect(MYSQL *mysql_conn) { // my_init(); if (NULL == mysql_init(mysql_conn)) { write_log("C 作者:Daniel Robbins (drobbins@gentoo.org), 总裁/CEO, Gentoo Technologies, Inc.第一部分:一种支持内存共享的简捷工具 POSIX (可移植操作系统接口) 线程 是提高代码响应和性能的有力手段。在本 系列 中,Daniel Robbins 向您精确地展示在编程中如何使用 线程 。其中还涉及大量幕后细节,读完本 系列 文章,您完全可以运用 POS 原文:http://casatwy.com/p thread de-ge-chong-tong-bu-ji-zhi.html 虽然p thread 的介绍我看过很多, 但是这篇文章介绍的最清楚了, 记在这里, 方便以后随时查阅 p thread 的各种同步机制 DateThu 29 January 2015Tagsp thread p thread 是...