腾讯面试准备-2024.3.25

腾讯面试准备-2024.3.25

  • 腾讯面试准备-2024.3.25
    • 自我介绍
    • C++11/14/17新特性
      • C++11新特性
      • C++14新特性
      • C++17新特性
    • struct和class的区别
    • 进程状态
    • 现代的流媒体通信协议栈
    • 流媒体协议详解
    • extern "C"
    • 程序从编译到执行的过程
    • 进程、线程、协程
      • 进程
      • 线程
      • 协程
    • 如何实现一个信号与槽系统?
    • 进程间的通信方式

腾讯面试准备-2024.3.25

自我介绍

略。

C++11/14/17新特性

C++11新特性

  1. 自动类型推导(Type Inference):引入了 auto 关键字,可以根据初始化表达式自动推导变量的类型。
  2. 统一的初始化语法(Uniform Initialization):可以使用花括号 {} 初始化对象,无论是基本类型、数组、类对象还是容器。
  3. lambda 表达式:可以在代码中定义匿名函数,简化函数对象的创建和使用。
  4. 范围-based for 循环:用于遍历容器中的元素,提供了一种更简洁、安全的遍历方式。
  5. nullptr:引入了 nullptr 关键字,代表空指针,替代了传统的 NULL 宏。

C++14新特性

  1. C++14引入了通用lambda表达式,可以使用auto关键字作为参数类型和返回类型,使得lambda表达式更加灵活。
  2. C++14引入了二进制字面量,允许程序员使用二进制表示法来表示整数值。二进制字面量以前缀0b或0B开头,后面跟着一串二进制数字。例如,0b101010表示十进制数42。
  3. 数字分隔符使得大数字的可读性变得更高了。

C++17新特性

  1. 自从 C++11 起,C++ 就已经支持以 u8 为前缀的 UTF­8 字符串字面量。C++17 进一步支持以 u8 为前缀的 UTF­8 字符字面量。比如:char c = u8’6’。
  2. C++17 之前,在类中定义的非 const 静态变量,需要在类的外面进行初始化。C++17 引入了内联变量的概念,可以直接在类中定义并初始化非 const 静态变量。
  3. C++17 中,if 和 switch 语句允许我们在条件表达式里声明一个初始化语句。
  4. C++17 终于将文件系统纳入标准中,提供了关于文件系统的很多功能,基本上应有尽有。比如:创建目录、拷贝文件、判断文件是否存在等等。

struct和class的区别

  1. 默认访问权限:结构体的成员默认访问权限是公共的(public),类的成员默认访问权限是私有的(private)。
  2. 成员函数:类可以包含成员函数,这些函数可以操作类的私有成员,并且可以实现类的行为和功能。结构体也可以有成员函数,但是它们的主要目的是为了实现一些操作,而不是定义类似于类的行为。
  3. 继承:类可以通过继承实现子类与父类之间的关系,可以使用公共、保护或私有继承来控制成员的访问权限。结构体也可以继承,但由于其成员默认是公共的,继承可能导致访问权限问题。
  4. 构造函数和析构函数:类可以拥有构造函数和析构函数,用于对象的初始化和清理。结构体没有默认的无参构造函数,且只能声明有参的构造函数,没有析构函数,它们的使用场景通常是比较简单的数据封装。
  5. 默认成员访问标签:在类中,可以使用访问标签(public、private、protected)来指定成员的访问权限。在结构体中,无法使用访问标签来指定成员的访问权限,所有成员都默认是公共的。
  6. class是引用类型,struct是值类型。作为参数传递时,class变量以按址方式传递,而struct变量是以按值方式传递的。
  7. class实例由垃圾回收机制来保证内存的回收处理,而struct变量使用完后立即自动解除内存分配。

进程状态

在这里插入图片描述

现代的流媒体通信协议栈

在这里插入图片描述

流媒体协议详解

  • RTP (Real-Time Transport Protocol) 实时运输协议

  • RTSP (Real-Time Streaming Protocol) 实时流式协议

  • RTCP (RTP Control Protocol) 实时运输控制协议

  • RTMP (Real Time Message Protocol) 实时消息协议

  • SIP (Session Initiation Protocol) 会话初始协议

  • SDP (Session Description Protocol) 会话描述协议

  • WebRTC (Web Real-Time Communications)

  • WebSocket:WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

extern “C”

extern "C"是C++特有的指令(C无法使用该指令),目的在于支持C++与C混合编程。

extern “C”的作用是告诉C++编译器(如g++)用C规则编译指定的代码。

程序从编译到执行的过程

一个程序,从编写完代码,到被计算机运行,总共需要经历以下四步:

  1. 编译:编译器会将程序源代码编译成汇编代码。
  2. 汇编:汇编器会将汇编代码文件翻译成为二进制的机器码。
  3. 链接:链接器会将一个个目标文件和库文件链接在一起,成为一个完整的可执行程序。
  4. 载入:加载器会将可执行文件的代码和数据从硬盘加载到内存中,然后跳转到程序的第一条指令处开始运行。

