都是些基本的概括,具体的可以根据个人需要自行查阅资料
十一、请你简要说明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();
具体运用场景如:
设备管理器,系统中可能有多个设备,但是只有一个设备管理器,用于管理设备驱动;
数据池,用来缓存数据的数据结构,需要在一处写,多处读取或者多处写,多处读取;