C/C++面试之一 (基础知识整理)

本文汇总了C/C++软件工程师面试中常见的知识点,包括进程间的通信方式(管道、消息队列、信号量、共享存储、信号、Socket)以及多线程同步等。还涉及面向对象特性、多态概念、C++11新特性、STL模板应用、内存对齐等核心概念。同时,提到了数据库(MySQL与MongoDB)的区别、事务处理以及设计模式的应用。

坐标南京,最近找工作,面试C/C++软件工程师,电话面试了有5家,现场面试有三家,先就被问到的基础知识进行整理

1.进程间的通讯方式

参考链接【1】:https://blog.youkuaiyun.com/wh_sjc/article/details/70283843 (写的很详细)

参考链接【2】:https://www.cnblogs.com/LUO77/p/5816326.html (关于管道的fork,过程写的特别清楚)

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息,通信方式包括管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、信号、Socket等

  • 管道(pipe)分为普通管道(pipe)与命名管道(FIFO,也称作named pipe): 普通管道是半双工通讯方式,同一时刻只有一个进程写数据,另一个进程处于读进程,进程关系是父子或者兄弟,具有独有的数据空间但是共享代码空间,通过fork实现,通过共享缓冲区实现通讯;命名管道也是半双工通讯方式,但是允许在没有任何关系的两个进程之间通讯,存储在文件系统中,通过FIFO指定文件存储路径,客服端提供写请求。
  • 消息队列(message queue): 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识(队列ID)。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级;消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除;消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
  • 信号量(semaphore):实际是一个计数器,常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源,用于实现进程间的互斥与同步,而不是用于存储进程间通信数据,需要配合管道、共享内存实现进程间的通讯。程序对信号量的操作都是原子操作,信号量只能进行等待和发送信号操作,即P(sv)和V(sv)。1)P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行。2)V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1。
  • 共享存储(shared memory):共享内通过内存映射机制(memory map)映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式消息队列和管道需要内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次:一次从输入文件到共享内存区,另一次从共享内存到输出文件),它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
  • 信号(signal):信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。
  • 套接字(socket):套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。TCP/UDP是典型的socket,TCP是面向连接socket,是流式,安全效率低;UDP是无连接的socket,是数据报式,不安全但是效率高。

2.面向对象的特征

3.什么是多态

4.多态实现的机理

5.用过哪些智能指针,智能指针本质,各指针为什么存在

6.C++11与C++98区别

7.STL模板用过哪些?list与vector底层实现机理?set与map底层实现?deque实现原理,为什么可以实现两头push or pop,vector只能在尾端

8.多线程同步

9.读写锁适用于什么样的场合?情景给定,确定出现什么问题

10.程序构建的步骤

     预处理-》编译-》汇编-》链接

11.知道设计模式吗?用过哪些设计模式

12.代码重构过吗?注意什么?原则是什么?

13.boost的socket类实现的原理

14.如何实现线程池

15.红黑树与AVL熟悉吗?

16.MySQL与MongoDB区别?原理有什么区别?关系与非关系数据库分别使用什么场合?

17.关系型数据库的事务是什么?

18.MySQL分布式存储怎么实现,用什么技术?

19.如何实现高并发

16.MFC消息

17.内存对齐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值