说一下new和malloc的区别
new是操作符, malloc是函数
malloc申请的空间是不能初始化的, 而new是可以初始化的
malloc申请空间的时候需要手动计算空间大小,而new可以直接在[]里面给个数就行。
malloc的返回值是void*, 使用时必须强转, 而new不需要,他后面跟的是类型。
malloc申请失败返回NULL,而new申请失败抛异常。
在申请自定义类型对象的时候,malloc只会申请空间, new会在申请空间后调用构造函数
C++中的异常,C中的异常是怎样的。在C中遇到异常如何处理
异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。
C++中,其中抛出异常throw, 捕获通常用try …catch。我们通常是抛出子类对象,用父类对象去接受。
C的异常 : 1,直接终止程序, 例如assert, 2,返回错误码,让程序员根据错误码自己去处理对应错误。
C++处理异常的优点 :
1, 异常对象定义好了, 我们就可以清晰的知道错误的原因和位置,方便定位bug,而C的错误码方式,需要自己去匹配查看
2,对于C直接终止程序的方式来说,C++在抛出异常后进程还可以继续执行。
3,返回错误码的方式还有一个最大的问题是,深层的函数返回,需要层层返回才能让最外层拿到错误码。而C++可以就近捕获。
C++中一个空类有哪些成员函数
8个 : 构造,析构,拷贝构造,赋值重载,取地址重载,const取地址重载, 移动构造,移动赋值 (C++11的新特性)。
深浅拷贝的区别。
略
构造函数可以是虚函数吗?析构函数呢?原因是什么?
构造函数不能是虚函数,因为虚函数表的指针是在构造函数初始化列表阶段初始化的。
析构函数 : 如果是在继承体系中,我们尽量把父类和子类的析构函数定义成虚函数,让他们构成重写。
因为如果子类和父类不构成重写关系的话,当析构父类指针(指向子类对象的时候),会出现不调用子类析构函数的情况。
map和vector在删除元素是,底层(内存结构)是如何变化的
map : 底层是红黑树 ,删除元素的时候可能涉及到元素的变换 和 旋转问题。
vector : 可以通过挪动元素的方式直接覆盖。
Linux下有一个2G的文件,操作系统如何找到这个文件
Linux命令 : du -h -a | grep “2G”
单核模式下,使用多线程有好处吗?有什么好处?
在处理I/O密集型应用的时候,是可以重合IO等待时间的。 有利于提高IO效率的。
fork函数做了哪些事?fork函数返回值有几个,代表什么意思?
创建了一个子进程,分配新的内存块和内核数据结构给子进程。
将父进程部分内核数据结构的内容拷贝到子进程。
添加子进程到系统进程列表当中。
fork函数返回值有2个, 给父进程返回的是子进程id, 给子进程返回的是0。
Linux线程有哪些同步机制?
互斥锁, 条件变量, 信号量, 读写锁
进程间通信机制,IPC最快的是哪个?管道是什么?如何用管道如何实现双工通信?
管道, 共享内存,消息队列,套接字。 最快的是共享内存
管道是一种半双工通信,实际上就是OS提供的一段缓冲区。 可以建立两个管道
进程间同步机制有哪些?如何同共享内存实现进程间的同步机制?
互斥锁,条件变量,信号量,读写锁。
可以通过两个有名的信号量,一个信号量来控制写, 一个信号量来控制读。
也可以通过互斥锁的方式。
多个进程想访问同一块共享内存,为保证数据一致,需要采取的数据同步措施?(提示:文件锁)
可以通过文件锁的方式,当一个进程正在读或者修改文件的某一个部分的时候,
他可以阻止其他进程修改同一个文件区。
TCP断开连接为社么需要四次挥手机制?详细描述过程,等待2MSL的原因
略。
DOS攻击的原理
拒绝服务攻击。无脑的一直发送恶意请求,服务端需要处理这些恶意请求,从而消耗资源,让正常的请求得不到响应。
可能会导致服务端不能对正确的请求进行响应,会导致服务器崩溃和宕机。
数据库用过吗?数据库事务,ACID
原子性: 事务由一组SQL语句组成, 这一组语句要么全部执行, 要么全部不执行, 不会停留在某一个中间状态。
持久性: 事务一但提交, 则数据会被永久保存在磁盘上,即便是系统崩溃也不会丢失。
隔离性, 对于并发执行的事务而言,一个事务不受其他事务的影响。
一致性 : 事务在提交前和提交后,都应该满足之前预设的规则,并且处于一个一致性的状态。
描述请求从浏览器端到服务端的过程
1, 构建http请求完成后, 浏览器会先查看缓存中是否存在请求的资源。
2, DNS域名解析 (先查看本地缓存,然后host文件 。 向本地本地DNS要----> 根DNS要-----> 顶级DNS----->域名解析服务器)获得IP
3,三次握手建立连接。(客户端发送syn报文, 服务端接受并发送ack+ syn, 客户端发送ack报文, 服务端接受。 三次握手成功)
4,http请求然后依次经过传输层,网络层,数据链路层 进行头部的封装。
5,通过网络发送给对端主机服务器,然后服务器经过数据包的依次向上分用拿到http请求。
断点续传下载的位置从哪里知道的 (浏览器自己记录)
断点续传 : 就是在上传或下载的断开点继续开始传输,不用再从头开始。
这个位置由浏览器自己记录的。
tcp协议的三次握手四次挥手, 为什么握手三次挥手四次
略。
四次挥手有可能产生什么问题.
如果是服务端主动断开链接(例如某些用户不活跃,), 可能会处于大量的TIME_Wait链接,由于没有
完全断开链接,这种TIME_WAIT链接还占用着一个通信5元组(源ip, 目的ip, 源端口, 目的端口, 协
议),而服务端的ip和端口都是固定的, 当新的用户来链接的ip和端口与TIME_WAIT占用的链接相同的
时候就会出现问题。
当被动断开链接的一方如果没有close关闭文件描述符,那会进入close_wait的状态,非常浪费资源。
tcp为什么是可靠的
序号---->保证了报文的到达的顺序
确认序号—>保证了报文已经被接受。
超时重传—>保证了报文必须被应答。
介绍一下超时重传
当主机A发送数据给主机B的时候, 由于一些原因,可能无法按时到达主机B,经过一个特定的时间间隔,如果一直没有收到应答,就会进行重发。
这个时间间隔一般都是浮动的, 在Linux操作系统下, 一般是500ms,
重传一次, 2 * 500ms , 重传2次,4倍的500ms,3次是8倍500ms,经过一定的次数,认为网络或者对端主机出现问题,则
强制关闭连接。
介绍一下http协议, 能工作在udp上吗
http协议是一个应用层协议, 是一种无状态协议, 一次请求–>一次响应–>建立链接–>断开链接。
http请求的格式 : 首行, 头部,正文。
其中首行 : 请求方法 + 网址+协议版本。
头部: 请求属性,由冒号分割的键值对。 例如有content_type, content_length, host, user_agent…http响应的格式基本上一样,
就是首行有些区别, 是协议版本, 状态码, 状态码的描述。
可以改造UDP协议, 如谷歌的QUIC协议,就是将udp经过改造让他具备了一定程度的可靠性。
http1.0和1.1的区别.
1, http1.0是一种短链接, 一次请求–>一次响应–>建立链接–>断开链接 http1.1是一种长链接协议 ,可以在一次连接上进行多次通信。
2,http1.1在请求的头部中多了一个Host域,允许一台物理服务器上可以存在多个虚拟主机,共享一个IP,而对于http1.0来说,
一台物理务器占用一个IP地址。
3,http1.0存在浪费带宽的现象,也不支持断点续传。 例如在客户端只请求某个对象资源的一部分的时候,
http1.0必须将整个对象请求。 而http1.1因为头部引入range域, 可以支持请求资源的一部分,也支持断点续 传。
4, 另外的就是http1.1在http1.0的基础上,增加了一些请求方法和状态码。