数据库:
范式
第一范式:数据库表的每一项都是不可分割的原子数据项,不能是集合。比如班级信息表里面不能有班级的学生。
第二范式:在第一范式的基础上,所有属性完全依赖于主键,完全依赖就是不能取决于主键的一部分
第一范式->第二范式->第三范式
→→→数据冗余越来越少,查询越来越复杂
事务
1原子性
2一致性:
使数据库从一个一致性状态到另一个一致性状态
3隔离性:
一个事物的执行不被其他事务干扰
4永久性:
常用SQL语句
分组查询(avg max min)、复杂连接查询、嵌套查询、结果排序(逆序ansc)、
操作系统
错题
虚存=min(主存+辅存,逻辑地址)
进程和线程
进程是程序的一次执行,包括代码和数据,是CPU分配资源的基本单位,一个进程可以包括多个线程。进程之间通信方式:管道、SOCKET、信号量(互斥、同步)等。
进程的调度算法
文件系统
内存分配策略
计算机网络
HTTP协议
基于TCP协议的应用层协议
HTTP是一个普通用在浏览器和web服务器之间进行数据交换的文本协议
HTTP协议的ETAG响应头主要用于信息的过期验证
HTML错误代码
(1) 常见错误代码:
200服务器成功返回了网页,成功处理了请求
304未修改,自从上次请求后,请求的页面未被修改过,此时服务器不会返回网页内容,节省带宽和开销
404请求的网页不存在
500服务器内部错误
503服务器暂时不可用(超载、停机维护),通常只是暂时状态
(2) 1xx:临时响应,服务器端响应成功,等待请求者进一步操作
(3) 2xx:响应成功
202接受请求,未处理
204处理了请求,但没有返回任何内容
(4) 3xx重定向,要完成响应,服务器需要进一步处理
301网页已被永久移动到新位置
302临时移动到新位置
305要求只能使用代理才能访问
(5) 4xx请求错误
400不理解请求语法
401要求身份验证,先登陆才能请求
403禁止访问,服务器拒绝请求
405请求中的方法被禁用
408请求超时
(6) 5xx服务器在处理请求时内部发生错误,来自服务器本身的错误
501服务器不具备完成该请求的功能
502服务器作为网关或代理,从上游服务器收到无效响应
504网关超时
TCP/IP与UDP
TCP与UDP
TCP面向连接、可靠的数据传输,有拥塞控制和流量控制,大量数据,速度慢
TCP建立连接的三次握手
详细过程和状态变化
TCP关闭连接的四次挥手
FIN-->
<--FINACK
ßFIN
如何提高UDP的可靠性
应用层实现超时重传,客户端发送一个包,服务器返回一个包表示收到,如果客户端超过一定时间没有收到该包,就需要重传
备用
SOCKET编程
当recv函数在接受数据时是阻塞的,当返回值<0,说明连接出错
当返回值=0,表示对端关闭了连接
返回值>0,接受到的数据的大小
TCP/IP分层,各层作用
应用层:为操作系统、应用程序提供访问网络的接口(Telnet、FTP、HTTP、SNMP、DNS域名解析)
(表示层)
(会话层)
传输层:两点之间的根据使用的协议(TCP、UDP),传输相应数据报文,
网络层:整个网络的传输路径选择,路由(IP、RIP)
网络访问层:数据链路层、物理层的结合,数据链路层相邻节点之间数据帧传输,物理层就是光纤上比特级的数据传输。
PING操作的原理
使用ICMP,在IP主机、路由器之间传递控制消息
网络层的协议
IP协议 根据IP地址决定转发、路由的协议
ICMP本质理解为带差错报告的IP协议,在主机和路由器之间传递控制信息(网络通不通,主机可不可达,路由可不可达到)
ARP:将IP地址转化为MAC地址
RARP:物理地址转为IP地址
传输层的协议
TCP
UDP
应用层协议
HTTP
SMTP:简单邮件传输协议
DNS:
Telnet
FTP:文件传输协议
WWW:
DNS的完整流程(域名->IP地址)
DNS采用分布式的域名系统,减少故障发生
当一个应用需要把主机名解析为IP地址时,该应用程序就会调用解析程序,把待解析的域名放在DNS请求报文中,以UDP数据报方式发送给本地域名服务器,本地服务器在查找域名后,把对应的IP地址放在回答报文中返回,应用程序获得目的主机的IP地址后即可进行通信。若本地域名服务器不能解析该域名,则向上级域名服务器继续发送查询请求,直到可以解析为止。
备用
HTTP1.0/1.1区别
HTTP1.1中才有cache-control响应头,主要用于控制信息在浏览器的缓存
1. HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求
缺陷:访问一个包含有许多图像的网页文件的整个过程包含了多次请求和响应,每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个文档和图像,器端每次建立和关闭连接却是一个相对比较费时的过程,并且会严重影响客户机和服务器的性能
2. HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟
HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果
HTTP 1.1还提供了Host、身份认证、状态管理和Cache缓存等机制相关的请求头和响应头
编程经验
C++
一定要弄懂c++的内存分配机制,父类,子类继承时的内存如何分配,封装、继承、多态、虚函数的实现机制和原理。
小细节
实现String类
String类的原型如下
class String { public: String(const char *str=NULL); //构造函数 String(const String &other); //拷贝构造函数 ~String(void); //析构函数 String& operator=(const String &other); //等号操作符重载 ShowString();
private:
char *m_data; //指针 }; String::~String() { delete [] m_data; //析构函数,释放地址空间 } String::String(const char *str) { if (str==NULL)//当初始化串不存在的时候,为m_data申请一个空间存放' '; { m_data=new char[1]; *m_data=' '; } else//当初始化串存在的时候,为m_data申请同样大小的空间存放该串; { int length=strlen(str); m_data=new char[length+1]; strcpy(m_data,str); } }
String::String(const String &other)//拷贝构造函数,功能与构造函数类似。 { int length=strlen(other.m_data); m_data=new [length+1]; strcpy(m_data,other.m_data); } String& String::operator =(const String &other) { if (this==&other)//当地址相同时,直接返回; return *this; delete [] m_data;//当地址不相同时,删除原来申请的空间,重新开始构造; int length= strlen (other.m_data); m_data=new [length+1]; strcpy(m_data,other.m_data); return *this; }
String::ShowString()//由于m_data是私有成员,对象只能通过public成员函数来访问; { cout<<this->m_data<<endl; }
Strcmp strcpy的返回类型
C++如何限制类对象只能静态分配或者只能只能动态分配
动态分配就是用运算符new来创建一个类的对象,在堆上分配内存。
(1)动态分配(在堆上分配内存)
将类的构造函数和析构函数设为protected属性,这样类对象不能够访问,但是派生类能够访问,能够正常的继承。同时创建另外两个create和destory函数类创建对象。(将create设为static原因是:创建对象的时候是A *p = A::create();只有静态成员函数才能够通过类名来访问。)
[cpp] view plain copy
1. class A
2. {
3. protected:
4. A(){}
5. ~A(){}
6. public:
7. static A* create()
8. {
9. return new A();
10. }
11. void destory()
12. {
13. delete this;
14. }
15. };
(2)静态分配(在栈上)
把new、delete运算符重载为private属性就可以了。
[cpp] view plain copy
1. class A
2. {
3. private:
4. void* operator new(size_t t){} // 注意函数的第一个参数和返回值都是固定的
5. void operator delete(void* ptr){} // 重载了new就需要重载delete
6. public:
7. A(){}
8. ~A(){}
9. };
实现strcpy()
char * strcpy(char* dest, const char* src) { assert(dest!=NULL&&src!=NULL); char* res=dest; while((*dest++=*src++)!=’