c++面试题总结(二)

都是些基本的概括,具体的可以根据个人需要自行查阅资料

十一、请你简要说明c++和c的区别

设计思想上: C++是面向对象的语言,而C是面向过程的结构化编程语言 语法上: C++具有重载、继承和多态三种特性 C++相比C,增加多许多类型安全的功能,比如强制类型转换、 C++支持范式编程,比如模板类、函数模板等

十二、进程和线程有什么区别

1、进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)

2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。

而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

4、但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

十三、进程之间和线程之间是怎么通讯的

进程通讯

(1)、管道( pipe ):
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
(2)、有名管道(namedpipe) :fifo
有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
(3)、信号量(semophore ):
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
(4)、消息队列(messagequeue ) :
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(5)、信号 (sinal ) :
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
(6)、共享内存(shared memory ) :
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
(7)、套接字(socket ) :
套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备及其间的进程通信。

线程通信

(1)、锁机制:包括互斥锁、条件变量、读写锁
a. 互斥锁提供了以排他方式防止数据结构被并发修改的方法。
b. 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
c. 条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
(2)、信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
(3)、信号机制(Signal):类似进程间的信号处理线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

十四、共享内存通讯有没有什么要注意的点

一个进程是可以对同一个共享内存多次 shmat进行挂载,物理内存是指向同一块,如果shmaddr为NULL,则每次返回的线性地址空间(进程内地址)都不同,而且指向这块共享内存的引用计数会增加。也就是进程内多块线性空间会指向同一块物理地址。这样,如果之前挂载过这块共享内存的进程的线性地址没有被shmdt掉,即申请的线性地址都没有释放,就会一直消耗进程的虚拟内存空间,很有可能会最后导致进程线性空间被使用完而导致下次shmat或者其他操作失败。

3)使用共享内存的时候,是用key来作为共享内存的唯一标识的。已经创建的共享内存的大小只能调小,不能调大。

把key设为IPC_PRIVATE,这样操作系统将忽略键,建立一个新的共享内存,指定一个键值,然后返回这块共享内存IPC标识符ID。

4)创建进程在通知其他进程挂接的时候,建议不使用ftok方式来获取Key,而使用文件或者进程间通信的方式告知。

十五、浏览器输入一个URL,整个过程会发生什么

第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器。

第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。

第三步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。

第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。

第五步:重复第四步,直到找到正确的纪录。

浏览器查找DNS域名解析找到ip地址,. 建立链接,确认好了IP和端口号,则可以向该IP地址对应的服务器的该端口号发起TCP连接请求。浏览器给web服务器发送一个HTTP请求,服务的永久重定向响应,跟踪重定向地址,服务器“处理”请求,服务器发回一个HTML响应,9.关闭TCP连接四次挥手10. 浏览器开始显示HTML在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了,. 浏览器发送获取嵌入在HTML中的对象

十六、为什么TCP需要三次握手,四次挥手

最少三次握手才能解决事

因为 TCP 是全双⼯模式,客户端请求关闭连接后,客户端向服务端的连接关闭(⼀⼆次挥 ⼿),服务端继续传输之前没传完的数据给客户端(数据传输),服务端向客户端的连接关闭(三四次挥⼿)。所以 TCP 释放连接时服务器的 ACK 和FIN 是分开发送的(中间隔着数据传输),⽽ TCP 建⽴ 连接时服务器的 ACK 和 SYN 是⼀起发送的(第⼆次握⼿),所以 TCP 建⽴连接需要三次,⽽释放连接 则需要四次。

十七、http和https有什么区别

HTTP协议
HTTP协议是一种使用明文数据传输的网络协议。一直以来HTTP协议都是最主流的网页协议,但是互联网发展到今天,HTTP协议的明文传输会让用户存在一个非常大的安全隐患。

HTTPS协议
HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密。在数据进行传输之前,对数据进行加密,然后再发送到服务器。这样,就算数据被第三者所截获,但是由于数据是加密的,所以你的个人信息让然是安全的。

十八、https整个加密过程描述一下

https=http+ssl安全传输协议+ca身份认证;https是http的安全版,它不仅涵盖http协议,而且加入了ssl安全加密传输协议保证数据传输的安全性,ca身份认证则验证服务器域名是否是真实可靠的

①客户端的浏览器向服务器传送客户端SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。

②服务器向客户端传送SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

③客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。

④用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后传给服务器。

⑤服务器用私钥解密“对称密码”(此处的公钥和私钥是相互关联的,公钥加密的数据只能用私钥解密,私钥只在服务器端保留。然后用其作为服务器和客户端的“通话密码”加解密通讯。同时在SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。

⑥客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。

⑦服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑤中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。

⑧SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。

十九、动态链接库dll讲解一下
动态链接库文件,又称“应用程序拓展”,是软件文件类型,扩展名是“.dll”。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。 DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地址,最后进行调用。使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从DLL中取出。另外,使用DLL文件还可以减小程序的体积。

二十、如果写代码时,把dll文件删了,程序能运行嘛,会有什么问题
不清楚
二一、了解什么设计模式,说一下

单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例;
> 要求: 通过一个类只能创建唯一的对象
>1. 该对象不能是栈对象(全局对象,静态对象)
2.该对象只能是堆对象

class Singleton
{
public:
static Singleton * getInstance()
{
if(_pInstance == NULL)
{
_pInstance= new Singleton();
}
return _pInstance;
}
private:
Singleton(){}
static Singleton * _pInstance;

};
Singleton s1;
Singleton * p1 = new Singleton();

具体运用场景如:

设备管理器,系统中可能有多个设备,但是只有一个设备管理器,用于管理设备驱动;

数据池,用来缓存数据的数据结构,需要在一处写,多处读取或者多处写,多处读取;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值