Android笔记第四天

笔记参考文章

1、SQL索引

----创建索引
CREATE UNIQUE INDEX indexName ON tableName (tdName1 DESC,tdName2 DESC…);
----删除索引
DROP INDEX indexName;

2、视图

----创建视图
CREATE VIEW viewName
AS SELECT * FROM tableName WHERE tdNameMathCount
WITH CHECK OPTION
----删除视图
DROP VIEW viewName;

3、ORDER BY 子句根据一列或者多列的值,按照升序或者降序排列数据。

SELECT tdName,tdName2
FROM tableName
ORDER BY tdName1,tdName2 ASC|DESC;

4、WHERE 子句用于有条件地从单个表中取回数据或者将多个表进行合并。

SELECT tdName1, tdName2, tdName3
FROM tableName
WHERE tdNameMathCount;

5、LIKE 子句通过通配符来将一个值同其他相似的值作比较。

同 LIKE 运算符一起使用的通配符有两个:
百分号(%)---- 代表零个、一个或者多个字符。
下划线(_) ---- 代表单个数字或者字符。
SELECT tdName
FROM tableName
WHERE tdName LIKE patternWords;
Android笔记第四天

6、HAVING 子句能指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面。

SELECT tdName1, tdName2, tdName3
FROM tableName
GROUP BY tdName
HAVING tdNameMathCount;

7、DISTINCT 关键字同 SELECT 语句一起使用,可以去除所有重复记录,只返回唯一项。

SELECT DISTINCT tdName FROM tableName

8、接运算符AND 和 OR 运算符可以将多个条件结合在一起,从而过滤 SQL 语句的返回结果。

SELECT tdName1,tdName2
FROM tableName
WHERE tdNameMathCount1 AND/OR tdNameMathCount2;

9、UNION 子句/运算符用于将两个或者更多的 SELECT 语句的运算结果组合起来。

每个 SELECT 语句必须有相同数量的选中列、相同数量的列表达式、相同的数据类型,
并且它们出现的次序要一致,不过长度不一定要相同。
SELECT tdName FROM tableName1
UNION
SELECT tdName FROM tableName2;

----UNION ALL 运算符
用于将两个 SELECT 语句的结果组合在一起,重复行也包含在内。
----INTERSECT子句:
用于组合两个 SELECT 语句,但是只返回两个 SELECT 语句的结果中都有的行。
----EXCEPT 子句:
组合两个 SELECT 语句,并将第一个 SELECT 语句的结果中存在,但是第二个 SELECT 语句的结果中不存在的行返回。

10、连接(JOIN) 子句用于将数据库中两个或者两个以上表中的记录组合起来。连接通过共有值将不同表中的字段组合在一起。

SELECT tableName1.tdName1,tableName2.tdName1
FROM tableName1
INNER JOIN tableName2
ON tableName1.tdName1=tableName2.tdName1;

内连接(INNER JOIN):当两个表中都存在匹配时,才返回行。
左连接(LEFT JOIN):返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。
右连接(RIGHT JOIN):返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。
全连接(FULL JOIN):返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值

11、进程与线程的区别

进程:具有动态、并发、独立、异步的特性,以及就绪、执行、阻塞3种状态;引入是为了使多个程序可以并发的执行,以提高系统的资源利用率和吞吐量。

线程: 具有轻型实体,独立调度分派单位,可并发执行,共享进程资源等属性;引入是为了减少程序在并发执行过程中的开销,使OS的并发效率更高。
(是比进程更小的可独立运行的基本单位,可以看做是轻量级的进程)

12、死锁原因:

竞争资源:请求同一有限资源的进程数多于可用资源数
进程推进顺序非法:进程执行中,请求和释放资源顺序不合理,如资源等待链

13、进程调度算法

先来先服务调度算法FCFS:
既可以作为作业调度算法也可以作为进程调度算法
按作业或者进程到达的先后顺序依次调度;
因此对于长作业比较有利;

