C++专业面试真题(1)学习

进程有多少种状态,如何转换

  • 创建:一个进程启动,首先进入创建状态,需要获取系统资源创建进程管理科PCB完成资源分配。
  • 就绪态:在创建完成后,进程已经准备好,处于就绪状态,但是还未获得处理器资源,无法运行。
  • 运行态:获取处理器资源,被系统调度,当具有时间片开始进入运行状态。如果进程的时间片用完就进入就绪状态。
  • 阻塞状态:在运行状态期间,如果进行了阻塞的操作,此时进程暂时无法操作就进入到了阻塞状态,在这些操作完成后就进入就绪状态。等待再次获取处理器资源,被系统调度,当具有时间片就进入运行状态。
  • 终止状态:进程结束或者被系统终止,进入终止状态。

在这里插入图片描述

线程的通信方式

线程间无需特别的手段进行通信,因为线程间可以共享一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段等。
只需要将数据复制到共享(全局或堆)变量中即可。

不过,要考虑线程的同步和互斥,应用的技术有:

  1. 信号:Linux中使用pthread_kill()函数堆线程发信号。
  2. 互斥锁、读写锁、自旋锁。互斥锁确保同一时间只能有一个线程访问共享资源,当锁被占用时试图对其加锁的线程都进入阻塞状态,当锁释放时哪个等待线程能获得取决于内核的调度。读写锁当以写模式加锁时而处于写状态时,任何试图加锁的线程都阻塞,当以读状态模式加锁时而处于读状态时读线程不阻塞,写线程阻塞,读模式共享,写模式互斥。自旋锁上锁受阻时,线程不阻塞而是在循环中查询能否获得该锁,没有线程的切换因而没有切换开销,不过CPU的霸占会导致CPU资源的浪费,所以自旋锁适用于多个处理器或者适用于锁被持有时间短而不希望在线程切换时产生开销的情况。
  3. 条件变量,条件变量可以以原子的方式阻塞进程,直到某个特定条件为真。对条件的测试是在互斥锁的保护下进行的,条件变量始终与互斥锁一起使用。
  4. 信号量 信号量实际上是一个非负的整数计数器,用来实现对公共资源的控制。在公共资源增加的时候,信号量就增加;公共资源减少的时候,信号量就减少;只有当信号量的值大于0的时候,才能访问信号量所代表的公共资源。

进程和线程的区别

  1. 进程有独立的地址空间,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。
  2. 进程和线程切换时,需要切换进程和线程的上下文,进程的上下文切换时间开销远远大于线程上下文切换时间,耗费资源较大,效率要差一些。
  3. 进程的并发性较低,线程的并发性较高。
  4. 每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  5. 系统在运行的时候会为每个进程分配不同的内存空间,而对于线程而言,系统不会为线程分配内存,线程组之间共享资源。
  6. 进程适用于需要独立崩溃保护的任务,一个进程崩溃不会影响其它进程。
  7. 线程适用于需要轻量级任务调度的应用,一个线程崩溃可能会影响同一进程内的其它线程。

线程和协程的区别

  1. 线程是操作系统的资源,线程的创建、切换、停止等都非常消耗资源,而创建协程不需要调用操作系统的功能,编程语言自身就能完成,所以协议也称为用户态线程,比线程轻量很多。
  2. 线程在多核环境下能做到真正意义上的并行,而协程是为并发而产生的。
  3. 一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行;
  4. 线程进程都是同步机制,而协程则是异步;
  5. 线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力;
  6. 操作系统对于线程开辟数量限制在千的级别,而协程可以达到上万的级别。

死锁,产生的必要条件,产生的原因,怎么预防死锁

死锁是指在两个或多个进程之间,每个进程都在等待其它进程释放资源,从而导致这些进程都无法继续执行的现象。这种情况会导致系统资源被无限期占用,进程无法推进。

死锁产生的必要条件

  • 互斥条件:资源不能被多个进程同时使用,即某个资源一次只能被一个进程占用。
  • 占有并等待:线程已经占有了一些资源,同时还在等待获取其它进程占有的资源。
  • 不剥夺条件:已经分配给某个进程的资源,不能被强行剥夺,只能由该进程自行释放。
  • 循环等待条件:存在一个进程循环等待的环形链,即进程集合{P1,P2,…,Pn}中,P1等待P2占有的资源,P2等待P3占有的资源,Pn等待P1占有的资源。

死锁产生的原因
死锁通常由以下原因引起:

系统资源不足:资源有限且不可共享,进程竞争资源,导致某些资源被占用且无法释放。

