第四章 线程(Threads)&&并发(Concurrency)

目录

4.1 概述

线程概念

线程

线程的特点

单线程和多线程进程

动力

在一个进程中执行的四个线程(Linux/x86-32)

好处

例子1:

例子2:

4.2 多核编程

多线程服务器架构

在单核系统上的并发执行

在多核系统上的并行执行

4.3 多线程模型

线程的实现机制

用户级线程(User Threads)

内核级线程(Kernel Threads)

多线程模型

多对一

多对一模型

一对一

一对一模型

多对多模型

二级模型

Solaris多线程模型的发展 - M:N -> 1:1

Solaris用户线程、内核线程、lwp三者之间的关系

4.4 线程库(Thread Libraries)

Windows thread library

Pthreads(POSIX线程库)

JAVA 线程

4.5 隐式多线程(Implicit Threading)

线程问题

fork()和exec()的语义学

fork()

exec()

线程取消

信号处理(Signal Handling)

线程池(Thread Pools)

线程特有数据(Thread Specific Data)

调度程序激活

操作系统例子

Windows XP线程

Linux Threads

进程、线程习题分析


4.1 概述

一个进程的概念,体现了两个特点:

资源拥有单位

给每个进程分配一虚拟地址空间,保存进程映像,控制一些资源(文件,I/O设备),有状态、优先级、调度

调度单位

 进程是由一个或多个程序的一次执行

 可能会与其他进程交替执行

这两个特性分别由操作系统独立处理

调度被称为线程或轻型进程(LWP,lightweight process)

所有权资源被称为处理器任务

线程概念

这两个特性分别由操作系统独立处理

 资源拥有单元称为进程(或任务),调度的单位称为线程、

又称轻型进程(light weight process)。

 线程只拥有一点在运行中必不可省的资源(程序计数器、一组寄存器和栈),但它可与同属一个进程的其它线程共享进程拥有的全部资源。

线程定义为进程内一个执行单元或一个可调度实体。

线程

 线程:

 有执行状态(状态转换)

 不运行时保存上下文

 有一个执行栈

 有一些局部变量的静态存储

 可存取所在进程的内存和其他资源

 可以创建、撤消另一个线程

线程的特点

 是进程的一个实体,可作为系统独立调度和分派的基本单位。

 不拥有系统资源(只拥有少量的资源,资源是分配给进程)

 一个进程中的多个线程可并发执行。(进程可创建线程执行同一程序的不同部分)

 系统开销小、切换快。(进程的多个线程都在进程的地址空间活动)

单线程和多线程进程

动力

一个线程与属于同一进程的线程共享,其内容为:

代码部分

数据部分

操作系统资源

(进程具有虚拟地址空间,以保存进程映像对处理器、其他进程、文件和I/O资源的保护访问权限)

传统进程或重型进程(heavyweight process)等于具有一个线程的任务

在一个进程中执行的四个线程(Linux/x86-32)

好处

 创建一个新线程花费时间少(结束亦如此)

 两个线程的切换花费时间少

(如果机器设有“存储[恢复]所有寄存器”指令,则整个切换过程用几条指令即可完成)

 因为同一进程内的线程共享内存和文件,因此它们之间相互通信

无须调用内核

 适合多处理机系统

例子1:

 LAN中的一个文件服务器,在一段时间内需要处理几个文件请求

 有效的方法是:为每一个请求创建一个线程

 在一个SMP机器上:多个线程可以同时在不同的处理器上运行

例子2:

 一个线程显示菜单,并读入用户输入;另一个线程执行用户命令

 考虑一个应用:由几个独立部分组成,这几个部分不需要顺序执行,则每个部分可以以线程方式实现

 当一个线程因I/O阻塞时,可以切换到同一应用的另一个线程

4.2 多核编程

多核系统给程序员带来了压力,挑战包括

划分活动

平衡

数据分裂

数据相关性

测试和调试

多线程服务器架构

在单核系统上的并发执行

在多核系统上的并行执行

4.3 多线程模型

线程的实现机制

 用户级线程 user-level thread

 核心级线程 kernel-level thread

 两者结合方法

用户级线程(User Threads)

 用户级线程:不依赖于OS核心(内核不了解用户线程的存在),应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

如:数据库系统informix,图形处理Aldus PageMaker。调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,所以速度特别快。一个线程发起系统调用而阻塞,则整个进程在等待。

 用户线程的维护由应用进程完成;

 内核不了解用户线程的存在;

 用户线程切换不需要内核特权;

 用户线程调度算法可针对应用优化;

 一个线程发起系统调用而阻塞,则整个进程在等待。(一对多模型中)

三个主线程库:

POSIX Pshoeds,Win32线程,Java线程