进程、线程、协程

进程

进程是资源分配的最小单位,是最小的资源管理单元。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。

当程序需要运行时,操作系统将代码和所有静态数据记载到内存和进程的地址空间(每个进程都拥有唯一的地址空间,见下图所示)中,通过创建和初始化栈(局部变量,函数参数和返回地址)、分配堆内存以及与IO相关的任务,当前期准备工作完成,启动程序,OS将CPU的控制权转移到新创建的进程,进程开始运行。

PCB(Processing Control Block):操作系统对进程的控制和管理通过,PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息(进程标识号、进程状态、进程优先级、文件系统指针以及各个寄存器的内容等),进程的PCB是系统感知进程的唯一实体。

一个进程至少具有5种基本状态:初始态、执行状态、等待(阻塞)状态、就绪状态、终止状态。

  • 初始状态:进程刚被创建需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。此时进程刚被创建,由于其他进程正占有CPU所以得不到执行,只能处于初始状态。
  • 就绪状态:进程已经准备好,且已分配到所需资源,只要分配到cpu就能立即运行。
  • 执行状态:进程处于就绪状态的经过调度才能到执行状态。任意时刻处于执行状态的进程只能有一个。
  • 阻塞状态:正在执行的进程由于某些事件(IO请求,申请缓存区失败)而暂时无法运行,进程受到阻塞,在满足请求时进入就绪状态等待系统调用。
  • 终止状态:进程结束或出现错误或系统终止,进入终止状态,无法再执行。

在这里插入图片描述

进程同步机制的主要任务是对多个相关的进程在执行次序上进行协调,使并发执行的诸多进程之间能够按照一定的规则共享系统资源,并能很好的相互合作,从而使程序之间的执行具有可再现性。

进程间的两种制约关系:

  1. 间接相互制约(互斥):因为进程在并发执行的时候共享临界资源而形成的相互制约的关系,需要对临界资源互斥地访问。

  2. 直接制约关系(同步):多个进程之间为完成同一任务而相互合作而形成的制约关系。

临界资源:同一时刻只允许一个进程可以访问的资源。各个进程之间采取互斥方式,实现对临界资源的共享。

临界区:进程中访问临界资源的那段代码。

同步机制应遵循的规则:

  1. 空闲让进:当临界区的“大门”敞开时,应当允许一个请求的进入临界区的进程立即进入临界区。

  2. 忙则等待:当临界区的“大门”关闭时,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。

  3. 有限等待:对要求进入临界区的进程,应保证有限的时间能进入自已的临界区,以免陷入“死等” 状态。

  4. 让权等待:当进程不能进入自已的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。

“忙等 ”和 “死等” 都是没能进入临界区,它们的区别如下:

  1. 死等: 对行死等的进程来说,这个进程可能是处于阻塞状态,等着别的进程将其唤醒(signal 原语),但是如果唤醒原语一直无法执行,对于阻塞的进程来说,就是一直处于死等的状态,是无法获得处理机的。
  2. 忙等:忙等状态比较容易理解,处于忙等状态的进程是一直占有处理机去不断的判断临界区是否可以进入,在此期间,进程一直在运行,这就是忙等状态。有一点需要注意的是,忙等是非常可怕的,因为处于忙等的进程会一直霸占处理机的,相当于陷入死循环了。 忙等的状态在单CPU 系统中是无法被打破的,只能系统重启解决。

线程

线程是CPU调度的最小单位,是最小的执行单元。 线程又叫做轻量级进程,线程从属于进程,是程序的实际执行者。

一个进程至少包含一个主线程,也可以有更多的子线程。多个线程共享所属进程的资源,同时线程也拥有自己的专属资源、拥有自己的栈空间。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

一个进程中的各个线程都有共享的资源而且是完全开放的,那么在进程运行中会出现多个线程访问同一个公共资源的问题。这种现象我们称之为线程之间产生了资源竞争,这种竞争会导致程序异常甚至崩溃。线程同步有四种方法:

  1. 互斥锁:互斥锁又称互斥体或互斥量,是最简单的一种线程同步机制。当一个线程访问的时候,就会把资源“锁”上,直到访问结束才会解锁,给其他线程访问。互斥锁本身就是一个全局变量:unlock 和 lock。unlock表示当前资源可以访问,第一个访问资源的线程将互斥锁修改为lock,访问完以后再修改为unlock;lock表示线程正在访问资源,其他线程需要等待互斥锁的值为unlock才能继续访问。该线程负责的加锁,解锁也需要该线程。
  2. 信号量:信号量控制同时访问公共资源的线程数量,取值范围必须>=0,信号量可以执行加一和减一的原子操作。当线程访问资源时,信号量减一,访问完成加一。信号量为0时候,其他访问线程需要等待,直到大于0。
  3. 条件变量:功能类似现实中的门,只有打开和关闭两种状态,一旦关闭,所有线程都不得访问该资源,一旦打开,那就恢复执行。条件变量的本质也是全局变量,它的功能是阻塞线程,直到收到条件成立的信号,被阻塞的程序才能继续执行。为了避免多线程抢资源的情况发生,条件变量必须和互斥锁搭配使用。
  4. 读写锁:如果很多线程只是进行读取操作,只有少部分是写操作(修改),可以使用读写锁。当有多个读线程的时候,他们可以同时访问,但是写线程就必须要等他们读完才能访问,反过来也是,只不过写线程必须要一个一个来访问。

