【操作系统概念】 第4章:线程

文章目录

  • 0.前言
  • 4.1 概述
    • 4.1.1 多线程编程的优点
  • 4.2 多线程模型
    • 4.2.1 多对一模型
    • 4.2.2 一对一模型
    • 4.2.3 多对多模型
  • 4.3 线程库
  • 4.4 多线程问题
    • 4.4.1 系统调用fork()和exec()
    • 4.4.2 取消
    • 4.4.3 信号处理
    • 4.4.4 线程池
    • 4.4.5 线程特定数据

0.前言

第3章讨论的进程模型假设每个进程是具有单个控制线程的一个执行程序。不过,几乎所有现代操作系统都允许一个进程包含多个线程。本章引入多线程计算机系统有关的许多概念,并且讨论Pthreads、Windows和Java线程库的API

本章目标:

  1. 引入线程概念,即CPU使用的基本单元,它构成多线程计算机的基础
  2. 讨论Pthreads、Windows和Java线程库的API
  3. 探讨多种策略以便提供隐式线程
  4. 讨论多线程相关的问题
  5. 讨论Windows和Linux操作系统的线程支持

4.1 概述

线程是CPU使用的基本单元,由线程ID,程序计数器,寄存器集合组成。它与属于同一进程的其他线程共享代码段,数据段和其他操作系统资源
在这里插入图片描述

4.1.1 多线程编程的优点

  1. 响应度高:一个多线程的程序即使部分阻塞,其他部分仍能运行,从而增加了对用户的响应程度。
  2. 资源共享
  3. 经济:创建和切换线程比创建进程更节省资源和时间
  4. 多处理器体系结构的利用:多线程能充分利用多处理器体系

4.2 多线程模型

提供多线程支持有两种方式:用户线程内核线程

  • 用户线程受内核支持,无须内核管理
  • 内核线程由操作系统支持和管理

在用户线程和内核线程之间存在一定的关系,即多线程模型,以下讨论三种常用的关系:多对一,一对一,多对多

4.2.1 多对一模型

多个用户线程映射到一个内核线程

  • 优点:线程管理由线程库在用户空间完成,效率比较高
  • 缺点:如果一个线程阻塞,整个进程就会阻塞;且多个线程无法并行运行在多处理器上

4.2.2 一对一模型

每个用户线程映射到一个内核线程上

  • 优点:比多对一模型更好的并发功能;一个线程阻塞时,其他线程能够继续调用;多个线程能够并发运行在多处理器
  • 缺点:创建内核线程的开销会影响应用程序的功能

4.2.3 多对多模型

  • 多对一模型可以创建任意多的用户线程,但是只能没有增加并发性
  • 一对一模型增强了并发性,但开发者要小心不能在应用程序中创建太多的进程

多对多模型没有上述的所有缺点,它多路复用了许多用户线程到同样数量或更小数量的内核线程上
在这里插入图片描述
在这里插入图片描述

4.3 线程库

在用户空间中提供一个没有内核支持的库
执行一个由操作系统直接支持的内核级的库

4.4 多线程问题

4.4.1 系统调用fork()和exec()

在多线程程序中,系统调用fork()和exec()的语义有所改变。

如果程序中一个进程调用fork(),那么新进程会复制所有线程,还是新进程只有单个线程?有的UNIX系统有两种形式的fork(),一种复制所有线程,另一种只复制调用了系统调用fork()的线程。

Exec()工作方式:如果一个线程调用系统调用exec(),那么exec()参数所指定的程序会替换整个进程,包括所有线程。

如果调用fork()之后立即调用exec(),那么没有必要复制所有线程,因为exec()参数所指定的程序会替换整个进程。在这种情况下,只复制调用线程比较适当。不过,如果在fork()之后另一进程并不调用exec(),那么另一进程就应复制所有进程。

4.4.2 取消

线程取消(thread cancellation) 是在线程完成之前来终止线程的任务。

