面试突击1

news2024/11/27 15:32:54

1.当线程没有拿到资源时,用户态和内核态的一个切换

操作系统中,进程线程是执行程序的基本单位。为了管理这些单位,操作系统使用了一种称为“进程状态”的机制,其中包括用户态和内核态两种状态。这两种状态代表了进程或线程在执行时的不同权限和上下文。

用户态(User Mode): 当进程或线程在用户态下运行时,它们只能访问受限的资源,例如它们自己的内存空间、文件、网络等。这是为了保护系统的稳定性和安全性,防止进程或线程意外地或恶意地访问其他进程或系统的核心资源。
**内核态(Kernel Mode):**当进程或线程需要执行一些特权操作,如访问硬件、修改其他进程的内存或执行系统调用时,它们会切换到内核态。在内核态下,进程或线程具有更高的权限,可以访问系统的核心资源。
现在,关于线程没有拿到资源时从内核态到用户态的转换:

当线程尝试获取某个资源(如内存、文件、网络套接字等)但未能成功时(例如,由于资源不足或资源已被其他线程占用),线程可能会执行一个系统调用,请求操作系统帮助获取该资源。这个系统调用会导致线程从用户态切换到内核态。在内核态下,操作系统会检查资源的情况,并决定是否满足线程的请求。如果资源不可用或无法满足线程的需求,操作系统会返回一个错误码给线程,告诉它无法获取资源。

一旦线程收到了这个错误码,它就知道它没有成功获取资源。然后,操作系统会将线程从内核态切换回用户态,让线程继续执行。

这种从用户态到内核态的转换和切换是操作系统管理和调度进程或线程的基本机制之一。它允许操作系统对进程或线程的行为进行监控和控制,确保系统的稳定性和安全性。

2.Synchronized

1.synchronized能保证原子性,有序性,可见性:

2.1加锁原理:

synchronized加锁原理:使用synchronized之后,当执行同步代码块前首先要先执行monitorenter指令,退出的时候monitorexit指令 ,其关键就是必须要对对象的监视器monitor进行获取 ,当线程获取monitor后才能继续往下执行,否则就只能等待。而这个获取的过程是互斥的,即同一时刻只有一个线程能够获取到monitor 。

2.2monitor 到底是什么?

Monitor在Java中是一个用于实现线程同步的机制,通常与synchronized关键字关联。Monitor内部包含了一个对象头(Object Header)和一块同步代码块。当线程尝试进入同步代码块时,它首先需要获得对象的monitor锁。如果锁被其他线程持有,则当前线程会被阻塞,直到获得锁为止。

具体来说,1.当一个线程尝试进入synchronized代码块时,它会尝试获取对象的锁。这个锁的状态信息存储在对象的对象头中。如果锁是偏向锁或轻量级锁,并且可以由当前线程获取,那么线程就会继续执行同步代码块。——>2.``如果锁已经升级为重量级锁,或者当前线程无法获取轻量级锁,那么就会涉及到Monitor的机制

在这种情况下,对象的对象头会被修改为指向一个Monitor对象(在JVM内部实现),这个Monitor对象包含了等待队列和锁的所有者信息。当前线程如果无法获取锁,就会被放入Monitor的等待队列中阻塞等待。当锁被释放时,Monitor会负责唤醒等待队列中的一个线程,并让它尝试获取锁。

2.2.1对象头里面有什么?

1.Mark Word:用于存储对象自身的运行时数据,如·哈希码(HashCode)、GC分代年龄、锁状态标志线程持有的锁偏向线程ID偏向时间戳等。这些信息都是用于Java对象的内存管理和并发控制。
2.Klass Word (或称为元数据类型指针):指向对象的类元数据(也就是方法区中的类型信息),虚拟机通过这个指针来确定这个对象是哪个类的实例。
可以通过这个指针——>对应的
类对象
(这个类对象可以找到InstanceKlass)
——>字节码文件加载到内存时就会得到Class对象(也就是镜像类)
,里面有InstanceKlass的地址,指向InstanceKlass(保存在方法区),从而获取字节码文件中的内容(也就是各种类信息)

2.2.2KlassWord指针和反射的区别:

1.反射:是Java提供的一种能力,允许程序在运行时获取和操作对象的内部属性、方法等信息。它通常涉及到使用java.lang.reflect包中的类,如Class、Method、Field等;它允许程序在运行时动态地访问和操作这些类元数据。例如,通过反射,您可以获取一个对象的Class对象然后进一步获取该类的所有方法、字段、构造函数等信息,甚至可以动态地调用方法和访问字段。

2.KlassWord:过程是Java对象实例化时的一部分,涉及到对象头的Klass Word(或称为元数据类型指针)和类元数据的加载。这个过程发生在对象创建时,由JVM自动处理,用于确定对象所属的类,以及该类在方法区中的元数据。这是Java对象模型的一部分,用于支持对象的类型识别和类型安全。
在这里插入图片描述