线程通信就是当多个线程共同操作共享的资源时,互相告知自己的状态以避免资源争夺。线程通信主要可以分为三种方式:

  1. 共享内存:线程之间共享程序的公共状态,线程之间通过读-写内存中的公共状态来隐式通信。
  2. 消息传递:线程之间没有公共的状态,线程之间必须通过明确的发送信息来显示的进行通信。wait/notify等待通知方式、join方式。
  3. 管道流:管道输入/输出流的形式。

协程

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。一个线程可以拥有多个协程,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

如何实现一个信号与槽系统?

设计模式-观察者模式。

详见于:设计模式:观察者模式(Observer)

进程间的通信方式

  1. 管道(pipe):管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据。它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。它只能用于具有亲缘关系的进程之间的通信(父子进程或者兄弟进程之间)。它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

  2. 命名管道(named pipe):命名管道(FIFO)又叫有名管道,和无名管道的主要区别在于,命名管道有一个名字,命名管道的名字对应于一个磁盘索引节点,但没有数据块,有了这个文件名,任何进程有相应的权限都可以对它进行访问。命名管道也是半双工的通信方式,允许无亲缘关系进程间的通信。FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

  3. 信号(signal):信号是一种比较复杂的通信方式,是在软件层次上对中断机制的一种模拟,它是一种异步通信方式,也是进程通信中唯一一个异步的通信方式,用于通知进程有某事件发生。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

  4. 消息队列(message queue):一个保存在内核中消息的链表,存放在内核中并由消息队列标识符(即队列ID)标识。消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

  5. 共享内存(shared memory):指两个或多个进程共享一个给定的存储区,这段共享内存由一个进程创建,被两个或两个以上的进程映射至自身的地址空间中,都可以使用这个共享内存,从而实现了进程间的通信。共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。这种方式需要依靠某种同步操作,我们通常会用信号量来实现对共享内存同步访问控制。

  6. 信号量(semaphore):信号量本质上是一个计数器,它和管道有所不同,它不以传送数据为主要目的,主要作为进程之间及同一种进程的不同线程之间的同步和互斥手段,它常作为一种锁机制,可以用来控制多个进程对共享资源的访问,防止某进程正在访问共享资源时,其他进程也访问该资源,使得资源在一个时刻只有一个进程独享。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。因为信号量属于临界资源,为了保护临界资源,信号量进行PV操作时都为原子操作。

  7. 套接字(socket):套接字是一种通信机制,采用客户/服务器方式,可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。套接字的特性由3个属性决定:域、类型和协议。

详见于:《进程间的通信方式》

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

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

相关文章

2024_GAMES101作业环境配置Mac(intel)_VSCode_Clion

目录 VSCodeClionCMakeList.txt VSCode brew install cmake 更换下载源为阿里云下载 opencv,不然会很慢 cd "$(brew --repo)" git remote -v cd "$(brew --repo)" git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git…

Ubuntu 24.04 LTS (Noble Numbat) 下载

Ubuntu 24.04 LTS (Noble Numbat) 下载 Ubuntu 24.04 LTS 开启 Beta 测试, 正式版即将发布 请访问原文链接:Ubuntu 24.04 LTS (Noble Numbat),查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Ubuntu 24.04 LTS 首个…

如果出现这7个现象,别犹豫,是时候更换你的海外仓系统了

不知不觉,即使是曾经让你觉得很有用的海外仓系统也出现了问题。 曾经看似可以简化海外仓运营的管理系统,现在却难以满足你的需求。你是否注意到你的仓库管理效率低下的情况已经开始蔓延,甚至影响了公司的盈利? 仓库日常的管理工…

力扣(leetcode) 42. 接雨水 (带你逐步思考)

力扣(leetcode) 42. 接雨水 (带你逐步思考) 链接:https://leetcode.cn/problems/trapping-rain-water/ 难度:hard 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多…

鸿蒙开发踩坑与理解

