12.并发编程

news2025/1/23 20:09:32

1.并发

并发:逻辑流在时间时重叠
构造并发程序:
进程:每个逻辑控制流是一个进程,由内核调度和维护
进程有独立的虚拟地址空间,想要通信,控制流必须使用某种显式的进程间通信机制(IPC)
I/O多路复用:程序在一个进程的上下文显式地调度自己的逻辑流
逻辑流被模型化为状态机,数据到达文件描述符后,主程序显式地从一个状态转换到另一个状态
程序是一个单独的进程,所有的流共享同一个地址空间
线程:运行在单一进程上下文的逻辑流,由内核调度
像进程流一样由内核调度,像I/O多路复用一样共享同一个地址空间

2.基于进程

在父进程中接受客户端连接请求,创建新的子进程提供服务
共享文件表,但不共享用户地址空间

3.基于I/O多路复用

使用select函数,要求内核挂起进程,只有在I/O事件发生后,才将控制返回给程序
select处理 描述符集合,看成一个大小为n的位向量
select函数会一直阻塞,直到读集合中至少有一个描述符准备好可以读
当且仅当一个从该描述符读取一个字节的请求不会阻塞时,描述符k就表示准备好可以读了
状态机就是一组状态、输入事件、转移
粒度:每个逻辑流每个时间片执行的指令数量
基于I/O多路复用的事件驱动程序:
每个逻辑流都能访问该进程的全部地址空间

4.基于线程(thread)

线程是运行在进程上下文的逻辑流
程序是由每个进程中一个线程组成的
每个线程都有自己独立的线程上下文,包括线程ID、栈、栈指针、PC、CC、通用目的寄存器值
每个线程和其他线程共享进程上下文的剩余部分,包括整个用户虚拟地址空间,由只读文本、读/写数据、堆、所有的共享库代码和数据区域组成
线程共享打开文件的集合
一个线程的上下文比进程的更小,切换更快
主线程和其他 对等线程的区别仅在于它总是进程中第一个运行的线程
每个对等线程都能读写相同的共享数据
线程的代码和本地数据被封装在一个 线程例程
pthread_create函数创建线程
pthread_join函数会阻塞,直到线程终止
可结合的线程:能被其他线程回收和杀死,在被其他线程回收前,它的内存资源(栈)不释放
分离的线程:不能被其他线程回收和杀死,内存资源在它终止时由系统自动释放
寄存器从不共享,虚拟内存总是共享
若一个线程得到了一个指向其他线程的栈的指针,则它可以读写这个栈的任何部分
变量是共享的,当且仅当它的一个实例被一个以上的线程引用

5.用信号量同步线程

共享变量引入了同步错误的可能性

互斥:临界区不应该与其他进程的临界区交替执行
信号量s是非负整数的全局变量,初始化为1,只能由两种操作处理
P(s)测试:若s非0则减1,若s为0则挂起
V(s)增加:s加1
以提供互斥为目的的二元信号量称为 互斥锁,P为加锁,V为解锁
生产者-消费者问题:
插入和取出项目都涉及更新共享变量,必须保证对缓冲区的访问互斥和调度
缓冲区:减少抖动
读者-写者问题:
写者必须有对对象独占的访问,读者可以和无限多个读者共享对象
饥饿:一个线程无限期阻塞,无法进展
基于预线程化的并发服务器

6.竞争、死锁

竞争:一个程序的正确性依赖于一个线程要在另一个线程到达y点之前,到达它的控制流中的x点
程序员假定线程将按照某种特殊的轨迹线穿过执行空间,而忘记:多线程的程序必须对任何可行的轨迹线都正确工作
死锁:一组进程被阻塞了, 等待一个永远不会为真的条件

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux - 第6节 - 动态库和静态库

1.静态库与动态库概念 静态库(.a):程序在编译链接的时候把库的代码拷贝到可执行文件中。程序运行的时候将不再需要静态库。动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用…

【javaEE初阶】第三节.多线程 (进阶篇 ) 死锁

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、"死锁"出现的典型场景二、产生 "死锁" 的必要条件 三、解决 "死锁" 问题的办法 总结前言 今天对于多线程进阶的学习&#…

【MapGIS精品教程】007:MapGIS投影变换案例教程

MapGIS投影变换,包括创建坐标系、定义投影、单点投影、类投影、批量投影。 文章目录 一、创建坐标系1. 创建高斯平面坐标系2. 创建阿尔伯斯投影二、定义投影三、投影变换1. 单点投影2. 类投影3. 批量投影一、创建坐标系 在MagGIS数据库中,有个空间参考系的文件夹,内置了常见…

【tensorflow onnx】TensorFlow2导出ONNX及模型可视化教程

文章目录1 背景介绍2 实验环境3 tf2onnx工具介绍4 代码实操4.1 TensorFlow2与ONNX模型导出4.2 ONNX正确性验证4.3 TensorFlow2与ONNX的一致性检查4.4 多输入的情况4.5 设定输入/输出节点5 ONNX模型可视化6 ir_version和opset_version修改7 ONNX输入输出维度修改8 致谢原文来自于…

