面试操作系统八股文五问五答第一期

面试操作系统八股文五问五答第一期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!

⭐点赞⭐收藏⭐不迷路!⭐

1.死锁产生的条件

1.互斥条件,即当资源被一个线程使用(占有)时,别的线程不能使用

2.不可剥夺条件,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放

3.请求和保持条件,即当资源请求者在请求其他的资源的同时保持对原有资源的占有

4.循环等待条件,即存在一个等待循环队列:p1 要 p2 的资源,p2 要 p1 的资源,形成了一个等待环路

四个条件都成立的时候,便形成死锁。死锁情况下打破上述任何一个条件,便可让死锁消失

2.线程的生命周期

java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态:

●NEW: 初始状态,线程被创建出来但没有被调用 start() 。

●RUNNABLE: 运行状态,线程被调用了 start()等待运行的状态。

●BLOCKED:阻塞状态,需要等待锁释放。

●WAITING:等待状态,表示该线程需要等待其他线程做出一些特定动作(通知或中断)。

●TIME_WAITING:超时等待状态,可以在指定的时间后自行返回而不是像 WAITING 那样一直等待。

●TERMINATED:终止状态,表示该线程已经运行完毕。

img

3.查看线程状态的工具

1.使用Thread类的getState()方法

2.使用Java VisualVM Jconsole JMC

都在jdk的bin目录

3.使用命令行工具jstack 进程ID,

4.Linux使用top命令 top -H -p 查看进程内运行的线程情况

5.Linux先使用ps -aux (a显示所有用户的进程,不仅仅是当前用户,u显示用户为主的格式显示进程信息,包括用户,进程ID,CPU使用率,内存使用率,x 显示没有中断的进程,通常用于显示守护进程) 或者使用ps -ef命令,e显示所有进程,不限于当前终端会话,-f完整的格式显示进程信息,包括父进程,用户,UID,TTY,状态。

ps -T -p pid 查看进程PID12345的线程列表

4.用户态和内核态的区别?

用户态(User Mode)和内核态(Kernel Mode)是操作系统中的两种不同的执行权限级别。这两种级别决定了程序的运行环境和可执行的操作。

1用户态:

○用户态是指程序运行在较低的权限级别,不具有直接访问和控制系统底层资源的能力。

○在用户态下运行的程序只能访问用户空间中的资源,如用户进程的堆栈、内存、文件和网络连接等。

○用户态下运行的程序需要通过系统调用(System Call)向操作系统请求执行特权操作,如读写文件、创建进程等。

2内核态:

○内核态是操作系统的最高权限级别,拥有对系统底层资源的完全控制权。

○在内核态下运行的程序可以直接访问和操作底层硬件资源,如磁盘、进程控制块、中断控制器等。

○内核态下的程序可以执行特权指令和访问系统级数据结构,能够完成系统管理和控制的任务,如调度进程、分配内存等。

用户态和内核态之间的切换是通过系统调用和中断(异常)来实现的。当用户态程序需要执行特权操作时,需要通过系统调用将控制权切换到内核态,由操作系统来处理特权操作。而当内核态的任务完成后,通过上下文切换将控制权返回给用户态程序。

总结:用户态和内核态的区别主要在于权限级别和资源访问能力。用户态程序只能运行在受限的环境中,不能直接访问底层资源,而内核态程序拥有完全的系统权限和资源访问能力。

5.为什么用户态和内核态之间的切换会影响到线程的执行效率,真正慢的点在哪里?

用户态和内核态之间的切换会影响线程的执行效率,主要是由于涉及到以下方面的开销和延迟:

1上下文切换开销:当从用户态切换到内核态时,需要保存用户态的上下文信息并加载内核态的上下文信息,这涉及到寄存器状态的保存和恢复,堆栈切换等操作,会引入一定的开销。

2内核调度开销:在切换到内核态之后,操作系统需要进行调度决策来确定下一个要执行的线程或进程,这涉及到查找、选择合适的线程,进行调度算法的计算和决策,可能会消耗较多的运算时间。

3内核资源访问延迟:在内核态中,线程可以访问并操作内核资源,如文件系统、设备驱动程序等。但由于同一时间可能有多个线程或进程同时请求访问某个资源,需要进行锁机制或其他同步机制,以保证资源的安全访问,这可能引入额外的延迟。

4缓存失效:当线程从用户态切换到内核态时,可能会导致CPU缓存中的数据失效,因为内核态和用户态的数据访问权限不同,可能会引起缓存的刷新和重新加载,这也会导致额外的延迟。

