栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Threads

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Threads

    OverviewMulticore ProgrammingMultithreading ModelsThread LibrariesImplicit threadingThreading issues/Designing multithreaded programs

Overview 线程定义:

OS view:线程是一个独立的指令流,可以由操作系统安排运行。Software developer view:线程可以被视为独立于主程序运行的“过程”。

顺序程序:程序中的单一指令流。多线程程序:具有多个流的程序

使用多个内核/CPU需要多个线程

线程的好处:

相比起进程,新建线程速度更快;结束线程速度更快;两线程相互切换花费时间更少;线程提高了程序之间的通信效率 线程举例:

open a file in Word editor and typing the text (one thread), the text is automatically formatting (another thread), the text is automatically specifying the spelling mistakes (another thread) and the file is automatically saved to disk (another thread). Typing in a file is a process, formatting, spells checking, saving these are threads

Threads:

线程在处理器上调度,每个线程可以独立于其他进程和线程执行一组指令。

线程控制块(Thread Control Block)存储关于线程的信息

 它与属于同一进程的其他线程共享其代码段、数据段和其他操作系统资源,例如打开的文件和信号

单线程和多线程进程

传统的进程只有一个控制线程。
如果一个进程有多个控制线程,它一次可以执行多个任务

 线程生命周期


Multicore Programming 并发与并行: 在单核系统上并发执行:

并发性是指在重叠的时间段内启动、运行和完成的多个任务,没有特定的顺序。

多核系统上的并行性:

如果一个系统可以同时执行多个任务,那么它就是并行的


 Multithreading Models 线程支持

多线程可以通过以下方式得到支持:

用户级库(内核不知道):库创建和管理线程(用户级实现)(user level implementation)内核级-内核本身:内核创建和管理线程(内核空间实现) (kernel space implementation)

用户进程想要创建一个或多个线程。
内核可以为进程创建一个(或多个)线程。
        即使内核不支持线程,它也可以为每个进程创建一个线程(即,它可以创建一个单线程执行的进程)

User-level threads (ULT)

用户线程——是由用户实现的执行单元,内核不知道这些线程的存在。
用户级线程比内核级线程快得多。
所有线程管理都由应用程序通过使用线程库来完成

例:编程中的线程,比如Java、C#、Python。

Advantages and disadvantages of ULT

优点:

线程切换不涉及内核:没有模式切换。所以很快。调度可以是特定于应用程序的:根据情况选择最佳算法。可以在任何操作系统上运行。我们只需要一个线程库

缺点:

大多数系统调用都会阻塞进程。因此,进程中的所有线程都将被隐式阻止。内核只能将处理器分配给进程。同一进程中的两个线程不能在两个处理器上同时运行 Kernel-level threads (KLT)

内核线程——是内核计划在CPU上执行的执行单元。
由操作系统直接处理,线程管理由内核完成。

例:Windows XP/2000  Solaris       

Advantages and disadvantages of KLT

优点:

内核可以在多个处理器上调度同一进程的多个线程阻塞在线程级别,而不是进程级别

如果一个线程阻塞,可以在同一进程中将CPU分配给另一个线程甚至内核例程也可以是多线程的

缺点:

线程切换总是涉及内核。这意味着每个线程开关有两个模式开关,因此,它比用户级线程慢

(但比全进程开关快) 示例:Solaris

进程包括用户的地址空间、堆栈和进程控制块
用户级线程(线程库)

操作系统看不见是应用程序并行性的接口

内核进程

可以在处理器上调度的单元

轻量级进程(LWP)-内核线程和用户线程之间的层

每个LWP支持一个或多个ULT,并映射到一个KLT操作系统概念 Solaris线程 Multithreading Models

用户线程和内核线程之间必须存在关系
将用户级线程映射到内核级线程
在组合系统中,同一应用程序中的多个线程可以在多个处理器上并行运行。
多线程模型有三种类型

多对一一对一多对多 多对一:

许多用户级线程映射到单个内核线程
该进程一次只能运行一个用户级线程,因为只有一个内核级线程与该进程关联。
线程管理由线程库在用户空间完成

一对一:

每个用户线程映射到一个内核线程
内核可以实现线程,并可以管理线程、调度线程。
内核知道线程。
提供更多并发性;当一个线程阻塞时,另一个线程可以运行

多对多:

允许将多个用户级线程映射到多个内核线程
允许操作系统创建足够数量的内核线程
内核线程的数量可能特定于特定的应用程序或特定的机器。
用户可以创建任意数量的线程,相应的内核级线程可以在多处理器上并行运行。


Thread Libraries

无论实现了哪个线程,都可以通过一组作为线程API(线程库)一部分的函数来创建、使用和终止线程

线程库为程序员提供用于创建和管理线程的API(应用程序编程接口)

程序员只需知道线程库接口(API)。线程可以在用户空间或内核空间中实现。

库可能完全在用户空间中,或者可能获得内核对线程的支持

三个主要线程库:POSIX线程、Java线程、Win32线程

实现线程库的两种方法:

1.完全在用户空间中提供一个库,而不需要内核支持。库的所有代码和数据结构都存在于用户空间中。调用库中的函数会导致用户空间中的本地函数调用,而不是系统调用2.实现操作系统直接支持的内核级库。库的代码和数据结构存在于内核空间中。在库的API中调用函数通常会导致对内核的系统调用


Implicit threadind

有两类:显式线程和隐式线程。

显式线程——程序员创建和管理线程。隐式线程——编译器和运行时库创建和管理线程。 Implicit threading

设计多线程程序的三种可选方法:

线程池——在进程启动时创建多个线程,并将它们放入一个池中,它们坐在那里等待工作。OpenMP是一组编译器指令,可用于C、C++和fortran程序,指令编译器在适当的时候自动生成并行代码。宏大中心调度(GCD)是一个扩展到C和C++上的苹果的Mac OS X和iOS操作系统,以支持并行性。


Threading issues / Designing multithreaded programs

多线程编程有很多问题需要考虑。

-fork()和exec()的语义-信号处理-线程取消 fork() system call:

创建线程是通过fork()系统调用完成的。新创建的线程称为子线程,为创建新线程而启动的线程被视为父线程。

 exec() system call:

exec()系统调用系列将当前运行的线程替换为新线程。

原始线程标识符保持不变,所有内部细节,如堆栈、数据和指令都保持不变。新线程将替换可执行文件。

Semantics of fork() and exec()

fork()是只复制调用线程还是复制所有线程?我们应该如何实现fork?合乎逻辑的做法是:

1) 如果在fork()之后调用exec(),则无需复制线程。他们无论如何都会被替换。2) 如果不调用exec(),那么复制线程也是合乎逻辑的;这样子线程将和父线程一样多。

所以,我们可以实现两个系统调用:比如fork1和fork2

Signal Handling

信号是软件中断,或Unix/Linux系统响应条件或操作而生成的事件。

Unix系统中有几种可用的信号。

信号由信号处理器处理(所有信号只处理一次)。

异步信号是从接收它的进程外部生成的同步信号被传送到导致信号发生的同一进程 Thread Cancellation

在线程结束之前终止它
不同情况下的需求
两种通用方法:

异步取消立即终止目标线程延迟取消允许目标线程定期检查是否应该取消

已取消线程已发送取消请求 举例:从单线程到多线程

许多程序都是作为单线程进程编写的。
如果我们试图将单线程进程转换为多线程进程,我们必须注意以下几点:

全局变量我们使用的库函数

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号