要取消的线程通常称为目标线程。目标线程的取消可在如下两种情况下发生:

  1. 一是异步取消(asynchronous cancellation):一个线程立即终止目标线程。
  2. 二是延迟取消(deferred cancellation):目标线程不断地检查它是否应终止,这允许目标线程有机会以有序方式来终止自己。

如果资源已经分配给要取消的线程,或者要取消的线程正在更新与其他线程所共享的数据,那么取消会有困难,对于异步取消尤为麻烦。操作系统回收取消线程的系统资源,但是通常不回收所有资源。
因此,异步取消线程并不会使所需的资源空闲。相反采用延迟取消时,允许一个线程检查它是否是在安系统资源空闲全的点被取消,pthread称这些点为取消点(cancellation point)

4.4.3 信号处理

信号处理: 信号在Unix中用来通知进程某个特定时间已发生了,信号可以同步或异步接收。所有有信号具有同样的模式:
(1)信号有特定事件的发生所产生
(2)产生的信号要发送到进程
(3)一旦发送,信号必须交易处理。

同步信号的例子包括访问非法内存或被0除。在这种情况下,如果运行程序执行这些动作,那么就产生信号,同步信号发送到执行操作而产生信号的同一进程(同步的原因)。

当一个信号由运行进程之外的事件产生,那么进程就异步接收这一信号。这种信号的例子包括使用特殊键(Ctrl + C)或者定时器到期。通常,异步信号被发送到另一个进程。

每个信号可能由两种可能的处理程序中的一种来处理:
(1)默认信号处理程序
(2)用户定义的信号处理程序

每个信号都有一个默认信号处理程序,当处理信号是在内核中运行的,这种默认动作可以用用户定义的信号处理程序来改写。信号可以按照不同的方式处理。有的信号可以简单的忽略(如改变窗口大小),有的需要终止程序来处理(非法内存访问)

单线程程序的信号处理比较直接,信号总是发送给进程
当多线程时,信号会:
(1)发送信号到信号所应用的线程
(2)发送信号到进程内的每个线程
(3)发送信号到进程内的某些固定线程
(4)规定一个特定线程以接收进程的所有信号。

发送信号的方法依赖于信号的类型。

4.4.4 线程池

多线程服务器有一些潜在问题:第一个是关于处理请求之前用以创建线程的时间,以及线程在完成工作之后就要被丢弃这一事实。第二个,如果允许所有并发请求都通过新线程来处理,那么将没法限制在系统中并发执行的线程的数量。无限制的线程会耗尽系统资源。解决这一问题是使用线程池

线程池的思想是在进程开始时创建一定数量的线程,并放入到池中以等待工作。当服务器收到请求时,他会唤醒池中的一个线程,并将要处理的请求传递给他,一旦线程完成了服务,它会返回到池中在等待工作。如果池中没有可用的线程,那么服务器会一直等待直到有空线程为止。

线程池的优点:
(1)通常用现有线程处理请求要比等待创建新的线程要快
(2)线程池限制了在任何时候可用线程的数量。

线程池中的线程数量由系统CPU的数量、物理内存的大小和并发客户请求的期望值等因素决定。比较高级的线程池能动态的调整线程的数量,以适应具体情况。

4.4.5 线程特定数据

同属一个进程的线程共享进程数据。

在某些情况下每个线程可能需要一定数据的自己的副本,这种数据称为线程特定数据。可以让每个线程与其唯一的标识符相关联。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/520101.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——进程控制(三)进程程序替换

目录 前言 一、进程程序替换 二、execl 三、多进程版execl 四、exec相关函数 1.execlp 2.execv 3.execvp 五、替换自己写的程序 六、替换其他语言程序 七、execle 前言 之前,我们学习了进程的fork创建,进程的等待,执行的代码都是…

解决:ModuleNotFoundError: No module named ‘paddle‘

错误显示: 原因: 环境中没有‘paddle’的python模块,但是您在尝试导入 解决方法: 1.普通方式安装: pip install paddlepaddle #安装命令 2.镜像源安装 pip install paddlepaddle -i https://pypi.tuna.tsinghua.e…

第18课:让客户看了就满意的商业软文是如何练成的?