真正影响线程执行效率的慢点主要在于上下文切换开销和内核调度开销。这些开销都需要耗费时间和计算资源,因此频繁的上下文切换和内核调度会导致线程的执行效率下降。为了优化线程的执行效率,可以采取一些策略,如减少不必要的上下文切换,优化调度算法,避免过度的内核态访问等。

1操作系统有一个锁的概念,谈谈你对它的理解?

锁是操作系统中用于控制并发访问共享资源的机制。它用于保证在同一时间只有一个线程或进程可以访问被锁定的资源,从而避免数据竞争和不一致性。

锁的实现方式有多种,常见的包括互斥锁(Mutex)、读写锁(ReadWrite Lock)、自旋锁(Spinlock)、信号量(Semaphore)等。

互斥锁(Mutex)是最常见的锁类型,它提供了两个基本操作:上锁(Lock)和解锁(Unlock)。当一个线程需要访问共享资源时,首先尝试去获取锁,如果锁已经被其他线程占用,则线程进入阻塞状态,等待锁被释放;当某个线程完成对共享资源的访问后,会释放锁,从而允许其他线程获取锁并访问资源。

读写锁(ReadWrite Lock)是一种特殊的锁类型,它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这样可以提高读操作的并发性能,但写操作会变得串行化,保证了数据的一致性。

自旋锁(Spinlock)是一种忙等待的锁,当一个线程需要获取锁时,它会循环忙等待,不断尝试获取锁,直到成功获取为止。自旋锁适用于对锁的占用时间较短的情况。

信号量(Semaphore)是一种更为通用的同步机制,除了可以用作锁,还可以用于线程间的信号通知。它基于计数器的概念,当计数器大于0时,线程可以获取信号量,当计数器减至0时,线程需要等待其他线程释放信号量。

锁的作用是保护共享资源的一致性和完整性,避免多个线程同时访问和修改共享资源导致的数据竞争和不确定性。但锁的过度使用或不合理使用可能会引起死锁、饥饿等问题,因此在应用中需要合理设计和使用锁机制。

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

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

相关文章

流畅的python--小技巧总结

对于百万级以上数据的读写效率优化 在Python中,我们可以通过array模块来方便地创建和操作数组,array模块提供了性能优异的数组操作方法,可以使我们的代码更加高效。同时,Python也提供了读写二进制文件和普通文本文件的方法&#…

Rename--CAM在checkpoint恢复上的流程与优势

参考自:计算机体系结构-寄存器重命名 - 知乎 (zhihu.com) 这里的重点在红色部分描述上,也是容易想不通的地方; 在SRAM方法中要恢复映射表状态,需要事先把分支指令来临时刻的映射表全份拷贝下来,然后在恢复时把备份复制…

Linux 环境下,jdbc连接mysql问题

1. 下载MySQL的JDBC驱动: 从MySQL官网下载最新的MySQL Connector/J,并将其解压到某个目录,比如/usr/local/mysql/。 2. 将JDBC驱动添加到类路径: 将JDBC驱动添加到类路径,可以使用以下命令: export CLA…

AMEYA360分析兆易创新GD32A490系列车规级MCU

兆易创新GigaDevice今日宣布,正式推出全新GD32A490系列高性能车规级MCU,以高主频、大容量、高集成和高可靠等优势特性紧贴汽车电子开发需求,适用于车窗、雨刷、智能车锁、电动座椅等BCM车身控制系统,以及仪表盘、娱乐影音、中控导…

智慧景区(园区)数字孪生可视化GIS解决方案

随着技术的日新月异,景区日常管理及运营中使用到的智慧化工具越来越丰富,智慧化硬件设备也越来越多,而其中各个管理系统往往又是相互独立,形成一个个数据孤岛。智慧景区管理平台就是将各个孤岛中的数据及功能汇集起来,…

政采云基于 Dubbo 的混合云数据跨网实践

作者:王晓彬,政采云资深开发工程师 项目背景 政采云的业务是为政府提供的购物网站,类似于淘宝。政府采购会在政采云上做企业采购、政府采购的业务。 云岛中的“云”是指我们的云平台,云平台是我们公司自己部署的一套购物网站&a…

【计算机网络漫谈】OSI七层模型与TCP/IP四层(参考)模型

