资源、死锁、如何监测死锁

news/2024/5/7 6:14:48

资源:变量、对象、网络资源、文件、内存、cpu等等

(应用层或者会话层 资源)

统一资源限定符:[scheme:][//authority][path][?query][#fragment]
authority 可以表示: [user-info@]host[:port]

比如:  file:F:\ideawork\client\pom.xml     (本地文件,中间的“\”符号要用File.separator  因为不同系统文件路径符号不同),网络文件就要服务器装ftp,超文本协议就可以用http://www.baidu.com

URI:对统一资源限定符进行封装,可以解析出相关内容信息

URL:  指向一个资源,然后可以拿网络连接、输入、输出流

比如:访问网站, openUrlConnection  拿到URLConnection  然后通过连接进行资源访问。

或者jdbc:mysql://192.168.43.3:3306/test  mysql数据库连接资源  ,他不能通过URL打开,只能通过DriverManager去拿连接(具体的Driver需要数据库厂商提供)。

(传输层网络资源)

socket 分为BIO (阻塞) NIO(异步,通过selector进行绑定);都需要设置超时时间(防止dos攻击)、窗口大小(太小了传输慢(一个周期内的数据量少),太大了占内存资源)等.

BIO   也就是对方不给你发消息,你线程就阻塞了,(socket.getinputstream.read)

注意区分:窗口大小和read里面接收的byte[] 不是一回事,窗口大小是设置网卡哪里的缓存大小,read里面的byte[]是你程序读取缓存的大小。

NIO 通过 selector监听已注册通道的状态(select方法),channel 进行selector注册,绑定一个参数(比如 服务通道绑定accpet)

死锁:线程a拿了A资源的锁,然后b线程拿了B资源的锁,再都没释放的情况下,a去申请B资源的锁,等待b线程释放,然后b线程去申请拿A资源的锁,等待a线程释放,此时就是死锁了

或者N个线程一起锁了,比如 a拿了A,b拿了B ,c拿了C,d拿了D,然后a申请B,b申请C,c申请D,d申请A, 造成死锁。

原理简单,把这个等待可以看成单链,因为每个线程只能等待一个资源,而资源又指向一个线程。类似单链

然后只要单链中有一个或者多个回路,也就是其中某个线程指向了他上层线程,那就完犊子了。

1.如何预防:资源锁顺序拿,比如A\B\C三个资源,a\b\c三个线程,然后a要拿A和B

b要拿B和C   c要拿C和A   ,只需要给资源排序,拿资源顺序必须按照 A\B\C的顺序拿

这时候c线程 是拿A和C  这时候A被锁了,等a线程;

然后 b线程完了之后,释放B和C资源,a线程继续跑,释放完A之后,c线程可以拿A和C执行了。

2.资源太多不好排序,那就资源分类, 比如 ABC 是一类  DEF 是一类,然后给类排序

然后按顺序拿类的锁,再去锁需要的单个或多个资源,然后释放类的锁。(类似于表级锁)

如果类也不好排序,那就直接一个大锁,拿完大锁,拿类锁,释放大锁,拿资源锁,释放类锁(类似于全局锁)

3.死锁检测:只能检测自己系统的,别人系统监测不了,所以调用别人系统的时候要设置超时时间,然后会有数据问题,就有了分布式事务以及最终一致性解决方案 以及定时任务调度。

监测:1.jvm工具,拉线程栈分析 不太会,后面再说。

2.程序自检

   1.自定义一个threadGroup 线程组,然后所有子线程都纳入这个线程组(子线程自己的线程组以及线程会自动纳入这里面的,他是树结构,禁止用反射使用私有构造方法新建threadGroup,不会被纳入进来)

  2.子线程再等待前记录blocker - (等待的资源 )(统一用底层是LockSupper实现的锁 - java自带的AQS) 不能用关键字锁,不会有blocker

3.每个线程定义一个栈,把已经拿到的锁资源压栈,目的:保证锁的顺序拿、顺序释放,要volatile修饰,保证线程可见,以及happen-before语义 保证 当时拿的是最新的。  

4.开启守护线程,循环监测threadGroup中等待线程的blocker,构建链表 、 查看是否有回路(有就进行中断操作 )不能使用stop, 不会释放锁资源

相关项目https://github.com/liukeling/Demos   后续再补充


http://www.mrgr.cn/p/86725843

相关文章

【云计算】云数据中心网络(七):负载均衡

《云网络》系列,共包含以下文章: 云网络是未来的网络基础设施云网络产品体系概述云数据中心网络(一):VPC云数据中心网络(二):弹性公网 IP云数据中心网络(三)…

Linux网络设置

一、网络相关设置内容 将Linux主机接入到网络,需要配置网络相关设置,包括以下内容 1.主机名 2.IP/netmask 3.路由:默认网关 4.DNS服务器,主DNS服务器,次DNS服务器,第三个DNS服务器 centos的网卡配置位…

ROS2学习--OOP方法编写python节点

1.创建工作空间 mkdir -p town_ws/src cd town_ws/src 2.创建功能包 ros2 pkg create village_li --build-type ament_python --dependencies rclpypkg create 是创建包的意思 --build-type 用来指定该包的编译类型,一共有三个可选项ament_python、ament_cmake、cmake --depen…

[python省时间]处理文档,包括批量查找,替换,

1、批量查找替换 # -*- coding: utf-8 -*- import os import re # path=os.getcwd()str_old = insert str_new = frs.event.queue file_formate = init.sql file_sql=open(rF:\bak\init_all.sql, r+, encoding=utf-8) def replace_txt(path):if path.find(file_formate) == len…

【python省时间】时间转换、日期格式化、时间戳转字符、

1、日期格式化 def paserTime(timestamp): t = time.time() f=time.localtime(timestamp/1000) print (t) #原始时间数据 # print (int(t)) #秒级时间戳 print (int(round(t * 1000))) #毫秒级时间戳 #nowTime = lambda: int(round(…

【Qt QML】TabBar的用法

Qt Quick中的TabBar提供了一个基于选项卡的导航模型。TabBar由TabButton控件填充,并且可以与任何提供currentIndex属性的布局或容器控件一起使用,例如StackLayout或SwipeView。 import QtQuick import QtQuick.Controls import QtQuick.LayoutsWindow …

CentOS 7虚拟机配置过程中所需组件的安装(二)

1.安装net-tools组件(解决无 ifconfig) # yum install net-tools 2.安装gcc、c编译器以及内核文件 # yum -y install gcc gcc-c kernel-devel 验证安装成功 3.安装nano(文本编辑器) # yum install nano

【Pytorch】(十四)C++ 加载TorchScript 模型

文章目录 (十四)C 加载TorchScript 模型Step 1: 将PyTorch模型转换为TorchScriptStep 2: 将TorchScript序列化为文件Step 3: C程序中加载TorchScript模型Step 4: C程序中运行TorchScript模型 【Pytorch】(十三)PyTorch模型部署: T…

javaWeb项目-校园志愿者管理系统功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、SpringBoot框架 …

马斯克的 xAI 融资 60 亿美元;英伟达收购两家 AI 创企丨 RTE 开发者日报 Vol.193

红杉资本、昆仑万维、字节跳动 开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有…

POCEXP编写—EXP编写实战(1)

TOC 1. 前言 通过上一篇文章的了解,应该都了解了POC是怎么编写的,而且POC和EXP的区别就是POC只能验证漏洞,简单来说就是通过判断特定的响应值来判断是否存在漏洞,而且EXP就需要将响应的内容给返回回来,但是整体在编写…

uni-app的POST请求和GET请求

uni-app就像一个盗版的Vue, 和Vue很想,又不完全像 //微信小程序post请求 uni.request({ url: http://127.0.0.1:8000/api/test_post/, // Django后端API地址 method: POST, //指定请求类型(POST还是GET)data: { //数据都要放在这里,以键值对的方式key1: value1, key2: valu…

详解23种设计模式——单例模式

单例模式 | CoderMast编程桅杆单例模式 单例模式是最常用的设计模式之一,他可以保证在整个应用中,某个类只存在一个实例化对象,即全局使用到该类的只有一个对象,这种模式在需要限制某些类的实例数量时非常有用,通常全局…

ROS2学习记录

一、编写C++节点并测试 1.创建功能包 C++功能包使用ament-camke作为编译基础,依赖为rclcpp。打开终端,进入town_ws/src运行下面的指令,目录结构如下 ros2 pkg create village_wang --build-type ament_cmake --dependencies rclcpp2.创建节点 village_wang/src下创建一个wa…

社区发现之标签传播算法(LPA)python实现

社区发现在图领域中备受关注,其根源可以追溯到子图分割问题。在真实的社交网络中,用户之间的联系紧密度不尽相同,导致形成了不同的社区结构。社区发现问题主要分为两类:非重叠和重叠社区。非重叠社区发现指的是每个节点仅属于一个社区,社区之间没有交集。在非重叠社区发现…

GitHub/R3D3项目环境配置踩坑记录

1、前言 项目链接地址:SysCV/r3d3 (github.com) 按照安装步骤容易出现的问题,environment.yaml文件中安装相关包,其中还有两个pip install githttps://github.com/..........这两个建议注释掉,后面再来安装这两个。 2、问题及解…

重磅!!!监控分布式NVIDIA-GPU状态

简介:Uptime Kuma是一个易于使用的自托管监控工具,它的界面干净简洁,部署和使用都非常方便,用来监控GPU是否在占用,非常美观。 历史攻略: docker应用:搭建uptime-kuma监控站点 win下持续观察…

多进程编程:原理、技术与应用

title: 多进程编程:原理、技术与应用 date: 2024/4/26 12:14:47 updated: 2024/4/26 12:14:47 categories:后端开发tags:多进程 并发编程 网络服务 分布式系统 任务处理 进程池 线程对比第一章:进程与线程 进程与线程的概念及区别:进程:进程是操作系统中的一个程序执行实例…

条款48:认识 template 元编程

**常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。 昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。

VS2017修改项目名称

修改项目名称 直接右击项目->重命名只是改了project的vcxproj文件中的ProjectName的值,而如果手动修改了项目文件夹的名称,就会造成解决方案按照其sln文件加载对应的项目时,找不到正确的项目路径,所以会加载失败。有了以上的描述,再来修改项目的名称就简单了,有以下几…