Linux(操作系统)面经——part2
1、请你说说进程和线程的区别
1.进程是操作系统资源分配和调度的最小单位,实现操作系统内部的并发;线程是进程的子任务,cpu可以识别、执行的最小单位,实现程序内部的并发。
2.一个进程最少有一个线程或有多个,一个线程只能属于一个进程,线程依赖于进程存在
3.进程有独立的地址空间,线程有自己的堆栈和局部变量,多个线程可以共享同一地址空间。
4.进程的创建、切换、销毁的系统开销都远大于线程。创建或销毁进程时,系统要分配或回收相应的地址空间和io资源。切换时要保存整个cpu环境,还要配置新环境。而线程切换只保留少量寄存器内容。
5.线程间的通信方式很简单,因为它们共享了地址空间。但是要保证互斥、同步的操作保证数据的一致性。
6.一般一个进程挂掉并不会影响别的进程,但是一个线程挂掉,它所在的进程也会挂掉。
2、请你说说线程和协程的区别(了解)
1. 线程是操作系统的资源,线程的创建、切换、停止等都非常消耗资源,而创建协程不需要调用操作系统的功能,编程语言自身就能完成,所以协程也被称为用户态线程,协程比线程轻量很多;
2. 线程在多核环境下是能做到真正意义上的并行,而协程是为并发而产生的;
3. 一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行;
4. 线程进程都是同步机制,而协程则是异步;
5. 线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力;
6. 操作系统对于线程开辟数量限制在千的级别,而协程可以达到上万的级别。
3、请你说说线程的同步(通信)方式
因为多线程共享了同一片地址空间,所以线程间通信很简单,只需要将数据复制到共享(全局或堆)变量中即可。不过要考虑同步和互斥,保证数据的一致性。用到的技术有:
1.信号:Linux 中使用 pthread_kill() 函数对线程发信号
2.互斥锁、读写锁、自旋锁。
互斥锁mutex——保证同一时间只能有一个线程访问共享资源,当锁被占用时别的线程试图加锁都会进入阻塞状态(释放cpu资源使其从运行进入阻塞状态,当锁被释放时,调度哪个线程取决于内核的调度)。
读写锁rwlock——读共享,写互斥。写模式加锁时,其他不论读写试图加锁都阻塞。读加锁时,读进程不阻塞,写进程阻塞。
自旋锁spinlock——自旋锁上锁受阻时它不会阻塞,而是循环中轮询是否能获得锁,所以它不涉及线程切换所以没有切换开销,但是它霸占了cpu会浪费cpu资源。所以自旋锁适合并行结构(多处理器),或者锁被短时间持有又不希望有线程切换开销的情况。
3.条件变量:条件变量始终与互斥锁一起使用。条件变量以原子的方式阻塞进程直到达到某一特定条件,对条件的判断也是在互斥锁的保护下进行的。
4.信号量:信号量实际是一个非负的整数计算器,用于对公共资源的控制。公共资源增加信号量加1,减少减1。并且只有信号量的值大于0的时候才可访问。
p是对信号量的值进行原子减一,代表获取资源,当信号量的值为0时,p操作会阻塞,意味着资源不可用。
v操作是对信号量的值进行原子加一,代表释放资源,v操作从不阻塞。
4、请你说说互斥锁和自旋锁(参考3)
5、请你说说写时拷贝
fork :在进行 fork 复制进程时,并不马上进行父进程的地址空间的完全拷贝。而是使用了写时拷贝 (Copy-On-Write )技术,即就是让父进程和子进程共享父进程的页面,当父进程或子进程中任意一个 进程试图修改某个页面时,再将其拷贝一份给子进程。这样可以延迟页面拷贝,提高 fork 复制的效 率。另外,通常 Linux 中的新进程都是通过 fork+exec 实现的,如果 fork 后需要执行 exec 那么直接就不需要拷贝了。这里有一个小细节: fork 之后内核会将子进程排在队列的前面,以让子进程先执行,以免父进程执行导 致写时复制,而后子进程执行 exec 系统调用,因无意义的复制而造成效率的下降。vfork :除了子进程必须要立刻执行一次对 exec 的系统调用,或者调用 _exit( ) 退出,对 vfork( ) 的成功调 用所产生的结果和fork( ) 是一样的。 vfork( ) 会挂起父进程直到子进程终止或者运行了一个新的可执行文 件的映像。通过这样的方式,vfork( ) 避免了地址空间的按页复制。在这个过程中,父进程和子进程共享 相同的地址空间和页表项。实际上vfork( ) 只完成了一件事:复制内部的内核数据结构。因此,子进程也 就不能修改地址空间中的任何内存。
6、请你说说分段和分页
1、段主要为了内存独立/隔离,有利于共享;
2、页与物理内存映射,解决碎片问题,提升效率;
3、找到段,找到页表起始地址,找到页帧号,得到物理地址
7、请你介绍一下 I/O 多路复用
io复用使得一个程序能监听多个文件描述符,提高程序的性能。
Linux系统实现io复用的技术有select,poll,epoll
8、说一说 select 、poll、epoll
1. 用户态将文件描述符传入内核的方式2.select :创建 3 个文件描述符集并拷贝到内核中,分别监听读、写、异常动作。这里受到单个进程可以打开的fd 数量限制,默认是 1024 。poll :将传入的 struct pollfd 结构体数组拷贝到内核中进行监听。epoll :执行 epoll_create 会在内核的高速 cache 区中建立一颗红黑树以及就绪链表 ( 该链表存储已经就绪 的文件描述符) 。接着用户执行的 epoll_ctl 函数添加文件描述符会在红黑树上增加相应的结点。内核态检测文件描述符读写状态的方式select :采用轮询方式,遍历所有 fd ,最后返回一个描述符读写操作是否就绪的 mask 掩码,根据这个掩码给fd_set 赋值。 poll :同样采用轮询方式,查询每个 fd 的状态,如果就绪则在等待队列中加入一项并继续遍历。epoll :采用回调机制。在执行 epoll_ctl 的 add 操作时,不仅将文件描述符放到红黑树上,而且也注册了回调函数,内核在检测到某文件描述符可读/ 可写时会调用回调函数,该回调函数将文件描述符放在就绪链表中。3. 找到就绪的文件描述符并传递给用户态的方式select :将之前传入的 fd_set 拷贝传出到用户态并返回就绪的文件描述符总数。用户态并不知道是哪些文件描述符处于就绪态,需要遍历来判断。poll :将之前传入的 fd 数组拷贝传出用户态并返回就绪的文件描述符总数。用户态并不知道是哪些文件描述符处于就绪态,需要遍历来判断。epoll : epoll_wait 只用观察就绪链表中有无数据即可,最后将链表的数据返回给数组并返回就绪的数量。内核将就绪的文件描述符放在传入的数组中,所以只用遍历依次处理即可。这里返回的文件描述符是通过mmap 让内核和用户空间共享同一块内存实现传递的,减少了不必要的拷贝。4. 重复监听的处理方式select :将新的监听文件描述符集合拷贝传入内核中,继续以上步骤。poll :将新的 struct pollfd 结构体数组拷贝传入内核中,继续以上步骤。epoll :无需重新构建红黑树,直接沿用已存在的即可。epoll 更高效的原因1. select 和 poll 的动作基本一致,只是 poll 采用链表来进行文件描述符的存储,而 select 采用 fd 标注位来存放,所以select 会受到最大连接数的限制,而 poll 不会。2. select 、 poll 、 epoll 虽然都会返回就绪的文件描述符数量。但是 select 和 poll 并不会明确指出是哪些文件描述符就绪,而epoll 会。造成的区别就是,系统调用返回后,调用 select 和 poll 的程序需要遍历监听的整个文件描述符找到是谁处于就绪,而epoll 则直接处理即可。3. select 、 poll 都需要将有关文件描述符的数据结构拷贝进内核,最后再拷贝出来。而 epoll 创建的有关文件描述符的数据结构本身就存于内核态中,系统调用返回时利用mmap() 文件映射内存加速与内核空间的消息传递:即epoll 使用 mmap 减少复制开销。4. select 、 poll 采用轮询的方式来检查文件描述符是否处于就绪态,而 epoll 采用回调机制。造成的结果就是,随着fd 的增加, select 和 poll 的效率会线性降低,而 epoll 不会受到太大影响,除非活跃的socket很多。5. epoll 的边缘触发模式效率高,系统不会充斥大量不关心的就绪文件描述符虽然 epoll 的性能最好,但是在连接数少并且连接都十分活跃的情况下,select 和 poll 的性能可能比 epoll 好,毕竟 epoll 的通知机制需要很多函数回调。
9、请你说一说虚拟内存与物理内存
1. 物理内存 以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于 CPU 的地址线条数。比如在 32 位平台下,寻址的范围是 2^32 也就是 4G。并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给 4G 物理内存,就可能会出现很多问题: - 因为物理内存是有限的,当有多个进程要执行的时候,都要给 4G 内存,很显然内存不够,这很快就分配完了,于是没有得到分配资源的进程就只能等待。当一个进程执行完了以后,再将等待的进程装入内存。这种频繁的装入内存的操作效率很低 - 由于指令都是直接访问物理内存的,那么任何进程都可以修改其他进程的数据,甚至会修改内核地址空间的数据,这是不安全的
2. 虚拟内存 由于物理内存有很多问题,所以出现了虚拟内存。虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
10、请你介绍一下死锁,产生的必要条件,产生的原因,怎么预防死锁
死锁:两个或几个进程在运行时由于资源争夺处于互相等待的过程,如无外力干涉,它们都不会有改变。
产生的原因:系统资源不足、资源分配不合理、进程运行推进方式不合理
必要条件:
互斥条件——一个资源每次只能给一个进程使用
请求与保持条件——一个进程在请求资源时,对已获得的资源保持不变
不可剥夺条件——对于已获取资源的进程,不可强行剥夺其资源
循环等待条件——若干进程处于一种头尾相接的循环等待的过程
11、请你说说条件变量
条件变量是线程同步的一种方式,这种方式下有两种状态的线程:等待条件变量成立而挂起的线程和条件变量成立。为了避免竞争,所以条件变量总是和互斥锁一起使用。
条件变量可以以原子的方式阻塞线程,直到满足条件变量为真为止。
条件变量为假时线程阻塞并以原子方式释放等待条件变化的互斥锁。当另一个线程条件改变时,该线程可能会向相关原子变量发出信号,于是几个处于等待的线程将会唤醒,获取互斥锁,然后评估条件。
相关文章:
Linux(操作系统)面经——part2
1、请你说说进程和线程的区别 1.进程是操作系统资源分配和调度的最小单位,实现操作系统内部的并发;线程是进程的子任务,cpu可以识别、执行的最小单位,实现程序内部的并发。 2.一个进程最少有一个线程或有多个,一个线程…...
Flink系列之:WITH clause
Flink系列之:WITH clause 适用流、批提供了一种编写辅助语句以在较大查询中使用的方法。这些语句通常称为公共表表达式 (CTE),可以被视为定义仅针对一个查询而存在的临时视图。 WITH 语句的语法为: WITH <with_item_definition> [ , …...

JMeter直连数据库
JMeter直连数据库 使用场景操作步骤 使用场景 用作请求的参数化 登录时需要的用户名,密码可以从数据库中查询获取 用作结果的断言 添加购物车下订单,检查接口返回的订单号,是否与数据库中生成的订单号一致 清理垃圾数据 添加商品后ÿ…...

Linux部署MySQL5.7和8.0版本 | CentOS和Ubuntu系统详细步骤安装
一、MySQL数据库管理系统安装部署【简单】 简介 MySQL数据库管理系统(后续简称MySQL),是一款知名的数据库系统,其特点是:轻量、简单、功能丰富。 MySQL数据库可谓是软件行业的明星产品,无论是后端开发、…...
STL中set和multiset容器的用法(轻松易懂~)
目录 1. 基本概念 2. 构造和赋值 3. 大小和交换 4. 插入 和 删除 5. 统计 和 查找 6. set容器的排序 1. 基本概念 set和multiset属于关联式容器,底层结构式二叉树,所有元素都会在插入时自动排序。 如果你对容器的概念,或是二叉树不太了…...

Codeforces Round 915 (Div. 2)
Constructive Problems(Problem - A - Codeforces) 题目大意:现在有一片城市被摧毁了,需要进行重建,当一个城市水平相邻和竖直相邻的位置都至少有一个城市的时候,该城市可以被重建。所有城市排成n行m列的矩…...
C语言经典错误总结(三)
一.指针与数组理解 我们都知道定义一个数组然后对其进行各种想要的操作,但是你真的能够区分那些是对数组的操作,那些是通过指针实现的吗? 例如;arr[1]10;这个是纯粹对数组操作实现的吗? 答案肯定不是,实际上我们定义…...

Ubuntu系统入门指南:基础操作和使用
Ubuntu系统的基础操作和使用 一、引言二、安装Ubuntu系统三、Ubuntu系统的基础操作3.1、界面介绍3.2、应用程序的安装和卸载3.3、文件管理3.4、系统设置 四、Ubuntu系统的日常使用4.1、使用软件中心4.2、浏览器的使用和网络连接设置4.3、邮件客户端的配置和使用4.4、文件备份和…...

MyBatis原理解读
我们项目中多用MyBatis进行数据库的读写,开源的MyBatis-Plus框架对其进行了增强,使用上更加简单,我们之前的很多项目也是直接用的MyBatis-Plus。 数据库操作的时候,简单的单表读写,我们可以直接在方法里链式组装SQL,复杂的SQL或涉及多表联合join的,需要在xml手写SQL语句…...

Linux---文本搜索命令
1. grep命令的使用 命令说明grep文本搜索 grep命令效果图: 2. grep命令选项的使用 命令选项说明-i忽略大小写-n显示匹配行号-v显示不包含匹配文本的所有行 -i命令选项效果图: -n命令选项效果图: -v命令选项效果图: 3. grep命令结合正则表达式的使用 正则表达式说明^以指…...
Unity中Shader语义的理解
前言 以下内容主要是个人理解,如有错误,欢迎严厉批评指正。 一、语义的形式在Shader中是必要的吗? 不是必要的。 使用HLSL和CG语言来编写Shader需要语义,使用GLSL编写Shader不需要。 二、语义的意义? 语义是什么&…...
Flink系列之:Top-N
Flink系列之:Top-N 一、TOP-N二、无排名输出优化 一、TOP-N 适用于流、批Top-N 查询可以根据指定列排序后获得前 N 个最小或最大值。最小值和最大值集都被认为是Top-N查询。在需要从批表或流表中仅显示 N 个底部或 N 个顶部记录时,Top-N 查询是非常有用…...

CSS的三大特性(层叠性、继承性、优先级---------很重要)
CSS 有三个非常重要的三个特性:层叠性、继承性、优先级。 层叠性 场景:相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突 的问题 原则: 样式冲突&am…...

飞天使-docker知识点10-docker总结
文章目录 docker 知识点汇总docker chatgpt解释学习路线cmd和 ENTRYPOINT 的区别harbor安装漏洞扫描 docker 知识点汇总 docker 基础用法 docker 镜像基础用法 docker 容器网络 docker 存储卷 dockerfile docker仓库 harbor docker-compose docker chatgpt解释学习路线 学习…...
旅游管理虚拟情景实训教学系统演示
首先,虚拟情景实训教学系统为旅游管理专业的学生提供了一个全新的实践平台。在传统的旅游管理教学中,学生往往只能通过理论学习来了解相关知识,而无法亲身实践。虚拟情景实训教学系统则可以通过模拟真实的旅游场景,让学生能够亲身…...

Linux Shell——输入输出命令详解
Shell 输入输出 1. read2. echo3. printf 总结 最近学习了shell相关语法,顺便总结一下关于shell的输入输出命令read和echo、printf。 1. read shell的输入命令,可以从标准控制台中读取一行,并把输入行中的每个字段赋值给指定的变量 可以看到…...

MFC 第一个窗口程序
目录 一、新建Windows桌面应用程序,空项目 二、修改项目属性 三、编写程序 一、新建Windows桌面应用程序,空项目 创建MFCBase.cpp,整个项目很干净 二、修改项目属性 使用多字节编码 使用MFC库 三、编写程序 需要包含 afxwin.h 文件&…...

SQL语句的执行顺序怎么理解?
SQL语句的执行顺序怎么理解? 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别,对于编写高效、可靠的SQL代码至关重要。今天,让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…...

js解析.shp文件
效果图 原理与源码 本文采用的是shapefile.js工具 这里是他的npm地址 https://www.npmjs.com/package/shapefile 这是他的unpkg地址,可以点开查看源码 https://unpkg.com/shapefile0.6.6/dist/shapefile.js 这个最关键的核心问题是如何用这个工具,网上…...

关于“Python”的核心知识点整理大全25
目录 10.3.4 else 代码块、 10.3.5 处理 FileNotFoundError 异常 alice.py 在这个示例中,try代码块引发FileNotFoundError异常,因此Python找出与该错误匹配的 except代码块,并运行其中的代码。最终的结果是显示一条友好的错误消息&#x…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...

rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...