赞
踩
并发:
并行:
单核CPU只能并发,而多核CPU可以并行
1.在操作系统中,某一时间段,几个程序在同一个CPU上运行,但在任意一个时间点上,只有一个程序在CPU上运行。
2.边吃饭边看电视,并行,
边吃饭边喝水,并发
1.本质是运行在计算机上的软件程序,用于管理软硬件资源
2.屏蔽硬件层的复杂性,解脱程序员,所有跟硬件打交道的工作,封装为一个个系统调用,即一个方法,将系统调用再翻译为机器语言让硬件工作
3.内核是其核心,下面工作都由其来负责
根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:
1.我们运行的程序基本都是在用户态,
2.如果我们调用操作系统提供的系统态级别的子功能就需要系统调用了!
3.在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。
1.系统调用(主动)
2.异常(被动)
3.外围设备的中断(被动)
fork()
创建一个新进程
exit()
中止进程
wait()
等待子进程终止
安全操作
chmod()
修改 用户/组 对 文件/目录 的权限
chown()
修改文件拥有者
从四个方面答:
PCB:进程控制块
包含内容:
PCB 作用?
TCB:线程控制块
进程允许创建和控制另一个进程,前者称为父进程,后者称为子进程,子进程又可以创建孙进程,如此下去进而形成一个进程的家族树,这样子进程就可以从父进程那里继承所有的资源,当子进程撤销时,便将从父进程处获得的所有资源归还,此外,撤销父进程,则必须撤销所有的子进程。(撤销的过程实际上就是对这棵家族树进行后序遍历的过程)
创建:
销毁:
先说有什么
创建状态、就绪状态、运行状态、阻塞状态、结束状态
再说哪两个能互相转化,什么情况下互相转化。
只有就绪状态和运行状态能互相转化,当进程为就绪态时,等待 CPU 分配时间片,得到时间片后就进入 运行状态
再说阻塞状态是什么情况下会到?
阻塞状态是进程在运行状态时,需要等待某个资源比如打印机资源,而进入一个挂起的状态,等资源拿到后会回到就绪状态,等待 CPU 时间片。
其和就绪状态相比还差一些资源
不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。
具体见SZZ笔记
批处理系统,类似打印机
没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)。
吞吐量:单位时间内通过某网络(接口,信道)的数据量
交互系统,要求实时性强
???
临界区
为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。
同步和互斥
1.互斥也称为间接制约关系,指多个进程在同一时刻只有一个进程能进入临界区
2.同步也称为直接制约关系,它是指为了完成某种任务而建立的多个进程需要有一定的工作次序
信号量机制
–原语:
一种特殊的程序段,其执行只能一气呵成,不能被中断
–一对原语:
wait(S)与signal(S),简称为PV操作
可以理解为自定义的函数,里面的信号量S其实就是函调时传入的一个参数
–实现同步
1.设同步信号量S=0
2.在前操作后执行V(S)
3.在后操作前执行P(S)
–实现互斥
只需将同步信号量设置为1
–PV操作
P:如果信号量大于零,就对其进行减 1 操作;如果信号量等于 0,进程进入 waiting 状态,等待信号量大于零。
V:对信号量执行加 1 操作,并唤醒正在 waiting 的进程
管程
–信号量机制编写程序困难,易出错,管程可以更方便得实现进程互斥和同步
–管程中定义共享数据(如生产者模型中的缓冲区)
–管程中定义访问这些共享数据的“入口”,如生产函数和消费函数
–管程有很多入口(函数),但一次只开放一个入口(一次只能调用一个函数),只能让一个进程进入(如生产者模型中的缓冲区只能互斥访问)
–管程中定义条件变量及等待唤醒等操作以解决同步问题
–这些互斥,同步关系不需程序员关心,调用即可
临界资源
1.一段时间内只允许一个进程使用的资源,如打印机,
2.访问临界资源时需要互斥得进行,逻辑上分为:进入区,临界区,退出区,剩余区(其它处理),入与出是负责实现互斥的代码段
临界区
对临界资源的访问那段代码被称为临界区
管道(匿名管道、命名管道)
–管道是指用于连接读写进程的一个共享文件,是在内存中开辟的一个大小固定的缓冲区
–管道只能采用半双工通信
–各进程互斥地访问管道
–数据以字符流的形式写入管道,管道写满,写进程的write()的系统调用被阻塞,同样,管道为空时,read()×
–写满才能读,读空才能写
消息队列
–进程通过操作系统提供的发送消息和接收消息这两个原语进行数据交换
–发送方通过发送原语将消息挂在消息队列(中介邮局或接收方的信箱,对应间接与直接通信)
–接收方通过接收原语接收与处理
–发送数据大的时候,此模型不适用,因为发送消息(拷贝)这个过程就需要很多时间来读写内存
共享内存(临界区的概念)
–以虚拟内存为基础,系统加载进程的时候,分配给进程的内存是虚拟内存空间。让两个进程各自拿出一块儿虚拟地址空间来,映射到同一个物理内存中。就完成共享机制了。
–解决拷贝耗时很长的问题,共享内存是最快的一种进程通信的方式,因为进程是直接对内存进行存取的
–进程对共享内存的访问是互斥的
–通常用信号量来实现互斥
信号量
–可以来保证进程间的操作的同步与互斥
–互斥信号量初始值定义为1,当进程访问临界区发现其为0时就知道有其他进程正在访问
套接字
–套接字可以实现两个不同的机器之间的进程通信,(IP地址:端口号)
举个例子:
“”"
mutex = 1
empty = N
full = 0
def P(S):
S -= 1
if S < 0:
block() # 如果小于0,代表资源没了
def V(S):
S += 1
if S <= 0:
wakeUp() # 如果小于等于0,代表有进程仍然在等待,通知他们ok了
def producer():
P(empty) # 生产者生产一个产品,消耗一个空缓冲区
P(mutex) # 临界区上锁
# … 临界区
V(mutex)
V(full) # 非空闲缓冲区数量加1
def Consumer():
P(full) # 消费者消耗一个非空闲缓冲区
P(mutex) # 临界区上锁
# .... 临界区
V(mutex)
V(empty) # 闲缓冲区数量加1
“”"
首先要尽量避免死锁的发生,可以从两个角度考虑。
预防策略
死锁避免算法-银行家算法
如果真的发生死锁:
首先需要检测死锁,检测有向图中是否存在环。
死锁恢复(从下到上逐渐变态苛刻)
撤销进程
撤销所有死锁的进程
资源剥夺策略
鸵鸟策略
?
内存分配
内存回收
地址映射()
内存保护
连续:分块儿:每个进程分个块儿,容易造成碎片
不连续:
- 分页:分层大小相等的页
- 分段:有意义的段
- 段页:每个段内不连续
都是离散管理的
分页的页面大小是固定的,分段不固定。
分页没意义,分段有意义。
分页内存利用率高,分段难以分配大的连续内存。
快表:
why?
为了加快逻辑地址到物理地址的转化,原来的转化过程需要访问两次内存。
引入快表之后,快表里放了最近使用的页表项,快表是个 cache,根据局部性原理最近使用的页表项很可能再次被访问到,所以就会变成一次访问内存。
多级页表:
why?
原来虚拟地址空间是 4GB,如果页的大小是 4KB 的话,需要 1M 个页表项来映射这么多页,一个页表项一般是 4B 大小,这样的话就需要 4MB 的内存空间来存放这些页表项,也就是大概 1K 个页来存放。
引入多级页表以后,我一个一级页表项可以映射的大一点,映射 4MB 的内存,这样只需要 1K 个页表项来映射主内存,然后每个一级页表项再映射 1K 个二级页表项,每个二级页表项再映射 4KB 的内存。
当我使用到哪个一级页表项时,再把对应的二级页表项 load 到内存里。
答:why?为什么用虚拟地址?从用物理地址直接操作寄存器的后果来答。
如果直接操作物理地址,用户程序可以直接访问底层物理地址,很容易破坏操作系统,造成系统崩溃。
想要同时运行多个程序很难,多个程序可能对同一个物理地址进行操作,发生崩溃。
所以用虚拟地址,让操作系统来管理虚拟地址到物理地址的映射,避免发生崩溃。我们在使用 C++ 的指针的时候,其实指针就是一个虚拟地址,操作系统里有一个叫 MMU 的地址转换单元会把虚拟地址转换为物理地址。
why?
为什么要有虚拟内存呢?因为传统的内存管理是一次性把所有的作业都 load 到内存里,并且一直驻留到运行结束。作业很大的时候,是没有办法一次性装入内存的。
how?
是什么
当使用请求分页存储来管理内存时,发生缺页中断,就是要访问的页面不在内存中,这时就需要操作系统把其调入主存后再进行访问。
而在发生缺页中断时,内存中没有空闲的页面,就必须在内存中根据一定的策略挪出一些不用的页面,可以把页面置换算法看成是淘汰机制。
怎么办
FIFO:先到先出算法
LRU:Least Recently Used
最近最久未使用页面置换算法
LFU:Least frequently used
最少使用算法,把使用最少的页面淘汰掉
OPT 页面置换法,最佳页面置换:不可实现,不可预测哪个是不用的。
2.如果某数据被访问过,不就以后该数据很可能再次被访问。
3.原因是存在大量循环。
3.因为指令通常时顺序存放、顺序执行的。
???
软相当于快捷方式
硬链接相当于源文件的小名(文件名为大名)
建软链接命令
ln -s <被链接源文件> <链接名>:
没有 -s 建的是一个 硬链接
建链接注意事项
0.源文件要使用绝对路径,相对路径在移动链接文件后不能再正常使用
1.Linux 中,文件名 和 文件的数据 是分开存储的,保存在磁盘的不同位置
2.软链接的文件名,其保存的数据为链接到源文件(文件名)的完整路径,因此将源文件删除无法再访问其中的数据
3.硬链接相当于源文件的小名(文件名为大名),因此即使大名没了也可以通过小名访问到存储在存储在磁盘中另外一个位置的文件数据,要完整得删除一个文件不仅要删除源文件,还要删除硬链接
一般情况下,子进程是由父进程创建,而子进程和父进程的退出是无顺序的
一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。
孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作。
由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。
一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过wait() 获取了子进程信息后才会释放。
如果子进程退出,而父进程并没有调用wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。
系统所能使用的进程号是有限的,如果产生大量僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。
要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿
当一个子进程改变了它的状态时(停止运行,继续运行或者退出),有两件事会发生在父进程中:
1.得到 SIGCHLD 信号;
2.waitpid()或wait()调用会返回
其中子进程发送的 SIGCHLD 信号包含了子进程的信息,比如进程ID、进程状态、进程使用CPU的时间等。
在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息,父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息
父进程调用 wait() 会一直阻塞,直到收到一个子进程退出的 SIGCHLD 信号,之后 wait() 函数会销毁子进程并返回。
作用和 wait() 完全相同,但是多了两个可由用户控制的参数pid和options
目录切换
cd usr: 切换到该目录下 usr 目录
cd …(或cd…/):切换到上一层目录
cd /: 切换到系统根目录
cd - :最近两次工作目录来回切
cd 空/~:切回当前目录的主目录
目录(文件)的增删改查
增
mkdir [-p] <目录名>:
增加目录,p表示递归建立
touch <文件名>: 文件的创建
删
删除有很多命令,只需记住一个:
rm [-rf] <文件或目录> :
f表强制,r表递归删除
举例:根目录下 rm -rf * ,重装系统
改
mv <目录/文件/压缩包名> <新名字>:对文件/目录/压缩包 进行重命名。
mv <目录/文件/压缩包名> <新位置>: 移动位置。
cp [-r] <目录/文件/压缩包名> <新位置/新位置&新名字>: -r 代表递归拷贝,位置后面加上/名字时表重命名
vim <文件名>:vim 编辑器是 Linux 中的强大组件,是 vi 编辑器的加强版,相当于windows下的记事本,使用步骤: vim 文件------>进入文件----->命令模式------>按i/a/o进入编辑模式----->编辑文件 ------->按Esc回到命令模式----->输入:wq / q! (:表示进入底行模式,wq 代表写入内容并退出,即保存;q!代表强制退出不保存)。
查
tree [目录名]:以树状图格式显示当前目录结构
ls [-lha] [x*]:l表示以列表形式展现,h表以人性化方式显示文件大小,a表显示所有(包括隐藏文件),可与通配符搭配使用,x* 表查找以x开头的文件
cat [文件名]:用来查看文件内容、创建文件,一次显示所有的内容
more [文件名]:用于分屏显示文件内容,每次只显示一页内容
grep 搜索文本 搜索范围 [-nvi]:
显示行号,不存在此文本的行,忽略大小写
find <目录> <参数>
目录省略的话表当前目录
① 列出当前目录及子目录下所有文件和文件夹:
find .
② 在 /home 目录下查找以 .txt 结尾的文件名:
find /home -name “*.txt”
解压
tar -xvf <压缩文件名> [-C 目标路径]
x:代表解压
v:显示运行过程
f:指定文件名
管道 |:
将一个命令的输出通过管道 做为另一个的输入
eg:
ls -lha ~|more:
分页显示ls内容
ls -lha ~|grep do:
搜索ls内容中的do关键字
文档:14. Linux 进程管理.note
链接:http://note.youdao.com/noteshare?id=8d34aad067847a3430a7534a6f91e408&sub=8C5F90176E1142A385F7E714F699BB23
进程简介
1.在 linux 中,每一个程序都是有自己的一个进程,每一个进程都有一个 id 号!
2.每一个进程呢,都会有一个父进程!
3.进程可以有两种存在方式:前台!后台运行!
4.一般的话服务都是后台运行的,基本的程序都是前台运行的!
常用命名
ps -aux:
查看进程的详细状况
pstree -pu:目录树结构来看父子关系
-p 显示父id
-u 显示用户组
top:
动态显示运行中的进程并且排序
kill [-9] :
进程代号终止指定代号的进程,-9表示强行终止
ps
pstree
top
netstat
关机/重启
shutdown [-r] [时间]:
-r表重新启动,时间不设置默认1min
查看或配置网卡信息
ifconfig:查看计算机当前网卡配置信息
ping ip地址:检测到目标ip地址的连接是否正常
远程登录
简介:
SSH 是一种加密的网络传输协议,通过SSH客户端可以远程连接到运行了SSH服务器的远程机器上
ssh [-p port] user@remote
user
是在远程机器上的用户名,如果不指定的话默认为当前用户
remote
是远程机器的地址,可以是 IP/域名,或者是 别名
port
是 SSH Server 监听的端口,如果不指定,就为默认值 22
权限修改
chmod +/-rwx 文件名|目录名:
一次性修改拥有者
/组
权限
组管理 终端命令
groupadd <组名>:添加组
groupdel <组名>:删除组
cat /etc/group:确认组信息,组信息会保存在 /etc/group 文件中
chgrp -R 组名 文件/目录名:递归修改文件/目录的所属组
用户管理 终端命令
useradd -m -g 组 新建用户名:添新用户,-m 自动建立用户家目录,-g 指定用户所在的组,否则会建立一个和同名的组
userdel -r 用户名:删除用户,-r选项会自动删除用户家目录
passwd 用户名:设置用户密码
cat /etc/passwd | grep 用户名:确认用户信息新建用户后,用户信息会保存在 /etc/passwd 文件中
usermod -g 组:用户名修改用户的主组(passwd 中的 GID)
OSI的七层体系结构
-(法律上的国际标准)
– 从下往上依次为物理层、数据链路层、网络层、运输层、会话层、表示层、应用层
TCP/IP的四层体系结构
-(事实上的国际标准)
– 从下往上依次为网络接口层、网际层、运输层、应用层
– 网络接口层并没有规定什么具体的内容,目的是为了可以互连各种各样的网络接口。
– 网际层的核心协议是IP协议,它可以互连各种不同的网络接口,并给运输层的TCP协议和UDP协议提供服务。
– 运输层的TCP协议在享受IP协议提供的服务后,可向应用层的相应协议(例如,HTTP,SMTP等)提供可靠传输的服务。
– 运输层的UDP协议在享受IP协议提供的服务后,可向应用层的相应协议(例如,DNS,RTP等)提供不可靠传输的服务。
– 因此,使用IP协议可以互连不同的网络接口(IP over everything);IP协议可以为各种网络应用提供服务(Everything over IP)。
适用教学的五层协议的原理体系结构
– 由于TCP/IP为了互连各种网络接口,其网络接口层并没有什么具体内容,这对于我们学习计算机网络原理来说,不够完整。
– 因此,结合OSI和TCP/IP的优点,提出一种五层协议的原理体系结构,以适用于教学。
– 五层协议的原理体系结构从下往上依次为物理层、数据链路层、网络层、运输层、应用层。
一般指的是 TCP/IP 从上往下答!
横向看:为哪两个对象间提供服务?应用程序?进程?主机?主机?传输媒体?
纵向看:为上层提供什么服务?在这一层就把这个数据的形式说出来了。
有什么协议?
-为应用程序
间提供通信和交互的协议。
-DNS、HTTP、SMTP、FTP等。
-数据称为:报文
。
-为两台主机中的进程
间提供通用的数据传输服务。
-为上层提供服务:把应用层的报文封装成 TCP报文段
或 UDP用户数据报
进行传送。
-TCP、UDP
-为多个网络上的两台主机
提供通信服务。
-为上层提供服务:把运输层产生的报文段或用户数据报封装成IP数据报
进行传送。
-IP、ARP、ICMP、IGMP
-为单段链路上的两台主机
提供通信服务。
-为上层提供服务:把IP数据
报封装成帧
,在链路上进行传递。
-CSMA PPP
-解决使用何种信号来传输比特的问题
-为上层提供服务:尽可能为数据链路层屏蔽传输媒体和通信手段的差异,把帧拆分成比特流
在传输媒介上进行传输。
-时分复用、频分、码分多址、波分复用等!
总结
主机和Web服务器之间基于网络的通信,实际上是主机中的浏览器应用进程
与Web服务器中的Web服务器应用进程
之间基于网络的通信
发送方发送
-应用层按照HTTP协议的规定构建一个HTTP请求报文
-运输层给HTTP请求报文添加一个TCP首部,使之成为TCP报文段
-网络层给TCP报文段添加一个IP首部,使之成为IP数据报
-数据链路层给IP数据报添加一个首部和一个尾部,使之成为帧
-物理层先将帧看做是比特流,前面添加前导码,后将装有前导码的比特流变换成相应的信号发送给传输媒体
路由器转发
-物理层将信号变为比特流,然后去掉前导码后,将其交付给数据链路层
-数据链路层将帧的首部和尾部去掉后,将其交付给网络层,这实际交付的是IP数据报
-网络层解析IP数据报的首部,从中提取目的网络地址
-提取目的网络地址后查找自身路由表。确定转发端口,以便进行转发
-网络层将IP数据报交付给数据链路层
-数据链路层给IP数据报添加一个首部和一个尾部,使之成为帧,传给物理层
-物理层同上
接收方接收
发送的逆过程
-物理层将信号变换为比特流,然后去掉前导码后成为帧,交付给数据链路层
-数据链路层将帧的首部和尾部去掉后成为IP数据报,将其交付给网络层
-网络层将IP数据报的首部去掉后成为TCP报文段,将其交付给运输层
-运输层将TCP报文段的首部去掉后成为HTTP请求报文,将其交付给应用层
-应用层对HTTP请求报文进行解析,然后给主机发回响应报文
网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。
多个网络通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即互连网(互联网)。因此,互联网又称为“网络的网络(Network of Networks)”。
因特网(Internet)是世界上最大的互连网络(用户数以亿计,互连的网络数以百万计)。
–以太网(Ethernet)是一种计算机局域网技术。IEEE组织制定其技术标准
–以太网使用交换机替代了集线器,交换机是一种链路层设备,它不会发生碰撞,能根据 MAC 地址进行存储转发。
– 前者泛指多个计算机网络互连而成的网络。在这些网络之间的通信协议可以是任意的
– 后者是一个专用名词,它指当前全球最大的、开放的、由众多网络互连而成的特定计算机网络,它采用TCP/IP协议族作为通信的规则,其前身是美国的ARPANET
– 任意把几个计算机网络互连起来(不管采用什么协议),并能够相互通信,这样构成的是一个互连网(internet) ,而不是因特网(Internet)。 因为其只用TCP/IP协议
–工作在物理层
–信号在线路中传播会进行衰减,集线器的作用就是对信号进行再生放大,从而扩大了网络的传输距离
–工作在数据链路层
–交换机转发的消息叫做帧。
–集线器的信道利用率低 ,如果同时收到两个不同接口的帧,那么就发生了碰撞
–交换机有很多个端口,每个端口都能够连接一台计算机
–交换机具有自学习能力,学习的是交换表的内容,交换表中存储着 MAC 地址到接口的映射。
工作在网络层
路由器转发的消息叫做IP数据报。
交换机只能转发局域网内的帧。如果网络A的主机想要发消息给网络B的主机就需要路由器了。
–所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞)。
–主要有两种控制方法进行协调,一个是使用信道复用技术,一是使用 CSMA/CD 协议
–因为不会发生碰撞,因此也比较简单,使用 PPP 协议进行控制。
频分,时分,统计时分,波分,码分
–Carrier Sense Multiple Access with Collision Detection
多点接入 :说明这是总线型网络,许多主机以多点的方式连接到总线上。
载波监听 :每个主机都必须不停地监听信道。在发送前,如果监听到信道正在使用,就必须等待。
碰撞检测 :在发送中,如果监听到信道已有其它主机正在发送数据,就表示发生了碰撞。虽然每个主机在发送数据之前都已经监听到信道为空闲,但是由于电磁波的传播时延的存在,还是有可能会发生碰撞。
互联网用户通常需要连接到某个 ISP 之后才能接入到互联网,PPP 协议是用户计算机和 ISP 进行通信时所使用的数据链路层协议。
– MAC 地址是链路层地址,长度为 6 字节(48 位),用于唯一标识网络适配器(网卡)。
– 一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因此就有两个 MAC 地址。
所有站点都属于同一个广域网
巨大的广播域会带带来广播风暴,难以管理和维护以及一些潜在的安全问题
–虚拟局域网可以建立与物理位置无关的逻辑组,而这些网段具有某些共同的需求。
–只有在同一个虚拟局域网中的成员才会收到链路层广播信息。
–每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的计算机是属于哪一个 VLAN
网络层对以下的分组丢失、分组失序、分组重复的传输错误采取措施,使得接收方能正确接受发送方发送的数据,就是可靠传输,
反之,如果什么措施也不采取,则是不可靠传输
结构
– 一个 IP 数据报由首部和数据两部分组成。
– 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。
–在首部的固定部分的后面是一些可选字段,其长度是可变的。
知道首部放什么信息
– 版本号:放ipv4还是ipv6
– 生存时间TTL,防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报
– 协议:本次的数据上交给哪个协议进行处理 TCP UDP ICMP
– 首部长度 : 占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为固定部分长度为 20 字节,因此该值最小为 5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。
IP地址的定义
IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。共32位
几种类型?
IP 地址的编址方式经历了三个历史阶段
– 分类
IP地址 = {< 网络号 >,< 主机号 >}
由两部分组成,网络号和主机号,其中不同分类具有不同的网络号长度,并且是固定的。
– 子网划分
– {<网络号>,<子网号>,<主机号>}
通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址
– 无分类
IP地址= {<网络前缀号>,<主机号>}
划分子网的原因
–IP地址空间的利用率有时很低,可以从主机号部分借一部分比特作为子网号
–为新增网络申请新的网络号会增加其他路由器中路由表记录的数量,需要等待时间和花费更多的费用
– 路由器可以把其他子网看成一个整体来进行计算。对于目的地在其他子网的数据包,路由器只需要让数据包到达那个子网即可,而剩下的工作就由子网内部解决了
子网掩码是干什么的?
–32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号
–使用连续的比特1来对应网络号和子网号,连续的比特0来对应主机号
–一个B类地址的默认子网掩码为 255.255.0.0,如果 B 类地址的子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0
–(IP 地址) AND (子网掩码) = 网络地址
如何判断两个IP地址属于同一个子网?
与下面问题等同:在IP数据报的发送与转发过程中,源主机如何知道目的主机是否与自己在同一个网络中,是直接交付,还是间接交付?
–两个IP同时和源地址的子网掩码进行相与,然后判断是否相等
–相等就在同一个网络,属于直接交付
–不相同,就不在同一个网络中,属于间接交付,传输给主机所在网络的默认网关由其帮忙转发
默认网关:
用户为了让本网络中的主机能和其他网络中的主机进行通信,就必须给其指定本网络的一个路由器的接口,由该路由器帮忙进行转发,所指定的路由器该接口的IP地址,也被称为默认网关
在一个子网内
主机 A 想往主机 B 发信息时,会先在自己的 ARP 缓存表中查找是否有对应 主机B IP 地址的 MAC 地址,如果没有,则发送一次 广播 ARP 请求分组,主机 B 和主机 A 在同一个局域网,则主机 B 收到 ARP 请求分组时,会回发一个 ARP 响应分组,里面带有自己的 MAC 地址,随后主机 A 向其ARP 缓存表中写入主机 B 的 IP 地址到 MAC 地址的映射
不在一个子网内
主机 A 会先把子网掩码和目的 IP 进行相与,发现不一个网段,下一跳就直接找默认网关就可以了,
如果 ARP 缓存里没有默认网关的 MAC 地址,也需要先发一个 ARP 请求分组,等默认网关给他回一个 ARP 响应分组后,就拿到了默认网关的 MAC 地址。
路由器会帮他广播,找到主机 B 的 MAC 地址,然后主机 B 会回答一个 ARP 响应分组给 主机 A 然后就拿到了!
MAC地址必不可少
它链路层地址,用于唯一标识网络适配器(网卡)
为何需要IP地址?
– 只用MAC地址太慢且不可能实现!
只用MAC地址的话,路由器需要记住每
个MAC地址所在的子网是哪一个,而世界上有2的48次个MAC地址,这就意味着即使我们给每个MAC地址只留1字节的储存空间,每个路由器也需要256 TB的内存!这显然是不可能实现的。
– IP相当于现住地址!
IP地址是和地域相关的。对于位于同一个子网上的设备,我们给他们分配的IP地址前缀都是一样的。这个前缀就像邮政编码一样。路由器通过其可以识别设备在哪个子网上。现在,路由器只需要记住每个子网的位置,大大减少了路由器所需要的内存。
IP地址是要设备上线以后,才能根据他进入了哪个子网来分配的,在设备还没有IP地址的时候(或者分配IP地址的过程中),我们还需要用MAC地址来区分不同的设备。
是网络层的协议,主要作用是更有效得转发IP数据报和提高交付成功的机会,让网络中的节点能够报告差错情况和异常情况。
本质还是个 IP 数据报,IP数据报的数据段用 ICMP 报文代替了而已。
差错报文的四种类型
终点不可达
当路由器和主机没办法交付数据,就向源头发送一个终点不可达报文。
时间超过( traceRoute)
如果路由器发现数据的 TTL 为 0,那么丢弃该数据,并向源头发送一个时间超过报文。可以用于 traceRoute
参数问题
若路由器或主机发现IP数据报的首部有错误,就发给源头一个参数问题报文。
改变路由
路由器给主机发送这个报文,告诉他有更好的路径。
询问报文的两种类型
回声请求或回答报文(ping)
主机或路由器向一个特定的主机发送回声(echo)请求报文,目的主机收到后回一个回答报文。
两种应用:
只会问Linux的ping命令底层如何实现
VPN出现得原因
– IP 地址的紧缺,一个机构能够申请到的IP地址数往往远小于本机构所拥有的主机数
– 互联网并不很安全,一个机构内也并不需要把所有的主机接入到外部的互联网
–假定在一个机构内部的计算机通信也是采用 TCP/IP 协议,那么从原则上讲,对于这些仅在机构内部使用的计算机就可以由本机构自行分配其 IP 地址(专用地址)。
NAT的功能
– 专用网内部的主机使用本地 IP 地址,并又想和互联网上的主机通信时,可以使用 NAT 来将本地 IP 转换为全球 IP。
NAPT
– NAT的局限性:NAT 将本地 IP 和全球 IP 一一对应,这种方式下拥有 n 个全球 IP 地址的专用网内最多只可以同时有 n 台主机接入互联网。
–NAT 转换表把传输层的端口号也用上了,使得多个专用网内部的主机共用一个全球 IP 地址。
组成
1.功能上
路由选择和分组转发。
2.实际结构
交换结构、一组输入端口 一组输出端口。
路由选择协议
[具体见标题栏链接]
1.域内路由选择:
2.域间路由选择:
有无连接?
TCP
拥塞控制?
TCP
n对n?
TCP 1V1
是否拆分数据?传输数据大小?
UDP 协议是面向无连接的,尽最大可能交付,没有拥塞控制,直接把应用层的报文拿下来,然后加个 UDP 首部,就算结束了。支持一对一,一对多,多对一,多对多的交互通信。
TCP 协议是面向连接的,提供可靠的交付,有流量控制、拥塞控制、超时重传等保证可靠连接的一些机制。把应用层传下来的数据看成字节流,拆分成最适合传输的大小,封装TCP报文段来传输。每一条 TCP 连接使能是一对一的。
UDP:音视频实时通话
TCP:文件传输 邮件传输
1.实时音视频是可以而且应该用 UDP 的,一方面因为它常常涉及到网络穿透,另外一方面它不需要重传。——我需要实时的看到你的图像跟声音,至于中间丢一帧什么的完全不重要。而为了重传往往会造成延迟与不同步,考虑一下,某一帧因为重传,导致 0.5 秒以后才到,那么整个音视频就延迟了0.5秒。
考虑一下接收方视频,如果使用 TCP 丢包重传导致视频的中间延迟了0.5秒,那么后续的同化全都会比发送方延迟 0.5 秒。这种延迟是累加的,随着持续丢帧,延迟会越来越大,达到数秒,甚至分钟级,这会严重影响即时性比较强的音视频通话的用户体验。
2.如果出现卡顿掉帧,就是 UDP 的结果,如果是 TCP 协议,那么是直接视频黑屏,然后又重新有了,不会出现卡顿掉帧,因为 TCP 是面向连接的,他的确认重传机制保证了他收到的数据是可靠的,连续的!
数据完整性 –>
加上 CRC 验证字段
乱序到达 –>
加上一个数据包序列号 SEQ
丢包 –>
需要确认和重传机制,就是和 Tcp 类似的 Ack 机制
理解三次握手以及四次挥手具体过程
三次握手的原因
四次挥手原因
TIME_WAIT 的作用。
三次握手:
四次挥手
只需要记住三次握手期间的半连接状态,和四次挥手期间的客户端状态演变即可
https://blog.csdn.net/plokmju88/article/details/103884145
设计可靠 UDP 协议?
三个角度来思考
基本的控制两条
发送端控制
接收端控制
https://blog.csdn.net/m0_47984232/article/details/108253344
定义
域名解析协议,提供了域名和 IP 地址之间相互转换的服务。
传输层用的什么协议?为什么?
1.可以使用 UDP 或 TCP,但一般用 UDP 因为快,只要一个请求,一个应答就 ok 了
2.UDP 协议传输的内容不能超过 512 字节,一般上客户端向 DNS 服务器查域名,返回的内容都不超过 512 字节,用 UDP 就够了。
3.区域传送用 TCP
–DNS 是分布式数据库,区域传送,就是 主 DNS 服务器上的数据有变化了,需要向下传送变化的那部分数据时,因为数据必然很大,并且要保证传输可靠,所以不能用 UDP。
DNS 默认端口号是什么
53
知道是干什么的就行了
FTP
两台计算机间的文件传输协议
SMTP、POP3、IMAP
电子邮件系统
2.邮件服务器
3.邮件协议
发送协议(SMTP)
读取协议(POP3和IMAP)
SMTP
POP3
1.用户只能以下载并删除方式或下载并保留方式从邮件服务器下载邮件到用户方计算机。
2.不允许用户在邮件服务器上管理自己的邮件(创建文件夹,进行分类等)
IMAP
1.客户端和服务器上的邮件保持同步,如果不手动删除邮件,那么服务器上的邮件也不会被删除。
2.用户可以在计算机中操控邮件服务器上的邮件
http://www.scr2019.top/blog/12
具体就是:HTTP协议是用于从 Web 服务器传输 html 到本地浏览器的传送协议
URI 统一资源标识符,相当于身份证
URL 统一资源定位符,相当于住址
URI 是URL的子集,URL 在 URI 的基础上增加了定位能力
URI 除了包含 URL,还包含 URN(统一资源名称)
直接引出下面一群知识点
请求报文:cookie信息、请求方式get还是post
响应报文:响应状态码、Cookie信息
100 continue:
200 成功
3xx 重定向
4xx 是客户端请求错误
5xx 是服务器错误
注意:除了3XX,其它都是从00开始的
转发是服务器行为,
重定向是客户端行为。
一般选转发,重定向只有两个应用主要应用场景
1.需要跳转到其它应用
2.提交表单页面,防止表单重复提交(恶意刷新页面,每刷新一次,就重新提交一次)
cookie:
what:cookie 是保存在客户端浏览器里的一种信息载体。
why:用来保存一些站点的用户数据,这样能够为用户定制一些功能,比如免登陆功能。
how:服务器发送的响应报文的首部有一个 set-cookie 字段,客户端在拿到这个响应后把这个字段的内容保存到浏览器中。在客户端再次发送请求同类资源时,就会把 cookie 一起携带在请求中,发送到服务端。
session
what:服务器会给每个浏览器创建一个 session 对象,保存在服务器里。
why:存储在浏览器的 cookie 不安全,可能会有一些 js 脚本能拿到 cookie 的信息,所以存储在服务器更加安全一些。
how:使用 session 维护用户登陆状态如下
用户登陆时,把用户名密码表单,放入 http 请求报文中。
服务器收到后,为其创建一个 session,并创建一个名为 sessionID 的 cookie,sessionID 就映射了服务器里的 session。
客户端收到这个 cookie 后,将其保存起来,把 sessionID 保存在 cookie 里。
客户端之后对同一个服务器进行请求时,会把 cookie 也带上去,服务器收到之后提取出 sessionID,从中读取出用户信息。
区别
1.cookie 存放在客户端,session 存放在服务器端故更安全
2.cookie以键值对的形式存在,可以用来做用户认证,存储上限一般为4K
session中的键值对不在一起:
key值是随机产生的字符串,value值是session的内容,依赖于cookie将每个用户对应的key值保存到浏览器中; session没有具体的大小限制,可以存储的数据量比cookie大;
其他临场发挥:
生命周期:都是可以设置的
作用域:都是可以设置的
URL 重写技术,把 sessionID 直接写到 URL 里传上去就可以了。
短连接:访问一个图很多的网站,如果对每个图建个TCP连接,会耗费大量资源,
长连接:建立一个长时间的连接,在这个连接过程中我可以不断的发请求。
流水线:默认情况下,HTTP 请求是按顺序发的,下一个请求只有在当前请求收到响应之后才会被发出,有点像停止等待协议。
而在收到下一个请求之前,可能需要很长时间。
流水线就是在一个 HTTP 长连接下连续发出请求,不用等待响应返回,减少延迟。
http1.1与1.1与区别
[Expires vs max-age, which one takes priority if both are declared in a HTTP response?
](https://stackoverflow.com/questions/7549177/expires-vs-max-age-which-one-takes-priority-if-both-are-declared-in-a-http-resp)
Expires:绝对时间
Cache-control:max-age:相对时间
分别说说加密、认证、完整性保护是怎么实现的?
助记:认证是怎么认证的,HTTPS传输对称加密的密钥时用的是非对称加密,传输过去之后,用的是对称加密。而我在非对称加密时存在一个问题,就是公钥伪造的问题。
所以就引入了大家都信任的证书颁发机构(Certificate Authority, CA),服务器需要先去找CA认证,CA验明身份后用自己的私钥给服务器的信息(包括服务器的共钥)加密,叫做签名,然后服务器拿到这个证书之后发给客户端,客户端本身就内置了CA的公钥,这样就可以验证服务器的身份了。
SSL 是安全套接字,是用于加密和验证应用程序和Web服务器之间发送数据的协议。用于提供身份验证,HTTPS 的 S 其实指就是 SSL 协议。
1.通过CA体系交换public key
2.通过非对称加密算法,交换用于对称加密的密钥
3.通过对称加密算法,加密正常的网络通信
1.客户端向服务器发起SSL连接请求
2.服务器把自己的证书发给客户端的浏览器。
3.客户端浏览器检查服务器过来的证书是不是 CA 签发的,如果是,就继续执行协议,如果不是,就发出一个警告,询问是否继续。
4.继续协议:从证书中把服务器的公钥拿下来,用公钥加密通信用的对称密钥,发给服务器。
5.服务器用自己的私钥对其解密,拿到对称密钥。
6.接下来就可以进行数据传输,服务器和客户端双方用相同的对称密钥对数据加密,可以保证安全。
select 查询列表 ⑦
from 表1 别名 ①
连接类型 join 表2 ②
on 连接条件 ③
where 筛选 ④
group by 分组列表 ⑤
having 筛选 ⑥
order by排序列表 ⑧
limit 起始条目索引,条目数; ⑨
特点:
①表的顺序可以调换
②内连接的结果=多表的交集
③n表连接至少需要n-1个连接条件
分类:
等值连接
非等值连接(查询员工的工资级别)
自连接(查询员工的上级)
特点:
①查询的结果=主表中所有的行,如果从表有和它匹配的项将显示匹配行,如果从表没有匹配的则显示null(女孩子的男朋友)
②left join 左边的就是主表,right join 右边的就是主表
full join 两边都是主表
③一般用于查询除了交集部分的剩余的不匹配的行
语法:
select 查询列表
from 表1 别名
cross join 表2 别名;
特点:
类似于笛卡尔乘积
嵌套在其他语句内部的select语句称为子查询或内查询
按出现位置分类
select后面:
例:查询每个部门的员工个数:员工表(某些部门可能没有员工)和部门表(全)
二、级联删除[补充]
语法:(delete后面写谁删谁)
delete 别名1,别名2 from 表1 别名
inner|left|right join 表2 别名
on 连接条件
【where 筛选条件】
方式二:使用truncate
语法:truncate table 表名
区别
1.truncate删除后,如果再插入,标识列从1开始
delete删除后,如果再插入,标识列从断点开始
2.delete可以添加筛选条件
3.truncate效率较高
4.truncate没有返回值
delete可以返回受影响的行数
5.truncate不可以回滚
一、修改单表的记录 ★
update 表名 set 字段=值,字段=值 【where 筛选条件】;
二、修改多表的记录【补充】
update 表1 别名
left|right|inner join 表2 别名
on 连接条件
set 字段=值,字段=值
【where 筛选条件】;
drop、delete、truncate
一、创建库
create database 【if not exists】 库名【 character set 字符集名】;
二、修改库
alter database 库名 character set 字符集名;
三、删除库
drop database 【if exists】 库名;
一、创建表 ★
create table 【if not exists】 表名(
字段名 字段类型 【约束】,
。。。
字段名 字段类型 【约束】
)
二、修改表
1.添加列
alter table 表名 add column 列名 类型 【first|after 字段名】;
2.修改列的类型或约束
alter table 表名 modify column 列名 新类型 【新约束】;
3.修改列名
alter table 表名 change column 旧列名 新列名 类型;
4 .删除列
alter table 表名 drop column 列名;
5.修改表名
alter table 表名 rename 【to】 新表名;
三、删除表
drop table【if exists】 表名;
四、复制表
1、复制表的结构
create table 表名 like 旧表;
2、复制表的结构+数据
create table 表名
select 查询列表 from 旧表【where 筛选】;
NOT NULL:非空,该字段的值必填
UNIQUE:唯一,该字段的值不可重复
DEFAULT:默认,该字段的值不用手动插入有默认值
CHECK:检查,mysql不支持
PRIMARY KEY:主键,该字段的值不可重复并且非空 unique+not null
FOREIGN KEY:外键,该字段的值引用了另外的表的字段
主键和唯一
1、区别:
①、一个表至多有一个主键,但可以有多个唯一
②、主键不允许为空,唯一可以为空
2、相同点
都具有唯一性
都支持组合键,但不推荐
外键:
1、用于限制两个表的关系,从表的字段值引用了主表的某字段值
2、外键列和主表的被引用列要求类型一致,意义一样,名称无要求
3、主表的被引用列要求是一个key(一般就是主键)
4、插入数据,先插入主表
5、删除数据,先删除从表
添加约束的时机
创建表时或修改表时
如何合理使用列级约束和表级约束
由于check在SQL中都不管用,外键在列级约束中不管用,我们最好:
1.外键全部都用表级
2.主键,非空,唯一,默认都用列级
自增长列
特点:
1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
auto_increment_increment
如果要更改起始值:手动插入值
如果要更改步长:更改系统变量
set auto_increment_increment=值;
2、一个表至多有一个自增长列
3、自增长列只能支持数值型
4、自增长列必须为一个key
定义
视图(view)是一种虚拟存在的表,只保留了sql逻辑,本身并不包含数据。作为一个select语句保存在数据字典中的。
视图的作用
1.简单:提高了重用性,简化复杂的sql操作,不必知道它的查询细节
3.安全:保护数据,提高安全性
何时能更新视图,不包含下列
➢聚合函数(max,min,avg等分组函数);
➢distinct 子句;
➢group by 子句;
➢having 子句;
➢union 和 union all 子句;
➢外连接
含义:
一组预先编译好的SQL语句的集合,理解成批处理语句
好处:
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
创建 ★
create procedure 存储过程名(参数模式 参数名 参数类型)
begin
存储过程体
end
注意:
1.参数模式:in、out、inout,其中in可以省略
2.存储过程体的每一条sql语句都需要用分号结尾
调用
call 存储过程名(实参列表)
举例:
调用in模式的参数:call sp1(‘值’);
调用out模式的参数:set @name; call sp1(@name);select @name;
调用inout模式的参数:set @name=值; call sp1(@name); select @name;
查看
show create procedure 存储过程名;
删除
drop procedure 存储过程名;
事务就是一组满足 ACID 特性的操作,要么都执行,要么都不执行。
比如转账,
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态,以转账为例,转账动作完成后,两人账户总金额数未变
隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
不是一种平级关系:
1.首先只有满足一致性,事务的执行结果才是正确的。
2.在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。
3.在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。
4.事务满足持久化是为了能应对系统崩溃的情况。
在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题
脏读:
理解:
两个事务都没有结束的时候,在编写事务的阶段产生互相干涉
举例:
在我这个事务执行的过程中,读了其他事务修改未提交的数据。(A给B转账3000,C读B账户,A回滚,C读到的是脏数据)
不可重复读:
理解:
一旦其中一个事务结束提交后,便能对另一个还未结束的事务的字段产生影响
举例:
在我这个事务内,多次读取同一个数据,在读取过程中其他事务对数据做了修改,造成我这个事务前后读到的数据不一样,就是不可重复读。
幻读:
理解:
本质上仍属于不可重复读
第一个事务在编写事务的阶段插入了一些新的行,第一个事务结束提交后会对第二个还未提交的事务产生影响,
举例:
在我这个事务执行的过程中,我多次读取同一段数据,在读取过程中其他事务插入了几行数据,造成我这个事务发现前后读到的数据的行数不一样,好像发生了幻觉一样。
读未提交(READ UNCOMMITED):
什么都不解决。
读已提交(READ COMMITED):
可以解决脏读问题。
可重复读(REPEATABLE READ):
可以解决脏读和不可重复读问题。
可串行化(SERIALIZABLE):
可以解决所有问题。
orcael:
支持的 2 种事务隔离级别,READ COMMITED(默认为第二种), SERIALIZABLE
sql:
支持 4 种事务隔离级别,默认的事务隔离级别为第三种: REPEATABLE READ
封锁的类型以及粒度,两段锁协议,隐式和显示锁定。
文档:01. xxx 乐观锁 悲观锁http://note.youdao.com/noteshare?id=82024ead03a7d24c5ae7f2ccdd876ef0&sub=6B0F4CE5E6BA46EABFED209C0DBCB2FA
当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制
首先说为什么需要范式,范式是用来干什么的?(其实范式就是用来约束数据库表的创建原则的,不能随心所欲的创建,需要满足一定的要求)(如果不满足,就会出现很多增删改查上的错误)(举个例子,有一张表学生号和课程号作为主键,学生姓名、课程名字、课程成绩作为非主属性的表发生 冗余信息、插入错误、删除错误、更改错误)
第一大范式:不可分割
第二大范式:非主属性完全函数依赖于主键(还拿刚才那张表来讲,学生号推出 xxx 学生号 + 课程号 确认成绩 两个主键确认课程成绩)学生姓名部分依赖于主键,所以可以对表进行拆分,拆成两张表。
第三大范式:非主属性不传递函数依赖于主键,比如我现在来了个表。(学生号、学生名、学院名、院长名)院长名就是传递函数依赖于学生号,可以对表进行拆分。
MySQL不香吗,为什么还要noSQL?https://zhuanlan.zhihu.com/p/136257627
提纲:下面是答案,不要看。
why?
mysql底层用的什么?
和B对比、和hash对比、和红黑对比
用B+优缺点
最佳实践,不能给所有的都创建
InnoDB 的两种索引机制,回表操作
哪些操作会使得索引失效呢?
首先你要说索引是干什么的?(是一种数据结构,可以加快我们的检索速度)
然后直接点出MySQL的底层默认是InnoDB引擎,用的是B+树索引
和B树做比较
和hash索引
和红黑树比较
用了B+树做索引有什么优缺点?
最佳实践是什么?
MySQL 的 InnoDB 两种索引,回表操作
哪些操作会使索引失效?
% 开头的like
A:可以把相关数据保存在一起,如:实现电子邮箱时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少量的数据页就能获取某个用户全部邮件,如果没有使用聚集索引,则每封邮件都可能导致一次磁盘IO
B:数据访问更快,聚集索引将索引和数据保存在同一个btree中,因此从聚集索引中获取数据通常比在非聚集索引中查找要快
B:更新耗费时间:创建索引和维护索引的时候,需要耗费一定的时间,对表中数据进行增删改的时候,数据改了索引也得跟着改。
默认是第三个级别:可重复读
MVCC 多版本并发控制,实现提交读和可重复读这两种隔离级别。
幻读问题靠 MVCC+next-key locks 解决,具体就是加行锁和间隙锁来锁定一段表,可以解决幻读的问题
只知道 InnoDB 支持事务,MyISAM 不支持事务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。