资源分配不当:系统对资源的分配方式不合理,可能会造成资源分配和释放的顺序不当。

进程间相互等待:进程之间的资源需求相互依赖,造成循环等待。

预防死锁的方法

死锁预防、死锁避免和死锁检测与恢复

死锁预防

  • 破坏互斥条件:尽量将资源设计为可以共享的,减少互斥资源的使用。
  • 破坏占有并等待条件:规定进程在请求资源时,必须一次性全部请求到,或者在申请新的资源前释放当前占用的资源。
  • 破坏不剥夺条件:允许系统强行剥夺某些资源,将资源重新分配给需要的进程。
  • 破坏循环等待条件:对所有资源进行编号,规定进程按一定顺序请求资源,保证资源申请的线性顺序,避免形成环形等待。

死锁避免
银行家算法:一种动态资源分配算法,在每次资源请求时,模拟资源分配情况,判断是否会进入不安全状态,只有在不会进入不安全状态时,才分配资源。

死锁检测与恢复
死锁检测:系统定期检测资源分配状态,判断是否存在死锁。常用的方法有资源分配图(Resource Allocation Graph, RAG)和基于等待图的检测算法。
死锁恢复:一旦检测到死锁,通过采取措施恢复系统:
终止进程:选择并终止某些进程,以释放资源。
资源剥夺:强制剥夺某些进程占有的资源,并将资源重新分配给其他进程。
回滚:将进程恢复到某个安全状态(通常需要系统支持事务处理和检查点)。

select的原理以及缺点

select是一种IO多路复用技术。
它的主旨思想:

  1. 首先要构造一个关于文件描述符的列表,将要监听的文件描述符添加到该列表中,这个文件描述符列表数据类型为fd_set,它是一个整型数组,总共1024个比特位,每一个比特位代表一个文件描述符的状态。比如当需要select检测时,这一位为0就表示不检测对应的文件描述符的事件,为1表示检测对应的文件描述符的事件。
  2. 调用select()系统调用,监听该列表中的文件描述符的事件,这个函数是阻塞的,直到这些描述符中的一个或者多个进行I/O操作时,该函数才返回,并修改文件描述符的列表中对应的值,0 表示没有检测到该事件,1 表示检测到该事件。
  3. select() 返回时,会告诉进程有多少描述符要进行 I/O 操作,接下来遍历文件描述符的列表进行 I/O 操作。

select的缺点:

  1. 每次调用select时,需要把fd从用户态拷贝到内核态,这个开销在fd很多时会很大。
  2. 每次调用select都需要在内核遍历传递进来的fd,这个开销在fd很多时也很大。
  3. select支持的文件描述符数量太小,默认是1024(由fd_set决定)
  4. 文件描述符集合不能重用,因为内核每次检测到事件都会修改,所以每次都需要重置;
  5. 每次 select 返回后,只能知道有几个 fd 发生了事件,但是具体哪几个还需要遍历文件描述符集合进一步判断。

epoll原理

  1. 调用epoll_create()会在内核中创建一个event_poll结构体数据,称为poll对象,在这个结构体中有 2 个比较重要的数据成员,一个是需要检测的文件描述符的信息 struct_root rbr(红黑树),还有一个是就绪列表struct list_head rdlist,存放检测到数据发送改变的文件描述符信息(双向链表);
  2. 调用 epoll_ctrl() 可以向 epoll 对象中添加、删除、修改要监听的文件描述符及事件;
  3. 调用 epoll_wt() 可以让内核去检测就绪的事件,并将就绪的事件放到就绪列表中并返回,通过返回的事件数组做进一步的事件处理。 epoll 的两种工作模式:

写时拷贝

当一个进程创建一个子进程时,操作系统通常会为子进程复制父进程的所有资源(包括内存空间,文件描述符等)。
但是,直接复制所有资源会带来很大的开销。

  1. 在创建子进程时,父进程和子进程共享相同的资源,而不是立即复制。
  2. 所有共享的资源被标记为只读。当任何一个进程尝试修改资源时,会触发一个页面错误。
  3. 在页面错误发生时,操作系统才会真正复制资源,将其标记为可写。这样,每个进程最终会拥有自己的资源副本,而没有修改资源的进程仍然共享原始资源。

分段和分页

分段
将用户程序地址空间分为若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,实现了离散分配。分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间,并且有助于共享和保护。

分页
用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。分页主要用于实现虚拟内存,从而获得更大的地址空间。

共享内存