2.3 synchronized并发获取锁的过程

在这里插入图片描述

2.3.1 在多个线程竞争synchronized锁资源时,是公平还是非公平?那你是如何理解这种现象

synchronized关键字的非公平性确实可能导致线程饥饿的情况。当一个线程尝试获取synchronized锁时,它不会等待其他已经等待很久的线程,而是会立即尝试获取锁。如果它成功获取了锁,那么即使有其他线程已经在等待队列中等待了很长时间,它们也必须继续等待

2.4 synchronized的优化

2.4.1首先阐述 偏向锁和轻量型锁以及重量型锁之间的转换:

1.偏向锁(Biased Locking):
当同步代码块第一次被访问时,JVM会尝试使用偏向锁。在对象头中记录当前线程的ID,作为偏向锁。偏向锁是为了减少无竞争的锁获取和释放的开销。如果同步代码块在后续的执行中没有被其他线程访问,那么偏向锁就会持续保持。

2.轻量级锁(Lightweight Locking):
同步代码块出现竞争时(即多个线程尝试同时访问),偏向锁会升级为轻量级锁(轻量级锁是通过在对象头中存储一个指向线程栈锁记录指针来实现的——>如果此时原来的线程不再持有该锁新的线程通过CAS操作尝试将对象头的锁记录指针指向自己的锁记录,从而获取锁)。轻量级锁是为了减少线程挂起和恢复的开销。在轻量级锁下,线程会尝试通过自旋(忙等待)的方式获取锁,而不是直接阻塞。如果自旋成功,则线程获得锁并执行同步代码块。如果自旋失败(即锁仍被其他线程持有),则轻量级锁可能会进一步升级为重量级锁(锁膨胀)。

在这里插入图片描述
Cas的本质就是比较对象头并且交换(有性能损耗,看对象头中的锁状态是00否);——>就像反书包一样,每次都得翻一下书包看一下是否是自己名字

3.重量级锁(Heavyweight Locking):
当轻量级锁自旋超过一定的次数(通常取决于JVM的实现和配置)或者有其他线程在等待获取锁时,轻量级锁会升级为重量级锁。重量级锁会导致线程阻塞,并在需要时由操作系统进行调度。重量级锁的开销相对较大,因为它涉及到线程的挂起和恢复。

1.如果两个或更多的线程同时尝试获取轻量级锁,并且自旋等待(忙等待)超过了预设的次数,或者有一个线程已经持有锁而其他线程在等待,轻量级锁就会膨胀为重量级锁。
2.在这个过程中,对象头会发生变化,不再直接指向线程的锁记录,而是指向一个Monitor对象。
Monitor对象包含了等待队列(EntryList)和持有锁的线程(owner)等信息。
3.未能获取锁的线程会被放入Monitor的等待队列中,并阻塞等待锁的释放。
4.当持有锁的线程释放锁时,它会通过Monitor的机制来唤醒等待队列中的一个线程,该线程随后会尝试获取锁并继续执行。

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

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

相关文章

ubuntu屏幕小的解决办法

1. 安装vmware tools , 再点自适应客户机 执行里面的vmware-install.pl这个文件 :sudo ./vmware-install.pl 执行不了可以放到家目录,我放在了/home/book 里面 最后点这个自适应客户机 然后我这里点不了是因为我点了控制台视图和拉伸客户机&#xff0c…

[word] word怎么取消隐藏文字 #职场发展#微信

word怎么取消隐藏文字 Word有很多实用的技巧,学会了可以节省大量的时间在编辑上。今天就给大家分享下word怎么取消隐藏文字这个小技能。 1.选中内容设置 首先先显示段落符号标记(快捷鍵Ctrl Shift8),之后选中文本内容。 2.设置取消隐藏的文字 点击开始…

unreal engine5.1中设置convex decomposition凸包分解

UE5系列文章目录 文章目录 UE5系列文章目录前言一、convex decomposition是什么?二、convex decomposition属性设置 前言 今天使用ue5根据网上教程制作可操控直升机,找属性convex decomposition凸包分解,默认的碰撞如下图 如果想使用精细化…

回溯题中借助哈希法来巧妙去重的操作

今天总结一下回溯法以来做过的这些题,我又发现一个困扰了我的问题,就是在491. 非递减子序列、46. 全排列、47. 全排列 II中都有涉及到用哈希法,去记录曾经用过的元素,下面来总结一下吧。 首先得知道,为什么会用到哈希法…

OpenAI 最新发布的从文本生成视频模型 Sora 炸裂登场,它能根据文字指令创造逼真且富有想象力的场景

文章目录 一、前言二、主要内容三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 此页面上的所有视频均由 Sora 直接生成,未经修改。 OpenAI - Sora is an AI model that can create realistic and imaginative scenes f…

poetry,一个好用的Python项目依赖管理库