内核级线程(Kernel Threads)

 内核级线程:依赖于OS核心,由内核的内部需求进行创建和撤销,用来执行一个指定的函数。一个线程发起系统调用而阻塞,不会影响其他线程。时间片分配给线程,所以多线程的进程获得更多CPU时间。

 内核维护进程和线程的上下文信息;

 线程切换由内核完成;

 时间片分配给线程,所以多线程的进程获得更多CPU时间;

 一个线程发起系统调用而阻塞,不会影响其他线程的运行。

例子:

 Windows XP/2000 及以后

 Solaris

 Linux

 POSIX Pthreads

 Mac OS X

多线程模型

多对一

一对一

多对多

多对一

许多用户级线程都映射到单个内核线程

由用户级运行时库实现

在用户级别上创建、调度、同步线程

操作系统不知道用户级别的线程

操作系统认为每个进程只包含一个控制线程

例子:

 Solaris Green Threads

 GNU Portable Threads

多对一模型

优点

不需要操作系统支持

是否可以调整调度策略以满足应用程序(用户级别)的需求

降低了开销的线程操作,因为没有系统调用

缺点

不能利用多处理器(没有真正的并行性)

当一个线程阻塞时,整个进程阻塞

一对一

每个用户级线程都映射到内核线程

操作系统为每个用户级线程提供了一个内核线程

每个内核线程都要独立调度

由操作系统执行的线程操作(创建、调度、同步)

例子:

 Windows NT/XP/2000

 Linux

 Solaris 9 and later

一对一模型

优点

每个内核级线程都可以在一个多处理器上并行运行

当一个线程阻塞时,可以调度进程中的其他线程

缺点

线程操作的开销更高

操作系统必须随着线程数量的增加而良好地扩展

多对多模型

允许将许多用户级线程映射到许多内核线程

允许操作系统创建足够数量的内核线程

例子:

Solaris prior to version 9

Windows NT/2000 with the ThreadFiber

二级模型

类似于M:M,只是它允许一个用户线程被绑定到内核线程

例子:

 IRIX

 HP-UX

 Tru64 UNIX

 Solaris 8 and earlier

Solaris多线程模型的发展 - M:N -> 1:1

Solaris用户线程、内核线程、lwp三者之间的关系

4.4 线程库(Thread Libraries)

线程库为程序员提供了用于创建和管理线程的API

两种主要的实现方式

库完全放在用户空间中

操作系统支持的内核级库

Windows thread library

演示:10-13,41min

Pthreads(POSIX线程库)

可以作为用户级或 内核级提供

用于线程创建和同步的便携式操作系统接口(POSIX,Portable Operating System Interface)标准(IEEE 1003.1c)API

http://standards.ieee.org/reading/ieee/stad_public/description/posix

API指定了线程库的行为,实现取决于该库的开发

常见于UNIX操作系统(Solaris,Linux,Mac OS X)

10-13,68min

JAVA 线程

Java线程由JVM管理

通常使用底层操作系统提供的线程模型来实现

Java线程可以由以下方式创建:

扩展线程类

实现了可运行的接口

4.5 隐式多线程(Implicit Threading)

随着线程数量的增加,它越来越受欢迎,显式线程的程序正确性更加困难

创建和管理由编译器和运行时库而不是程序员来完成的线程

探索了五种方法

线程池

分叉连接

OpenMP

大中央调度

英特尔线程构建块

线程问题

fork()和exec()系统调用的语义学

目标线程的线程取消

异步或延迟

信号处理

线程池

线程特定数据

调度程序激活

fork()和exec()的语义学

fork()

只复制调用线程还是所有线程?

exec()

替换进程,包括所有的线程吗?

线程取消

在一个线程完成之前终止它

两种一般方法:

异步取消会立即终止目标线程

延迟取消允许目标线程定期检查它是否应该被取消

信号处理(Signal Handling)

UNIX系统中使用信号通知进程发生了特定事件

一个信号处理程序被用于处理信号

1、信号是由特定的事件产生的

2、信号被传递到一个流程

3、信号处理

选项:

将信号传递到信号应用到的线程上

将信号传递给这个过程中的每个线程

在过程中将信号传递给某些线程

指定一个特定的三个信号组来接收该进程的所有信号

线程池(Thread Pools)

在池中创建许多等待工作的线程

优点:

使用现有线程服务请求通常比创建新线程稍微快一些

允许将应用程序中的线程数绑定到池的大小

线程特有数据(Thread Specific Data)

允许每个线程都有自己的数据副本

当无法控制线程创建过程时(即使用线程池时)有用

调度程序激活

M:M和两级模型都需要通信,以维护分配给应用程序的适当数量的内核线程

调度程序激活提供了回调——从内核到线程库的通信机制

这种通信允许应用程序维护正确的内核线程数

操作系统例子

 Windows XP Threads

 Linux Thread

Windows XP线程

实现了内核级的一对一映射

每个线程包含

线程id