【教学典型案例】18.开门小例子理解面向对象

目录一:背景介绍业务场景:业务分析:二:实现思路1、面向过程:2、面向对象(抽象、封装、继承、多态)3、面向对象(抽象、封装、继承、多态、反射)三:实现过程1、…

如何在 Istio 中使用 SkyWalking 进行分布式追踪

在云原生应用中,一次请求往往需要经过一系列的 API 或后台服务处理才能完成,这些服务有些是并行的,有些是串行的,而且位于不同的平台或节点。那么如何确定一次调用的经过的服务路径和节点以帮助我们进行问题排查?这时候…

二极管损坏的原因有哪些?

大家好,我是记得诚。 最近项目上肖特基二极管出问题了,概率性损坏,二极管本来是一个很简单的器件,这次重新整理一下,供大家参考。 二极管损坏,个人总结有如下几种情况。 1、过压 在Ta=25℃下,超过二极管的最大反向电压VR,二极管可能会被击穿,导致损坏。 2、过流 …

SpringBoot的基本概念和使用

文章目录一、什么是SpringBoot二、Spring Boot优点三、Spring Boot项目创建四、Spring Boot 配置文件1. yml语法2.properties与yml关系3.多系统的配置五、Spring Boot日志文件1.日志对象2.日志级别日志级别的设置System.out.println VS 日志的两个致命缺点3.日志持久化4.更简单…

[ 常用工具篇 ] windows安装phpStudy_v8.1_X64

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

如何实现大文件断点续传、秒传

大家先来了解一下几个概念: 「文件分块」:将大文件拆分成小文件,将小文件上传\下载,最后再将小文件组装成大文件; 「断点续传」:在文件分块的基础上,将每个小文件采用单独的线程进行上传\下载&…

CobaltStrike密码爆破、伪造上线以及DDos——csIntruder

Git仓库: https://github.com/ljy1058318852/csIntruder0x01 概述 本项目包含CobaltStrike密码爆破、伪造上线以及DDos功能。其中伪造上线支持常见魔改版CS。 This project includes CobaltStrike password blasting, fake online and DDos functions. Among them…

云计算创新展望-精耕细作的超级云计算平台

前言在当今云计算深入各行业、计算量暴增现状之下,云计算生态迎来百花齐放。但用户不希望将所有鸡蛋放在一个篮子里面,因此每个企业都在发展自己的私有云、公有云等多云、混合云结构。因云计算的高灵活性、可扩展性、高性价比,在本地10台服务…

ubuntu的快速安装与配置

文章目录前言一、快速安装二 、基础配置1 Sudo免密码2 ubuntu20.04 pip更新源3 安装和配置oneapi(infort/mpi/mkl) apt下载第一次下载的要建立apt源apt下载(infort/mpi/mkl)4 安装一些依赖库等5 卸载WSLpython总结前言 win11系统 ubuntu20.04 提示:以下…

【力扣-10天SQL入门】5~8天刷题 知识点总结

https://leetcode.cn/study-plan/sql/?progressjgmzq5s第5天 合并175. 组合两个表就是一个简单的left join1581. 进店却未进行过交易的顾客Q:两个表Visits(有visit_id和customer_id两列)和Transactions(有transaction_id、visit_…

Go垃圾回收原理

术语介绍 赋值器:说白了就是你写的程序代码,在程序的执行过程中,可能会改变对象的引用关系,或者创建新的引用。 回收器:垃圾回收器的责任就是去干掉那些程序中不再被引用得对象。 STW:全称是stop the word,GC期间某个阶段会停止…

插值多项式的龙格现象的介绍与模拟

在文章拉格朗日插值多项式的原理介绍及其应用中,笔者介绍了如何使用拉格朗日插值多项式来拟合任意数据点集。   事实上,插值多项式会更倾向于某些形状。德国数学家卡尔龙格Carl Runge发现,插值多项式在差值区间的端点附近会发生扭动&#x…

一篇文章彻底理解setState是同步还是异步!

本文内容均针对于18.x以下版本setState 到底是同步还是异步?很多人可能都有这种经历,面试的时候面试官给了你一段代码,让你说出输出的内容,比如这样:constructor(props) {super(props);this.state {data: data} }comp…

Sentinel架构篇 - 来源访问控制

来源访问控制(黑白名单) 概念 Sentinel 提供了黑白名单限制资源能否通过的功能。如果配置了白名单,则只有位于白名单的请求来源的对应的请求才能通过;如果配置了黑名单,则位于黑名单的请求来源对应的请求不能通过。 …

图形报表ECharts

图形报表ECharts1 图形报表ECharts1.1 ECharts简介-富客户端图表库ECharts缩写来自Enterprise Charts,商业级数据图表,是百度的一个开源的使用JavaScript实现的数据可视化工具,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏…

【3.8】操作系统内存管理、Redis数据结构、哈希表

内存满了,会发生什么? 当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,进程会从用户态切换到内核态,并将缺页中…