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