基于 studio dev3.1,api 9 总结:现在的鸿蒙,感觉就像是用eclipse开发android的时候的android4.0或者4.0以下 持续更新中… 申请next,可能没通过? 没下文了。可能华为还不希望普通开发者进行开发吧。 兼容性问题 鸿蒙4.0,华为mate40E当前版本有黑屏、卡顿问题,客服说a…

【正点原子Linux连载】 第三十三章 Linux CAN驱动实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1)实验平台:正点原子ATK-DLRK3568开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id731866264428 3)全套实验源码手册视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 第三十…

Word目录格式的编辑记录

1、整体风格 鼠标右键,编辑域 选择目录,风格可以根据自己的喜好选择古典、优雅、正式等 2、字段、段落样式调整 更新整个目录 加载出样式侧框,选中某一级目录,侧框会定位到其样式 然后修改对应的样式,比如字体和段…

vscode自动生成返回值的快捷键

vscode中类似idea的altenter功能,可以添加返回值 idea中是Introduce local variable, vscode中按下command.(句号) 然后选extract to local variable或者 Assign statement to new local variable都行, 光标在分号前如图: 光标在…

探索直播+电商系统中台架构:连接消费者与商品的智能纽带

随着直播电商的崛起,电商行业进入了全新的智能时代。直播形式的互动性和即时性为消费者提供了全新的购物体验,而电商平台则为商品的展示、销售和配送提供了强大的支持。在这一背景下,直播电商系统中台架构成为了连接消费者与商品的智能纽带&a…

Java基于微信小程序的电影院订票系统,附源码

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

C语言简单的数据结构:双向链表的实现

目录: 1.双向链表的结构和初始化1.1双向链表的结构1.2双向链表的初始化 2.双向链表的相关操作2.1双向链表的尾插、打印和头插2.11双向链表的尾插2.12双向链表的打印2.13双向链表的头插 2.2双向链表的尾删和头删2.21双向链表的尾删2.22双向链表的头删 2.3双向链表查找…

前后端系统开发之——文章管理

原文地址:前后端系统开发之——文章管理 - Pleasure的博客 下面是正文内容: 前言 主要使用的技术:前端使用的是Vue.js,后端使用的是SpringBoot。如不雷同可以直接跳过了。 文章管理是这个系统最主要的一个功能也是最常规的一个功…

如何寻找可靠的第三方软件检测机构

随着科技的飞速发展和数字化进程的加速,软件质量成为了企业竞争的关键。为了确保软件的质量和性能,许多企业选择寻找第三方的软件检测机构来进行软件的质量控制和评估。那么,如何找到一家可靠的第三方软件检测机构呢? 1.明确检测…

怎么设置启用远程桌面? 如何让外网电脑远程本地内网?

如何远程控制电脑?最简单实用的方案是开启电脑系统自带的远程桌面功能,如果涉及跨网、内外网互通,可以同时用快解析内网映射外网。下面是方案的具体实施步骤,供大家参考。 怎么打开设置启用远程桌面? 1.在目标需要远…

05—js对象

一、初识对象 JavaScript是面向对象编程(Object Oriented Programming,OOP)语言。 面对象是一种复合值:它将很多值集合在一起,可通过名字访问这些值。对象也可看做一种无序的数据集合,由若干个“键值对”…

数据库--Sqlite3

1、思维导图 2sqlite3在linux中是实现数据的增删&#xff0c;改 #include<myhead.h> int main(int argc, const char *argv[]) { //1、定义一个数据库句柄指针 sqlite3* ppDb NULL; //2、创建或打开数据库 if(sqlite3_open("./mydb…

通过两道题理解哈夫曼树

哈夫曼树定义 哈夫曼树&#xff08;Huffman Tree&#xff09;&#xff0c;又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。所谓带权路径长度是指树中所有的叶子结点的权值乘以其到根结点的路径长度&#xff08;边数&#xff09;。哈夫曼树广泛应用于数据压缩等领…

Centroid-Aware Feature Recalibration for Cancer Grading in Pathology Images论文速读

Centroid-Aware Feature Recalibration for Cancer Grading in Pathology Images 摘要 癌症分级是病理学中的一项重要任务。人工神经网络在计算病理学领域的最新发展表明&#xff0c;这些方法在提高癌症诊断的准确性和质量方面具有巨大潜力。然而&#xff0c;这些方法的稳健性…

面试官最怕你懂的Kafka面试题,一招致胜!

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、前言Kafka的优点Kafka的使用场景…

密码学 | 椭圆曲线密码学 ECC 入门(二)

目录 4 椭圆曲线&#xff1a;更好的陷门函数 5 奇异的对称性 6 让我们变得奇特 ⚠️ 原文地址&#xff1a;A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography ⚠️ 写在前面&#xff1a;本文属搬运博客&#xff0c;自己留着学习。如果你和我一样…