短作业优先调度算法SJF:
作业调度算法
算法从就绪队列中选择估计时间最短的作业进行处理,直到得出结果或者无法继续执行;
不利于长作业;未考虑作业的重要性;运行时间是预估的,并不靠谱 ;

高响应比算法HRN: 响应比=(等待时间+要求服务时间)/要求服务时间;

时间片轮转调度RR:
到达的先后对进程放入队列中,然后给队首进程分配CPU时间片
时间片用完之后计时器发出中断,暂停当前进程并将其放到队列尾部,循环 ;

多级反馈队列调度算法:
目前公认较好的调度算法
设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减。
优先级越高的队列分配的时间片越短,进程到达之后按FCFS放入第一个队列,
如果调度执行后没有完成,那么放到第二个队列尾部等待调度,
如果第二次调度仍然没有完成,放入第三队列尾部……
只有当前一个队列为空的时候才会去调度下一个队列的进程。

14、 动态分区分配又称为可变分区分配。

这种分区方法不预先将内存划分,而是在进程装入内存时,
根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。
因此系统中分区的大小和数目是可变的。

首次适应(First Fit)算法:
空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。

最佳适应(Best Fit)算法:
空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区。

最坏适应(Worst Fit)算法: 又称最大适应(Largest Fit)算法,
空闲分区以容量递减的次序链接。找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。

15、页面置换算法

最佳置换算法:
只具有理论意义的算法,用来评价其他页面置换算法。
置换策略是将当前页面中在未来最长时间内不会被访问的页置换出去。

先进先出置换算法:
简单粗暴的一种置换算法,没有考虑页面访问频率信息。
每次淘汰最早调入的页面。

最近最久未使用算法LRU:
算法赋予每个页面一个访问字段,用来记录上次页面被访问到现在所经历的时间t,
每次置换的时候把t值最大的页面置换出去(实现方面可以采用寄存器或者栈的方式实现)。

时钟算法clock(也被称为是最近未使用算法NRU):
页面设置一个访问位,并将页面链接为一个环形队列,页面被访问的时候访问位设置为1。
页面置换的时候,如果当前指针所指页面访问为为0,那么置换,
否则将其置为0,循环直到遇到一个访问为位0的页面。

改进型Clock算法:
在Clock算法的基础上添加一个修改位,替换时根究访问位和修改位综合判断。
优先替换访问位和修改位都是0的页面,其次是访问位为0修改位为1的页面。

最少使用算法LFU:
设置寄存器记录页面被访问次数,每次置换的时候置换当前访问次数最少的。

16、TCP/IP协议族按照层次由上到下,层层包装。

最上面是应用层,这里面有http,ftp,等等我们熟悉的协议。
第二层是传输层,著名的TCP和UDP协议就在这个层次。
第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定传输的目标。
第四层是数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。

1.数据链路层
物理层负责0、1比特流与物理设备电压高低、光的闪灭之间的互换。
数据链路层负责将0、1序列划分为数据帧从一个节点传输到临近的另一个节点,
这些节点是通过MAC来唯一标识的(MAC,物理地址,一个主机会有一个MAC地址)。

封装成帧:把网络层数据报加头和尾,封装成帧,帧头中包括源MAC地址和目的MAC地址。
透明传输:零比特填充、转义字符。
可靠传输:在出错率很低的链路上很少用,但是无线链路WLAN会保证可靠传输。
差错检测(CRC):接收者检测错误,如果发现差错,丢弃该帧。

2.网络层
----IP协议是TCP/IP协议的核心,所有的TCP,UDP,ICMP,IGCP的数据都以IP数据格式传输。
IP不是可靠的协议,没有提供一种数据未传达以后的处理机制,
这被认为是上层协议——TCP或UDP要做的事情。

----在数据链路层中我们一般通过MAC地址来识别不同的节点,而在IP层我们也要有一个类似的地址标识,这就是IP地址。