寄存器组

单独的用户堆栈和内核堆栈

私有数据存储区

寄存器集、堆栈和私有存储区域被称为线程的上下文

线程的主要数据结构包括:

 ETHREAD (executive thread block)

 KTHREAD (kernel thread block)

 TEB (thread environment block) CreateThread.cpp

Linux Threads

Linux将它们称为任务,而不是线程

线程的创建是通过clone()系统调用来完成的

clone()允许子任务共享父任务(进程)的地址空间

进程、线程习题分析

1、 The main difference between a process and a program is that A

A.a process has its life cycle while a program has not.
B.a program has its life cycle while a process has not.
C.a program can own resources while a process cannot.
D.a process can own resources while a program cannot.

2、 Which component of a process is not shared across threads? A

A. Register values
B. Heap memory
C. Global variables
D. Program memory

3、 A Thread Control Block (TCB) stores: C

A. User (owner) ID
B. Memory map
C. The machine state (registers, program counter)
D. Open file descriptors

4、 For many-to-one model, if one thread within a single process is blocking, then B

A. the rest threads of this process keep running.
B. the whole process will be blocked.
C. the blocking thread will be cancelled.
D. the blocking thread will be always blocked.

5、下列哪种方法不能实现进程之间的通信( ) C

A.共享文件 B.数据库 C.全局变量 D.共享内存

6、UNIX系统中提供了一种进程间的信息传送机制,把一个进程的标准输出与另一个进程的标准输入连接起来,这种机制称为 B

A. 重定向B. 管道 C. socket D. 共享内存

7、下列操作中,操作系统在创建新进程时,必须完成的是( )。 B

I.申请空白的进程控制块
II. 初始化进程控制块
III.设置进程状态为执行态

A、仅I
B、仅I、II
C、仅I、III
D、仅II、III

8、 下列关于线程的描述中,错误的是___。 B
A.内核级线程的调度由操作系统完成
B.操作系统为每个用户级线程建立一个线程控制块
C.用户级线程间的切换比内核级线程间的切换效率高
D.用户级线程可以在不支持内核级线程的操作系统上实现

9、下列关于进程和线程的叙述中,正确的是 A
A.不管系统是否支持线程,进程都是资源分配的基本单位
B.线程是资源分配的基本单位,进程是调度的基本单位
C.系统级线程和用户级线程的切换都需要内核的支持
D.同一进程中的各个线程拥有各自不同的地址空间

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
When you work with a computer, you can do several things at once. You can hear music while you edit a document in a word processor and read your e-mail. This can be done because your operating system allows the concurrency of tasks. Concurrent programming is about the elements and mechanisms a platform offers to have multiple tasks or programs running at once and communicate with each other to exchange data or to synchronize with each other. Java is a concurrent platform and offers a lot of classes to execute concurrent tasks inside a Java program. With each version, Java increases the functionalities offered to programmers to facilitate the development of concurrent programs. This book covers the most important and useful mechanisms included in Version 7 of the Java concurrency API, so you will be able to use them directly in your applications, which are as follows: f f t e n . d u o l Basic thread management w.codec w w Thread synchronization mechanisms f f Thread creation and management delegation with executors f f Fork/Join framework to enhance the performance of your application f f Data structures for concurrent programs f f Adapting the default behavior of some concurrency classes to your needs f f Testing Java concurrency applications f f What this book covers Chapter 1, Thread Management will teach the readers how to make basic operations with threads. Creation, execution, and status management of the threads are explained through basic examples. Chapter 2, Basic Thread Synchronization will teach the readers to use the low-level Java mechanisms to synchronize a code. Locks and the synchronized keyword are explained in detail. Chapter 3, Thread Synchronization Utilities will teach the readers to use the high-level utilities of Java to manage the synchronization between the threads in Java. It includes an explanation of how to use the new Java 7 Phaser class to synchronize tasks divided into phases. Chapter 4, Thread Executors will teach the readers to delegate the thread management to executors. They allow running, managing, and getting the results of concurrent tasks. Chapter 5, Fork/Join Framework will teach the readers to use the new Java 7 Fork/Join framework. It’s a special kind of executor oriented to execute tasks that will be divided into smaller ones using the divide and conquer technique. Chapter 6, Concurrent Collections will teach the readers to how to use some concurrent data structures provided by the Java language. These data structures must be used in concurrent programs to avoid the use of synchronized blocks of code in their implementation. Chapter 7, Customizing Concurrency Classes will teach the readers how to adapt some of the most useful classes of the Java concurrency API to their needs. Chapter 8, Testing Concurrent Applications will teach the readers how to obtain information about the status of some of the most useful structures of the Java 7 concurrency API. The readers will also learn how to use some free tools to debug concurrent applications, such as the Eclipse, NetBeans IDE, or FindBugs applications to detect possible bugs on their applications.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值