共享内存是进程间通信的一种方式。不同进程之间共享的内存为同一段物理内存,所有的进程都可以访问共享内存中的地址。
如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其它进程。

共享内存的优点:因为所以进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率。访问共享内核和访问进程独有的内存区域一样快,并不需要通过系统调用或者其他需要切入内核的过程来完成。同时它也避免了对数据的各种不必要的复制。

但是共享内存没有同步机制,这使得我们在使用共享内存进行进程之间的通信时,往往需要借助其他手段来保证进程之间的同步工作。

虚拟内存和物理内存

物理内存
物理内存也称为主存,实际安装在计算机的内存硬件设备,如RAM(随机存取存储器)。物理内存用于存储当前正在执行的程序和数据。

  1. 物理内存,以前程序寻址用的是物理地址,范围有限,取决于CPU的地址线条数。比如32位平台下,寻址范围是4G。这是固定的,如果没有虚拟内存,且每次开启一个进程都给4G物理内存,内存显然不够。
    在这里插入图片描述

条件变量

条件变量是同步原语,用于多线程编程中,使线程能够等待某个条件变为真。
条件变量通常与互斥锁一起使用,来实现复杂的线程同步机制。

  1. wait:线程调用等待操作时,将自己挂起,直到被唤醒。在等待期间,线程会释放关联的互斥锁,以便其它线程能够修改条件。
  2. signal:唤醒一个等待在条件变量上的线程。
  3. brodcast:唤醒所有等待在条件变量上的线程。

I/O多路复用

I/O多路复用是一种使得程序能够同时监听多个文件描述符的技术,从而提高程序的性能。

I/O多路复用能够在单个线程中,通过监视多个I/O流的状态来同时管理多个I/O流,一旦检测到某个文件描述符上我们关心的事件发生,能够通知程序进行相应的读写操作。

Linux下实现I/O复用的系统调用有:select、poll、epoll。

  • select主旨思想:构造一个关于文件描述符的列表,将要监听的文件描述符添加到该列表中,这个文件描述符的列表数据类型为fd_set,是一个整型数组,总共1024个比特位,每一个比特位代表一个文件描述符的状态。比如当需要select检测时,这一位为0就表示不检测对应的文件描述符的事件,为1表示检测对应的文件描述符的事件。监听该列表中的文件描述符的事件,这个函数是阻塞的,直到描述符中的一个或者多个进行I/O操作时,该函数才返回,并修改文件描述符的列表中对应的值,0表示没有检测到该事件,1表示检测到该事件。
  • poll原理和select类似,但是poll支持的文件描述符没有限制。

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

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

相关文章

Linux内核——Linux内核体系模式(二)

1 Linux系统的中断机制 Linux内核将中断分为两类:硬件中断和软件中断(异常)。每个中断是由0-255之间的一个数字进行标识。 中断int0-int31(0x00-0x1f)作为异常int32-int255由用户自己设定 int32-int47对应与8259A中断…

PCL 基于点云RGB颜色的区域生长算法

RGB颜色的区域生长算法 一、概述1.1 算法定义1.2 算法特点1.3 算法实现二、代码示例三、运行结果🙋 结果预览 一、概述 1.1 算法定义 点云RGB区域生长算法: 是一个基于RGB颜色信息的区域生长算法,用于点云分割。该算法利用了点云中相邻点之间的颜色相似性来将点云分割成…

志愿者管理系统带讲解,保运行

技术栈 后端: SpringBoot Mysql MybatisPlus 前端: Vue Element 分为 管理员端 用户端 功能描述 用户端 管理员端 观看地址: B站 : 【毕设者】志愿者管理系统(安装讲解源码)

进程,线程,虚拟内存,交换技术

参考资料: 参考视频1https://www.bilibili.com/video/BV1Hs421M78w/?spm_id_from333.999.0.0&vd_source97411b9a8288d7869f5363f72b0d7613 参考视频2https://www.bilibili.com/video/BV1jE411W7e8/?spm_id_from333.337.search-card.all.click&vd_source…

Redis基础教程(六):redis 哈希(Hash)

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

3D开发工具HOOPS助力3D制造业仿真应用实现工厂环境规划和模拟!

HOOPS SDK是全球领先的3D领域开发工具提供商Tech Soft 3D 打造的控件产品,HOOPS SDK包括4款3D软件开发工具,其中HOOPS Exchange是一款CAD数据转换工具,可读取和导入30多种CAD文件格式;HOOPS Communicator是一款专注于Web端工程图形…

昇思25天学习打卡营第13天|基于MobileNetV2的垃圾分类