🏷️个人主页:鼠鼠我捏,要死了捏的主页 🏷️付费专栏:Python专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前言 在 Python 开发领域,项目依赖管理是一个至关重要的问题。Python Poetry 是一个现代化的项目依赖管理工具,旨在简化 Python 项目的依赖管理和打包…

图像卷积、步长、填充、特征图、多通道卷积、权重共享、感受野、池化

图像卷积、步长、填充、特征图、多通道卷积、权重共享、感受野、池化 卷积神经网络的一些基本概念:图像卷积、步长、填充、特征图、多通道卷积、权重共享、感受野、池化 1.图像卷积、步长、填充 图像卷积:卷积核矩阵在一个原始图像矩阵上 “从上往下、…

C++ STL: list使用及源码剖析

list使用 list常用函数及使用&#xff08;1&#xff09; #include <iostream> #include <list> #include <algorithm>int main() {// 创建liststd::list<int> myList {5, 2, 9, 1, 5, 6};// 打印liststd::cout << "Original list: &quo…

记录一次涩涩情侣飞行棋密码破解

注本公众号&#xff0c;长期推送技术文章 知攻善防实验室 红蓝对抗&#xff0c;Web渗透测试&#xff0c;红队攻击&#xff0c;蓝队防守&#xff0c;内网渗透&#xff0c;漏洞分析&#xff0c;漏洞原理&#xff0c;开源 工具&#xff0c;社工钓鱼&#xff0c;网络安全。 81篇原…

算法-----高精度2(高精度乘法,高精度除法,高精度斐波那锲数列)

高精度乘法 对于高精度乘法来说似乎不像高精度加减法那样简单了&#xff0c;我们似乎得一个一个加了&#xff0c;因为我们都知道 abaaaaa…a(b个a)。如果真要这要的话那1e9*1e9不得超时啊&#xff0c;所以不能这样&#xff0c;我们还是得从乘法竖式入手 这样看似乎看不出来什…

代码随想录算法训练营DAY18 | 二叉树 (5)

一、LeetCode 513 找树左下角的值 题目链接&#xff1a;513.找树左下角的值https://leetcode.cn/problems/find-bottom-left-tree-value/ 思路一&#xff1a;递归回溯全局变量比深度。 class Solution {int Max_depth 0;int result 0;public int findBottomLeftValue(TreeNo…

CAN通讯协议学习

介绍 它是一种异步通讯&#xff0c;can_high和can_low两条线利用的是电位差传输信号&#xff0c;抗干扰能力强&#xff0c;但是必须要有can控制器如TJA1050&#xff08;我的开发板&#xff09; 当 CAN 节点需要发送数据时&#xff0c;控制器把要发送的二进制编码通过 CAN_Tx 线…

数学建模:BP神经网络(含python实现)

原理 BP 神经网络&#xff0c;也称为多层感知机&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;&#xff0c;是一种常见的神经网络模型&#xff0c;用于解决各种机器学习问题&#xff0c;包括分类和回归。BP 代表“反向传播”&#xff08;Backpropagation&#…

磁盘database数据恢复: ddrescue,dd和Android 设备的数据拷贝

ddrescue和dd 区别&#xff1a; GNU ddrescue 不是 dd 的衍生物&#xff0c;也与 dd 没有任何关系 除了两者都可用于将数据从一台设备复制到另一台设备。 关键的区别在于 ddrescue 使用复杂的算法来复制 来自故障驱动器的数据&#xff0c;尽可能少地造成额外的损坏。ddrescue…

可视化锻炼日记ExerciseDiary

什么是 ExerciseDiary &#xff1f; ExerciseDiary 是带有 GitHub 风格的年度可视化的锻炼日记。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 exercisediary &#xff0c;选择第一个 aceberg/exercisediary&#xff0c;版本选择 latest。 本文写作时&#xff0c; lat…

【面试】盘点10个高频的前端算法题,你全都会了吗?

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 现在前端的面试中&#xff0c;算法出现的频率越来越高了&#xff0c;大厂更是必考算…

北邮复试刷题103. 二叉树的锯齿形层序遍历

103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a;输入&#xff1a…

Acwing---846. 树的重心

树的重心 1.题目2.基本思想3.代码实现 1.题目 给定一颗树&#xff0c;树中包含 n n n 个结点&#xff08;编号 1 ∼ n 1∼n 1∼n&#xff09;和 n − 1 n−1 n−1 条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 …

Kafka King 推荐一款漂亮、现代、实用的kafka客户端

Kafka King 一个漂亮、现代、实用的kafka客户端&#xff0c;使用python flet、flutter构建。 Github主页&#xff1a;https://github.com/Bronya0/Kafka-King 下载&#xff1a;https://github.com/Bronya0/Kafka-King/releases 功能清单 查看集群节点列表创建主题&#xf…

【动态规划】【C++算法】1563 石子游戏 V

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 LeetCoce:1563 石子游戏 V 几块石子 排成一行 &#xff0c;每块石子都有一个关联值&#xff0c;关联值为整数&#xff0c;由数组 stoneValue 给出。 游戏中…