1. 深浅 copy 的区别
Python之深浅拷贝
深copy:copy内部全部内容,形成一个新的对象,虽然与之前的值和内容一样,但是他们完全是两个对象。
浅copy:copy第一层内容,不copy内部子对象。
2. python 中的生成器和迭代器
python 生成器和迭代器有这篇就够了 - 战争热诚 - 博客园
生成器:在Python中,这种一边循环一边计算的机制,称为生成器。python中生成器是迭代器的一种,使用yield返回值函数,每次使用yield会暂停。可以使用next()函数和send()函数恢复。
迭代器:迭代器包含有next方法的实现,在正确的范围内返回期待的数据以及超出范围后能够抛出StopIteration的错误停止迭代。生成器都是Iterator对象,但list、dict、str虽然是 Iterable(可迭代对象),却不是Iterator(迭代器)
a = [x*x for x in range(3)] 是迭代过程,a =(x*x for x in range(3))能够生成生成器。
3. python 内存管理
Python的内存管理机制:引入计数、垃圾回收、内存池机制
python中万物皆对象,python的存储问题是对象的存储问题,并且对于每个对象,python会分配一块内存空间去存储它
1、Python缓存了整数和短字符串,因此每个对象在内存中只存有一份,引用所指对象就是相同的,即使使用赋值语句,也只是创造新的引用,而不是对象本身;
2、Python没有缓存长字符串、列表及其他对象,可以由多个相同的对象,可以使用赋值语句创建出新的对象。
3、python中对大于256的整数,会重新分配对象空间地址保存对象;对于字符串来说,如果不包含空格的字符串,则不会重新分配对象空间,对于包含空格的字符串
引入计数:在Python中,每个对象都有指向该对象的引用总数---引用计数,查看对象的引用计数 sys.getrefcount()
引用计数增加的情况有:对象被创建(n=123 # 123为对象);利用copy引用创建(m = n);作为容器 对象的一个元素(a = [1,2,123]);作为参数传给函数(fun(n))【出现以上情况对象引用计数加1】
引用计数减少的情况有:对象的别名被销毁(del m); 对象的一个别名被复制给其他对象(n = 456); 对象从一个容器对象里删除,或者容器对象被销毁(a.remove(123) 或者 del a );【出现以上情况对象引用计数减1】
垃圾回收:当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾。
(1)、垃圾回收时,Python不能进行其它的任务,频繁的垃圾回收将大大降低Python的工作效率;
(2)、Python只会在特定条件下,自动启动垃圾回收(垃圾对象少就没必要回收)
(3)、当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数。当两者的差值高于某个阈值时,垃圾回收才会启动。(阈值为700)
(4)、当然也可以自己手动垃圾回收(使用 gc.collect())
内存池机制:(看不懂...就先不总结了)
Python 中有分为大内存和小内存:(256K为界限分大小内存)
1、大内存使用malloc进行分配
2、小内存使用内存池进行分配
3、Python的内存池(金字塔)
。。。
4. http 和 https 区别
1、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
2、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
3、http的连接很简单,是无状态的;https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
5. 数据库索引的实现方式和分类
数据库索引分类 - 一直都是瑾凉 - 博客园
索引分类主要有:普通索引、唯一索引、主键索引,联合索引等
1、普通索引的创建:create unique index 索引名 on 表名(列名);(对某一列创建索引)
2、唯一索引的创建:create unique index 索引名 on 表名(列名); (对某一列创建唯一索引)
3、主键索引的创建:一般创建表格的时候就顺便创建了主键。主键是一种特殊的唯一索引,不允许有空值。
4、联合索引相当于多个索引一起,符合最左匹配原则
索引实现方式主要有:B+树、散列(HASH)索引、位列索引
B+树最常用,适用于范围查询和单值查询,特别是范围查询只能用B+树来做
散列(HASH)索引只能做单值查询,查询速度比B+树要快。
位列索引很局限,只能用于性别、等级之类的查询,思想主要就是01思想。
6. 进程、线程和协程
进程是系统分配资源的基本单位,进程是线程的容器,线程是进程的一部分,每个进程至少有一个线程。
进程都有自己的内存空间,而线程是利用进程的资源和内存空间。一个进程结束那么它的线程也会跟着结束。
一个进程可以和其他进程并发运行,一个线程不仅可以和同一个进程里的线程并发运行,还可以和其他进程里的线程并发运行。
进程与进程之间切换、线程和线程之间的切换都是有系统控制的,但是进程的开销要比线程的要大。
7. linux 中 grep 和 find 的区别
grep 是用来查询文件的内部文本的内容的
find 是用来搜索文件的路径的
8. is 和 == 的区别
is 是比较两个对象的地址是否相同
== 是比较两个对象的值是否相同
ps :如果两个变量对象为字符串或者数,那么如果他们值相同,他们的地址也是相同的,is 和 == 的结果相同;
通过is进行引用所指判断,is是用来判断两个引用所指的对象是否相同。例如(a = 256, b = 256 , a is b == true;a = 300, b= 300, a is b == false; x = "abc ef", y="abc ef", x is y == false)
但是对于数组、元组、字典、集合的值相同,地址也不相同,is 和 == 的结果不同。
9. DNS 的作用
域名是为了方便记忆而专门建立的一套地址转换系统,要访问一台互联网上的服务器,最终还必须通过IP地址来实现,域名解析就是将域名重新利用DNS服务器解析为IP地址的过程。
10. TCP 和 UDP 的区别?TCP 三次握手、四次挥手
主要区别:
TCP 是面向连接的,UDP 是面向无连接的
TCP 是面向字节流的,UDP 是基于数据报的
TCP 保证数据正确性,UDP 可能丢包
TCP 保证数据顺序,UDP 不保证
TCP 需要一对一,UDP可以一对多,也可以多对一。
UDP 的主要应用场景:
直播:直播对实时性的要求比较高,宁可丢包,也不要卡顿的
实时游戏:游戏的特点也是实时性比较高,在这种情况下,采用自定义的可靠的 UDP 协议,自定义重传策略,能够把产生的延迟降到最低
TCP的应用就比较多了,网站基本都是TCP/IP协议。
TCP的三次握手和四次挥手
三次握手
1、A 告诉 B,我发起的包的序号是从哪个号开始的;
2、B 同样也告诉 A,B 发起的包的序号是从哪个号开始的;
3、A告诉B,好的,收到,就从这里开始传输吧。
双方建立连接之后需要共同维护一个状态机,在建立连接的过程中,双方的状态变化时序图如下所示
第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手。
(SYN 是发起一个链接,ACK 是回复,RST 是重新连接,FIN 是结束连接)
为何两次握手即可建立链接,还需要第三次握手?
为了防止失效的连接请求报文段被服务端接收,从而产生错误
四次挥手
1、A告诉B,我传完了,我要结束了;
2、B回复A,好的,我知道了;
3、过了一会,B也告诉A,好了,我也传完了,我要结束这个传输了啊;
4、然后B就回复说,好的,收到。
第一次挥手
若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。
第二次挥手
B 收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,表示 A 到 B 的连接已经释放,不接收 A 发的数据了。但是因为 TCP 连接时双向的,所以 B 仍旧可以发送数据给 A。
第三次挥手
B 如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B 便进入 LAST-ACK 状态。
第四次挥手
A 收到释放请求后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。
为什么 A 要进入 TIME-WAIT 状态,等待 2MSL 时间后才进入 CLOSED 状态?
为了保证 B 能收到 A 的确认应答。若 A 发完确认应答后直接进入 CLOSED 状态,如果确认应答因为网络问题一直没有到达,那么会造成 B 不能正常关闭。
11. http 的请求方式
常见的请求方式有GET、POST、HEAD
12. post 和 get 的区别
1、post 重点是向服务器发送数据;而get重点是从服务器上获取数据。
2、post 传输数据是通过http的post机制,将字段和对应值封存在请求实体中发送给服务器,这个过程用户是不可见的; get 传输数据是通过url请求,以field(字段)和valued的形式,置于url之后,并用?连接,多个请求数据用&连接。 例如:http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的。
3、post 可以上传大量数据,所以一般传文件都是用post; get 只能传输少量数据,因为受url长度限制,但效率较高。
4、post 安全性较高,因为传输过程用户不可见; get 安全性较低,因为url是可见的,可能泄露私密信息。
5、post支持标准字符集,可以正确传输中文字符; get 只能支持ASCLL码,传输中文字符可能会乱码。
13. 软件测试方法有哪些
软件测试方法汇总 https://www.cnblogs.com/peng-lan/p/9605269.html
如果按是否关心内部结构来划分的话,可以分成黑盒测试、白盒测试还有灰盒测试。
黑盒测试
又叫数据驱动测试,把测试对象当做看不见的黑盒,在完全不考虑程序内部结构和处理过程的情况下,测试者仅依据产品的需求文档来判断测试结果的正确性。它是站在使用软件或程序的角度,从输入数据与输出数据的对应关系出发进行的测试。
黑盒测试主要测试的内容
1. 是否有不正确或遗漏的功能?
2. 在接口上,输入是否能正确的接收?能否输出正确的结果?
3. 是否有数据结构错误或外部信息访问错误?
4. 性能上是否能够满足要求?
黑盒测试的主要设计方法
等价类划分法、边界值分析法、错误推测法、因果图法、正交试验分析法、状态迁移图法、流程分析法
白盒测试
设计者可以看到软件系统的内部结构,并且使用软件的内部知识(比如程序的内部逻辑,设计原理)来指导测试数据及方法的选择。
灰盒测试
灰盒测试,介于黑盒和白盒之间,既关注测试内部的逻辑,也关注程序运行的外部表现,算是一种综合性测试。
从测试方式上分,可以分成手动测试和自动化测试。
手动测试
顾名思义,就是参照产品需求文档,对产品通过鼠标点击之类的操作测试GUI(图形用户界面)。
自动化测试
通过编写程序对开发的程序进行测试主要是进行API(应用程序编程接口)测试。
从测试阶段来分,可以分成单元测试、集成测试、系统测试、验收测试
单元测试
单元测试是对软件组成单元进行测试。其目的是检验软件基本组成单位的正确性。
测试阶段:编码后
测试对象:最小模块
测试人员:白盒测试工程师或开发工程师
测试依据:代码和注释+详细设计文档
测试方法:白盒测试
测试内容:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试
集成测试
集成测试也称联合测试、组装测试,将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。主要目的是检查软件单位之间的接口是否正确。
测试阶段:一般单元测试之后进行
测试对象:模块间的接口
测试人员:白盒测试工程师或开发工程师
测试依据:单元测试的模块+概要设计文档
测试方法:黑盒测试与白盒测试相结合
测试内容:模块之间数据传输、模块之间功能冲突、模块组装功能正确性、全局数据结构、单模块缺陷对系统的影响
系统测试
将软件系统看成是一个系统的测试。包括对功能、性能以及软件所运行的软硬件环境进行测试。时间大部分在系统测试执行阶段
测试阶段:集成测试通过之后
测试对象:整个系统(软、硬件)
测试人员:黑盒测试工程师
测试依据:需求规格说明文档
测试方法:黑盒测试
测试内容:功能、界面、可靠性、易用性、性能、兼容性、安全性等
验收测试
验收测试是部署软件之前的最后一个测试操作。它是技术测试的最后一个阶段,也称为交付测试。验收测试的目的是确保软件准备就绪,按照项目合同、任务书、双方约定的验收依据文档,向软件购买都展示该软件系统满足原始需求。
测试阶段:系统测试通过之后
测试对象:整个系统(包括软硬件)。
测试人员:主要是最终用户或者需求方。
测试依据:用户需求、验收标准
测试方法:黑盒测试
测试内容:同系统测试(功能...各类文档等)
14. α测试和β测试的区别
α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试。在正式发布前,通常需要执行α和β测试。α测试不能由程序员或测试员完成。
β测试是一种验收测试。β测试由软件的最终用户们在一个或多个用户场所进行。(类似于公测)
α测试与β测试的区别
测试的场所不同:α测试是指把用户请到开发方的场所来测试,β测试是指在一个或多个用户的场所进行的测试。
α测试的环境是受开发方控制的,用户的数量相对比较少,时间比较集中。β测试的环境是不受开发方控制的,用户数量相对比较多,时间不集中。
α测试先于β测试执行。通用的软件产品需要较大规模的β测试,测试周期比较长。
15. 数据库三范式
1、第一范式(1NF):一个关系模式R的所有属性都是不可分的基本数据项。
2、第二范式(2NF):满足第一范式,要求实体的属性完全依赖于主关键字,消除部分依赖。
3、第三范式(3NF):满足第二范式,任何非主属性不得传递依赖于主属性,消除传递依赖。
为什么一般数据库达到第三范式就可以了?
规范数据库主要目的就是尽量消除冗余,节省存储空问,避免数据不一致性,提高对关系的操作效率,同时满足应用需求。实际上,并不一定要求全部模式都达到第五范式不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高,查询频度极高的数据库系统更是如此。
16. 常见的http状态码
常见的HTTP状态码 - xflonga - 博客园
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见的状态码
17. 常见的linux操作
linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) - 罗蓝国度 - 博客园
cat /proc/version :查看linux版本信息
shutdown -h now :立刻关机
yum install -y "kernel-devel-uname-r == $(uname -r)":安装和Linux内核版本匹配的kernel-devel
clear :清空命令行
ifconfig :显示或设置网卡(查ip等)(类似windows中ipconfig)
cat /proc/cpuinfo :显示CPU的信息
top :动态实时显示cpu、内存、进程等使用情况(类似windows下的任务管理器)
kill -9 进程号 :强制杀死进程
find 查找文件
cat [-n] 文件名 :显示文件内容,连行号一起显示
vim 文件:编辑查看文件(同vi)
ps 用于显示当前进程 (process) 的状态。
free 用于显示内存状态
sudo 以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。
w 命令用于显示目前登入系统的用户信息
screen 用于多重视窗管理程序。
procinfo 用于显示系统状态。
tload 用于显示系统负载状况
gitps 用于报告程序状况。
su 用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。
18. 访问一个网站需要用到哪些协议
应用层:肯定要用到http协议或者https协议,还要用到DNS域名解析服务协议
传输层:需要TCP协议来提供可靠的数据传输;需要UDP协议,因为DNS需要使用UDP协议传输
网络层:需要用到IP协议,用来IP包的传输和路由的选择;ICMP协议:提供网络传输中的差错检测;ARP协议,将目标IP地址广播到局域网获取MAC地址
19. 应用层常见协议
应用层常见协议(HTTP/FTP/SMTP)
应用层协议(DHCP/DNS/TELNET/SSH/TFTP)
一、HTTP协议(超文本传输协议(Hypertext transfer protocol))
概念:它是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
端口:HTTP默认的端口号为 TCP + 80,HTTPS的端口号为 TCP + 443。
应用:浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。
关于HTTP协议,详情看上面链接,很详细。讲的蛮好的。
二、FTP协议( 文件传输协议(File Transfer Protocol))
概念:它是因特网中使用最广泛的文件传输协议。FTP使用交互式的访问,允许客户指定文件的类型和格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件的用户必须经过授权,并输入有效的口令)。文件传输协议有基于TCP的FTP和基于UDP的简单文件传输协议TFTP,它们都是文件共享协议中的一大类,即复制整个文件,其特点是:若要存取一个文件,就必须先获得一个本地的文件副本。如果要修改文件,只能对文件的副本进行修改,然后再将修改后的文件传回到原节点。
端口:FTP默认的端口号为 TCP + 21
FTP工作模式:两种工作模式:主动模式和被动模式;
主动模式:服务器主动连接客户端;
被动模式:客户端主动连接服务器
如何知道FTP传送一个文件结束?
服务器总是执行数据连接的主动打开。通常服务器也执行数据连接的主动关闭,除非当客户向服务器发送流形式的文件时,需要客户来关闭连接。
三、 SMTP协议(简单邮件传输协议(Simple Mail Transfer Protocol))
概念:它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。SMTP 是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。
端口:SMTP默认的端口号为 TCP + 25
STMP的命令和应答:
四、TELNET协议(Internet远程登录服务协议)
概念:Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。
端口:TELNET默认的端口号为 TCP + 23
五、 DHCP协议(动态主机配置协议(Dynamic Host Configuration Protocol))
概念:DHCP协议使用UDP协议工作。当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP,使得客户机能够利用这个IP上网。
端口:DHCP默认的端口号为 UDP + 67
操作流程:
1.寻找DHCP Server
当DHCP客户机第一次登录网络的时候(也就是客户机上没有任何IP地址数据时),它会通过UDP 67端口向网络上发出一个DHCPDISCOVER数据包(包中包含客户机的MAC地址和计算机名等信息)。因为客户机还不知道自己属于哪一个网络,所以封包的源地址为0.0.0.0,目标地址为255.255.255.255,然后再附上DHCP discover的信息,向网络进行广播。
2. 提供IP地址租用
当DHCP Server监听到客户机发出的DHCP discover广播后,它会从那些还没有租出去的地址中,选择最前面的空置IP,连同其它TCP/IP设定,通过UDP 68端口响应给客户机一个DHCP OFFER数据包(包中包含IP地址、子网掩码、地址租期等信息)。此时还是使用广播进行通讯,源IP地址为DHCP Server的IP地址,目标地址为255.255.255.255。同时,DHCP Server为此客户保留它提供的IP地址,从而不会为其他DHCP客户分配此IP地址。
3. 接受IP租约
如果客户机收到网络上多台DHCP服务器的响应,只会挑选其中一个DHCP OFFER(一般是最先到达的那个),并且会向网络发送一个DHCPREQUEST广播数据包(包中包含客户端的MAC地址、接受的租约中的IP地址、提供此租约的DHCP服务器地址等),告诉所有DHCP Server它将接受哪一台服务器提供的IP地址,所有其他的DHCP服务器撤销它们的提供以便将IP地址提供给下一次IP租用请求。此时,由于还没有得到DHCP Server的最后确认,客户端仍然使用0.0.0.0为源IP地址,255.255.255.255为目标地址进行广播。
4. 租约确认
当DHCP Server接收到客户机的DHCP REQUEST之后,会广播返回给客户机一个DHCP ACK消息包,表明已经接受客户机的选择,并将这一IP地址的合法租用以及其他的配置信息都放入该广播包发给客户机。
客户机在接收到DHCP ACK广播后,会向网络发送三个针对此IP地址的ARP解析请求以执行冲突检测,查询网络上有没有其它机器使用该IP地址;如果发现该IP地址已经被使用,客户机会发出一个DHCP DECLINE数据包给DHCP Server,拒绝此IP地址租约,并重新发送DHCP discover信息。此时,在DHCP服务器管理控制台中,会显示此IP地址为BAD_ADDRESS。
如果网络上没有其它主机使用此IP地址,则客户机的TCP/IP使用租约中提供的IP地址完成初始化,从而可以和其他网络中的主机进行通讯
六、 DNS协议(域名解析协议(Domain Name System))
概念: 万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)
端口: DNS默认的端口号为 UDP + 53
DNS域名解析分类:递归解析和迭代解析(具体可以看上面链接)
20. 死锁的四个必要条件
死锁大全
1. 互斥条件:
进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
2. 不可剥夺条件:
进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
3. 请求与保持条件:
进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
4. 循环与等待条件:
存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl, P2, …, pn},其中Pi等待的资源被P(i+1)占有(i=0, 1, …, n-1),Pn等待的资源被P0占有,如图2-15所示。直观上看,循环等待条件似乎和死锁的定义一样,其实不然。按死锁定义构成等待环所 要求的条件更严,它要求Pi等待的资源必须由P(i+1)来满足,而循环等待条件则无此限制。 例如,系统中有两台输出设备,P0占有一台,PK占有另一台,且K不属于集合{0, 1, …, n}。Pn等待一台输出设备,它可以从P0获得,也可能从PK获得。因此,虽然Pn、P0和其他 一些进程形成了循环等待圈,但PK不在圈内,若PK释放了输出设备,则可打破循环等待, 如图2-16所示。因此循环等待只是死锁的必要条件。
21. 事务的四大特性(ACID)
(1)原子性(Atomicity)
一个事务是一个不可分割的整体,为了保证事务的总体目标,事务必须具有原子性,即当数据修改时,要么全都执行,要么全都不执行。即,不允许事务部分地完成,避免了只执行这些操作的一部分而带来的错误。
(2)一致性(Consistency)
一个事务在执行之前和执行之后,数据库数据必须保持一致性。数据库的一致性状态应该满足模式锁指定的约束条件,那么在完整执行该事务后,数据库仍然处于一致性状态。
例如:银行转账,转账前后两个账户金额之和应保持不变。
(3)隔离性(Isolation)
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据库时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
例如:对任何一对事务T1和T2,对T1而言,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。
(4)持久性(Durability)
也被称为永久性,事务完成以后,DBMS(数据库管理系统)保证它对数据库中数据的修改是永久性的,当系统或介质发生故障时,该修改也永久保持。持久性一般通过数据库备份与恢复来保证。
22. 数据库的隔离级别
读未提交(Read Uncommitted):只处理更新丢失。如果一个事务已经开始写数据,则不允许其他事务同时进行写操作,但允许其他事务读此行数据。可通过“排他写锁”实现。
读提交(Read Committed):处理更新丢失、脏读。读取数据的事务允许其他事务继续访问改行数据,但是未提交的写事务将会禁止其他事务访问改行。可通过“瞬间共享读锁”和“排他写锁”实现。
可重复读取(Repeatable Read):处理更新丢失、脏读和不可重复读取。读取数据的事务将会禁止写事务,但允许读事务,写事务则禁止任何其他事务。可通过“共享读锁”和“排他写锁”实现。
序列化(Serializable):提供严格的事务隔离。要求失去序列化执行,事务只能一个接一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和统一性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
23. E-R图
ER模型中包含3种相互关联的信息:数据对象、数据对象的属性及数据对象彼此之间相互连接的关系。
ER图是帮助用户建立数据库的工具,人们大都应用ER图和关系模型创建数据库表。
矩形框:表示实体;菱形框:表示联系;椭圆形框:表示实体或联系的属性
24. IP地址(A/B/C/D类)
IP地址详解
化成十进制就是:
A类地址:0.0.0.0到127.255.255.255,第1字节为网络地址,其它3个字节为主机地址
① 10.X.X.X是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)。
B类地址:128.0.0.0到191.255.255.255,第2字节为网络地址,其它2个字节为主机地址
① 172.16.0.0---172.31.255.255是私有地址。
C类地址:192.0.0.0到223.255.255.255,第3字节为网络地址,其它1个字节为主机地址
①192.168.X.X是私有地址。(192.168.0.0---192.168.255.255)
D类地址:224.0.0.0到239.255.255.255, D类地址没有主机地址。(常考)
E类地址:240.0.0.0到255.255.255.255, E类地址同样没有主机地址。
25. 根据子网掩码和ip地址求网络地址和广播地址
将IP地址和子网掩码换算为二进制,子网掩码连续全1的是网络地址,后面的是主机地址,||前为网络地址,||后为主机地址。
IP地址和子网掩码进行与运算,结果是网络地址(即主机号全0是网络地址)
将运算结果中的网络地址不变,主机地址变为1,结果就是广播地址
地址范围就是含在本网段内的所有主机
网络地址+1即为第一个主机地址,广播地址-1即为最后一个主机地址,
由此可以看出地址范围是: 网络地址+1 至 广播地址-1
主机的数量=2^二进制位数的主机-2
减2是因为主机不包括网络地址和广播地址。
例如题目求10.10.72.176/28的有效ip地址
16表示子网掩码有16个1,则该网络ip子网掩码则为11111111.11111111.11111111.11110000,即255.255.255.240,则子网掩码的前28位为网络地址,后4位为主机地址。10.10.72.176化为二进制为00001010.00001010.01001000.10110000,将两数相与可得00001010.00001010.01001000.10110000,则有效ip应大于10.10.72.176。
26. post和put的区别
PUT和POST都有更改指定URI的语义.但PUT被定义为idempotent的方法,POST则不是.idempotent的方法:如果一个方法重复执行
多次,产生的效果是一样的,那就是idempotent的。也就是说:
PUT请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(所以PUT用来改资源)
Post请求:后一个请求不会把第一个请求覆盖掉。(所以Post用来增资源)