32位IP地址分为网络位和地址位,这样做可以减少路由器中路由表记录的数目,
有了网络地址,就可以限定拥有相同网络地址的终端都在同一个范围内,
那么路由表只需要维护一条这个网络地址的方向,就可以找到相应的这些终端了。
A类IP地址:1.0.0.0~127.0.0.0
B类IP地址:128.0.0.0~191.255.255.255
C类IP地址:192.0.0.0~223.255.255.255
----IP协议头,这里只介绍:八位的TTL(Time To Live)字段。
这个字段规定该数据包在穿过多少个路由之后才会被抛弃。
某个IP数据包每穿过一个路由器,该数据包的TTL数值就会减少1,
当该数据包的TTL成为零,它就会被自动抛弃。
这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,
根据系统的不同,这个数字也不一样,一般是32或者是64。

17、TCP和UDP

当对网络通讯质量有要求的时候TCP
比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

当对网络通讯质量要求不高的时候UDP
要求网络通讯速度能尽量的快。

18、DNS(Domain Name System,域名系统)

因特网上作为域名和IP地址相互映射的一个分布式数据库,
能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
DNS协议运行在UDP协议之上,使用端口号53。

19、TCP三次握手和四次挥手

三次握手的目的是同步连接双方的***和确认号并交换 TCP窗口大小信息。
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
----如client不会向server的确认发出确认,
server由于收不到确认,就知道client并没有要求建立连接。
server的很多资源就不会白白浪费掉了。

----第一次握手 建立连接。
客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;
然后,客户端进入SYN_SEND状态,等待服务器的确认;

----第二次握手 服务器收到SYN报文段。
服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,
设置Acknowledgment Number为x + 1(Sequence Number + 1);
同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;
服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,
一并发送给客户端,此时服务器进入SYN_RECV状态;

----第三次握手 客户端收到服务器的SYN+ACK报文段。
然后将Acknowledgment Number设置为y + 1,向服务器发送ACK报文段,
这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

----第一次分手 主机1(可以使客户端,也可以是服务器端),
设置Sequence Number,向主机2发送一个FIN报文段;
此时,主机1进入FIN_WAIT_1状态;
这表示主机1没有数据要发送给主机2了;

----第二次分手 主机2收到了主机1发送的FIN报文段,
向主机1回一个ACK报文段,
Acknowledgment Number为 Sequence Number加1;
主机1进入FIN_WAIT_2状态;
主机2告诉主机1,我“同意”你的关闭请求;

----第三次分手 主机2向主机1发送FIN报文段,
请求关闭连接,同时主机2进入LAST_ACK状态;

----第四次分手 主机1收到主机2发送的FIN报文段,
向主机2发送ACK报文段,
然后主机1进入TIME_WAIT状态;
主机2收到主机1的ACK报文段以后,就关闭连接;
此时,主机1等待2MSL(MSL:Maximum Segment Lifetime,报文段最大生存时间)
依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

----MSL是任何报文段被丢弃前在网络内的最长时间
假设新连接和已经关闭的老连接端口号是一样的,
如果前一次连接的某些数据仍然滞留在网络中(称为Lost Duplicate),
这些延迟数据在建立新连接之后才到达主机2,
由于新连接和老连接的端口号是一样的,
TCP协议就认为那个延迟的数据是属于新连接的,
这样就和真正的新连接的数据包发生混淆了。
所以TCP连接要在TIME_WAIT状态等待2倍MSL
保证本次连接的所有数据都从网络中消失。

19、一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成

1.请求行
请求行分为三个部分:请求方法、请求地址和协议版本
----HTTP/1.1 定义的请求方法有8种:
GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。
最常的两种GET和POST,
如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。

----请求地址
URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>
----请求数据
可选部分,比如GET请求就没有请求数据。

2.状态代码为3位数字。
1xx:指示信息——表示请求已接收,继续处理。
2xx:成功——表示请求已被成功接收、理解、接受。
3xx:重定向——要完成请求必须进行更进一步的操作。
4xx:客户端错误——请求有语法错误或请求无法实现。
5xx:服务器端错误——服务器未能实现合法的请求。