选品上的注意事项 结合影视热点 通过追影视热点,找出能够跟产品贴合的点。在前面先道出痛点,痛点越深刻,用户对产品的过度才会更自然。 用户体验 真实体验才能真正写得出来。 结合时事热点 用的少,赶上了用就会效果很好&#xf…

C# Mel-Spectrogram 梅尔频谱

目录 介绍 Main features Philosophy of NWaves 效果 项目 代码 下载 C# Mel-Spectrogram 梅尔频谱 介绍 利用NWaves实现Mel-Spectrogram 梅尔频谱 NWaves github 地址:https://github.com/ar1st0crat/NWaves NWaves is a .NET DSP library with a lot …

Postman 接口自动化测试教程:入门介绍和从 0 到 1 搭建 Postman 接口自动化测试项目

关于Postman接口自动化测试的导引,全面介绍入门基础和从零开始搭建项目的步骤。学习如何有效地使用Postman进行API测试,了解项目搭建的基础结构、环境设置和测试用例的编写。无论您是新手还是经验丰富的测试人员,这篇教程都将为您提供清晰的指…

代码第二十四天-寻找旋转排序数组中的最小值Ⅱ

寻找旋转排序数组中的最小值Ⅱ 题目要求 解题思路 二分法 当遇到两个left、right两个位置值相同时候&#xff0c;可以选择将 right right-1 代码 class Solution:def findMin(self, nums: List[int]) -> int:left,right0,len(nums)-1while left<right:mid(leftright…

基于session注册JAva篇springboot

springboot3全家桶&#xff0c;数据库 &#xff1a;redis&#xff0c;mysql 背景环境&#xff1a;邮箱验证码&#xff0c;验证注册 流程&#xff1a;先通过邮箱验证&#xff0c;发送验证码&#xff0c;将获取到的session和验证码&#xff0c;存入redis里&#xff08;发送邮箱…

社区店运营方案分享:从推广到盈利的实战经验

对于想要开实体店或创业的朋友们&#xff0c;社区店是一个具有很大发展潜力的选择。 作为一名鲜奶吧5年的创业者&#xff0c;我将分享一些从推广到盈利的实战经验&#xff0c;希望能给大家提供有价值的参考。 1、市场调研&#xff1a; 在开店之前&#xff0c;深入了解社区的…

python 基础知识点(蓝桥杯python科目个人复习计划59)

今日复习内容&#xff1a;做题 例题1&#xff1a;建造房屋 问题描述&#xff1a; 小蓝和小桥是两位年轻的建筑师&#xff0c;他们正在设计一座新的城市。 在这个城市中&#xff0c;有N条街道&#xff0c;每条街道上有M个位置可以建造房屋&#xff08;一个位置只能建造一个房…

王道机试C++第 3 章 排序与查找:排序问题 Day28(含二分查找)

查找 查找是另一类必须掌握的基础算法&#xff0c;它不仅会在机试中直接考查&#xff0c;而且是其他某些算法的基础。之所以将查找和排序放在一起讲&#xff0c;是因为二者有较强的联系。排序的重要意义之一便是帮助人们更加方便地进行查找。如果不对数据进行排序&#xff0c;…

线性代数笔记13--正交向量和正交子空间

0. 四个子空间 1. 正交向量 两向量点乘为0&#xff0c;向量正交。 A ⊤ B 0 A^{\top}B0 A⊤B0 勾股定理 ∣ ∣ x ∣ ∣ 2 ∣ ∣ y 2 ∣ ∣ ∣ ∣ x y ∣ ∣ 2 ||x||^2||y^2||||xy||^2 ∣∣x∣∣2∣∣y2∣∣∣∣xy∣∣2 验证正交条件 ∣ ∣ x ∣ ∣ 2 x ⊤ x x x ⊤ ∣…

Qt ini配置文件

ini文件用于保存用户的设置操作&#xff0c;下列以背景颜色设置为例子 暂时默认设置为白色背景 这段代码放置在主窗口的构造函数中&#xff0c;用于初始化读取ini文件 QString color;QSettings *set new QSettings("color.ini",QSettings::IniFormat);set->begi…