MobileNetv2模型原理介绍 相比于传统的卷积神经网络,MobileNet网络使用深度可分离卷积(Depthwise Separable Convolution)的思想在准确率小幅度降低的前提下,大大减小了模型参数与运算量。并引入宽度系数α和分辨率系数β使模型满…

根据后端返回的省市区重新封装树结构(省市区通过children表示)

对比图(截取部分): 注:先看分步,最后会附上完整代码(如果有用,可以给小编点个赞吗?十分感谢) 1.首先将前端返回相同的省份只展示一次 const obj {}; let keyList []r…

SpringBoot创建一个初始化项目

提示:这一篇文章,主要是为了之后可以快速的去搭建项目,当然这篇博客,作者也会根据以后学习到的东西,慢慢去整理 文章目录 前言 搭建一个SpringBoot项目,目的是为了快速开发项目 项目列表 响应枚举类 /***…

面向优秀SCI论文写作的语言大模型提示词设计

模板1:Abstract 润色 I want you to act as an SCI reviewer and evaluate the abstract of a research paper. You may check if the abstract is well-written and serves as an informative and descriptive overview of the research. You may also check if it…

Docker 部署 Nacos v2.3.2 版本

文章目录 Github官网文档Nacos 生态图Nacos Dockerdocker-compose.ymlapplication.propertiesNacos 官方示例 Github https://github.com/alibaba/nacos 官网 https://nacos.io/ 文档 https://nacos.io/docs/latest/what-is-nacos/ Nacos 生态图 Nacos Docker 镜像&…

ARM功耗管理软件之DVFSAVS

安全之安全(security)博客目录导读 思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS? 目录 一、ARM功耗管理软件之DVFS 二、ARM功耗管理软件之AVS 一、ARM功耗管理软件之DVFS 有一个实现特定…

我的技术十年

前言 十年一瞬,2014 年毕业至今,刚好十年。《异类》一书曾提到“一万小时定律”,要成为某个领域的专家,需要 10000 小时,按比例计算就是:如果你每天工作八小时,一天工作五天,那么成…

2024-07-01_外语学习

文章目录 前言1、Los Angeles至于单个los 是什么意思?我们可以逐词翻译这个西班牙语句子 2. Extraneous non-props attributes (style) were passed to component but could not be automatically inherited because component renders fragment or text root nodes…

ONLYOFFICE8.1版本桌面编辑器的测评(您的私人办公室)

ONLYOFFICE官网链接:ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE 在线PDF查看器和转换器 | ONLYOFFICE​​​​​​在线办公套件 | ONLYOFFICE 一,引言 在数字化浪潮中,高效、便捷、安全的办公工具对现代职场至关重要。今天,…

SOC模块LoRa-STM32WLE5有哪些值得关注

SoC 是片上系统的缩写,是一种集成芯片,集成了计算机或其他电子系统的所有或大部分组件。这些组件通常包括中央处理器 (CPU)、内存、输入/输出接口和辅助存储接口。包含数字、模拟、混合信号和通常的 RF 信号处理功能,具体取决于应用。片上系统…

守护矿山安全生产:AI视频分析技术在煤矿领域的应用

随着人工智能(AI)技术的快速发展,其在煤矿行业的应用也日益广泛。AI视频智能分析技术作为其中的重要分支,为煤矿的安全生产、过程监测、效率提升和监管决策等提供了有力支持。 一、煤矿AI视频智能分析技术的概述 视频智慧煤矿AI…

6 矩阵相关案例

矩阵计算在CUDA中的应用是并行计算领域的典型场景 ; 矩阵算法题通常涉及线性代数的基础知识,以及对数据结构和算法的深入理解。解决这类问题时,掌握一些核心思想和技巧会非常有帮助。以下是一些常见的矩阵算法题解题思想: 动态规划…

嵌入式UI开发-lvgl+wsl2+vscode系列:5、事件(Events)

一、前言 这节进行事件的总结,通过事件回调方式将用户和ui的交互行为绑定组合起来。 二、事件示例 1、示例1(点击事件) #include "../lv_examples.h" #if LV_BUILD_EXAMPLES && LV_USE_SWITCHstatic void event_cb(lv_…

Chapter8 透明效果——Shader入门精要学习笔记

一、基本概念 在Unity中通常使用两种方法来实现透明效果 透明度测试(无法达到真正的半透明效果)透明度混合(关闭了深度写入) 透明度测试 基本原理:设置一个阈值,只要片元的透明度小于阈值,就…