一、七层?四层? 1.为什么需要协议?2.OSI七层模型是干什么的?3.TCP/IP四层(参考)模型4.TCP/IP(参考)模型与OSI七层模型有什么异同? 二、自底向上的网络分层 1. 物理层2…

防火墙 iptables的使用

目录 什么是防火墙 原理 代理 防火墙的工具 4表5列 五链:控制流量的时机 四个表:如何控制流量 ​编辑 iptables 软件 格式 选项 跳转 查iptables 的规则 添加规则 A I 删除规则 清空规则 替换规则 R 修改默认规则(默…

校园外卖小程序源码系统 附带完整的搭建教程

随着大学生消费水平的提高,对于外卖服务的需求也在不断增加。很多学生都面临着课业繁重、时间紧张等问题,无法亲自到餐厅就餐。因此,开发一款适合校园外卖市场的应用软件,将为广大学生提供极大的便利。 以下是部分代码示例&#…

Python Numpy学习(1)

python: np.pad() 函数的用法 np.einsum(爱因斯坦求和约定) python编程之np.isnan()的用法 Python_Numpy库中各种矩阵基本运算 numpy基本加减和取行操作 numpy的加减乘除运算 NumPy 算术函数 TypeError: can’t convert cuda:0 device type tensor to numpy. Use Tenso…

了解linux网络时间服务器

本章主要介绍网络时间服务器。 使用chrony配置时间服务器 配置chrony客户端向服务器同步时间 20.1 时间同步的必要性 些服务对时间要求非常严格,例如,图20-1所示的由三台服务器搭建的ceph集群。 这三台服务器的时间必须保持一致,如果不一致…

【征稿倒计时十天】第三届高性能计算与通信工程国际学术会议(HPCCE 2023)

【有ISSN、ISBN号!!往届均已完成EI检索】 第三届高性能计算与通信工程国际学术会议(HPCCE 2023) 2023 3rd International Conference on High Performance Computing and Communication Engineering (HPCCE 2023) 2023年12月22-24日 | 中国哈尔滨 第三…

CSS新手入门笔记整理:CSS溢出声名overflow

通常一个盒子的内容是被限制在盒子边框之内的,但是有时也会溢出,即部 分或者全部内容跑到盒子边框之外。 语法 元素{overflow:取值;} 属性值 说明 visible 若内容溢出,则溢出内容可见(默认值) hid…

数据结构与算法-D5-D7线性表之链表

结点类型描述 程序编写 节点定义 linklist.h linklist.c list_create 1、申请内存 2、赋值 3、返回头结点 list_tail_insert 1、建立一个新结点 2、找尾结点 3、尾部插入 list_show list_insert 链表在某一位置的插入 1、调用算法list_get 2、插入 1)新节点 2&a…

低代码(Low Code):美味膳食还是垃圾食品?如何入门低代码?

文章目录 低代码:美味膳食还是垃圾食品?1. 什么是低代码开发?2. 低代码开发的优势2.1 提高效率2.2 降低门槛 3. 低代码开发的挑战3.1 安全性问题3.2 可扩展性和灵活性问题 4. 低代码开发是美味膳食还是垃圾食品?5. 低代码能否替代…

【Android】查看keystore的公钥和私钥

前言: 查看前准备好.keystore文件,安装并配置openssl、keytool。文件路径中不要有中文。 一、查看keystore的公钥: 1.从keystore中获取MD5证书 keytool -list -v -keystore gamekeyold.keystore 2.导出公钥文件 keytool -export -alias …

天线是什么

天线 电子元器件百科 文章目录 天线前言一、天线是什么二、天线的类别三、天线的应用实例四、天线的作用原理总结前言 不同种类和设计的天线用于不同的应用领域,如广播、电视、无线通信、雷达、卫星通信、导航系统等。常见的天线类型包括柱状天线、片状天线、螺旋天线、饼叶天…

Node.js快速搭建简单的HTTP服务器并发布公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

西工大计算机学院计算机系统基础实验一(函数编写15~17)

还是那句话,稳住心态,稳住心态,稳住心态。心里别慌,心里别慌,心里别慌。 第15题,howManyBits,返回用二进制补码形式表示x所需的最小二进制位数。比如howManyBits(12) 5,12可以被表…

初学vue3与ts:vue3选项式api获取当前路由地址

vue2的获取方法 this.$route.pathvue3选项式api获取方法 import { useRouter } from vue-router; const router useRouter(); console.log(router) console.log(router.currentRoute.value.path)