文章目录
NIO
核心组件:
-
Selector: 多路复用器,轮询检查多个 Channel 的状态,判断注册事件是否发生,即判断 Channel 是否处于可读或可写状态。使用前需要将 Channel 注册到 Selector,注册后会得到一个 SelectionKey,通过 SelectionKey 获取 Channel 和 Selector 相关信息。
-
Channel: 双向通道,替换了 BIO 中的 Stream 流,不能直接访问数据,要通过 Buffer 来读写数据,也可以和其他 Channel 交互。
-
Buffer: 缓冲区,是一块可读写数据的内存。Buffer 三个重要属性:position 下次读写数据的位置,limit 本次读写的极限位置,capacity 最大容量。
flip
将写转为读,底层实现原理把 position 置 0,并把 limit 设为当前的 position 值。clear
将读转为写模式(用于读完全部数据的情况,把 position 置 0,limit 设为 capacity)。compact
将读转为写模式(用于存在未读数据的情况,让 position 指向未读数据的下一个)。- 通道方向和 Buffer 方向相反,读数据相当于向 Buffer 写,写数据相当于从 Buffer 读。
使用步骤:向 Buffer 写数据,调用 flip 方法转为读模式,从 Buffer 中读数据,调用 clear 或 compact 方法清空缓冲区。
IO流
进程结构及说明
结构 | 说明 |
---|---|
进程控制块 PCB | 进程存在的唯一标识,包括进程描述信息、控制信息、资源分配信息等。 |
程序段 | 能被进程调度到 CPU 执行的代码。 |
数据段 | 进程对应的程序加工处理的原始数据。 |
操作系统中线程的实现
内核级线程 1:1 实现
内核通过操纵调度器对线程进行调度,并将线程的任务映射到处理器上。程序一般不会直接使用内核线程,而是使用内核线程的一种高级接口,轻量级进程,即通常意义上的线程。
优点:当一个线程被阻塞时,允许其他线程继续执行。
缺点:代价相对较高,需要在用户态和内核态来回切换。
用户级线程 1:N 实现
从广义上讲,一个线程只要不是内核线程,就可以认为是用户线程。狭义上的用户线程指的完全建立在用户空间的线程库上,系统内核不能感知到用户线程的存在及其是如何实现的。
优点:由于线程管理在用户空间进行,不需要切换到内核态,开销小,支持大规模并发。
缺点:一个线程在使用内核服务时被阻塞,整个进程都会被阻塞。
混合方式 N:M 实现
混合模式下既存在用户线程,也存在轻量级进程。用户线程完全建立在用户空间中,因此开销依然很小,可以支持大规模并发。轻量级进程作为用户线程和内核线程之间的桥梁,使用内核提供的线程调度功能及处理器映射,降低整个进程阻塞的风险。
HashMap中的主要函数
JDK8 之前 | JDK8 | |
---|---|---|
hash计算元素 key 的散列值 | ① 处理 String 类型时,调用 stringHash32 方法获取 hash 值。 ② 处理其他类型数据时,提供一个随机值 hashSeed 作为计算初始量,执行异或和无符号右移使 hash 值更加离散。 | 如果 key 为 null 返回 0,否则就将 key 的 hashCode 方法返回值高低16位异或,让尽可能多的位参与运算,让结果的 0 和 1 分布更加均匀,降低哈希冲突概率。 |
indexFor计算元素下标 | 将 hash 值和数组长度-1 进行与操作,保证结果不超过 table 范围。 | 同样的操作 |
get 获取元素value值 | key 为 null,调用 getForNullKey 方法:size=0表示链表为空,返回 null。size!=0说明存在链表,遍历 table[0] 链表,如果找到了 key=null 的节点则返回其 value,否则返回 null。key 不为 null ,调用 getEntry 方法:size=0表示链表为空,返回 null 值。size!=0,首先计算 key 的 hash 值,然后遍历该链表的所有节点,如果节点的 key 和 hash 值都和要查找的元素相同则返回其 Entry 节点。 如果找到了对应的 Entry 节点,调用 getValue 方法获取其 value 并返回,否则返回 null。 | 调用 getNode 方法获取 Node 节点:如果数组不为空且存在元素,先比较第一个节点和要查找元素,如果相同则直接返回。如果第二个节点是 TreeNode 类型则调用 getTreeNode 方法进行查找。都不满足,遍历链表根据 hash 和 key 查找,如果没有找到就返回 null。如果节点不是 null 就返回其 value,否则返回 null。 |
put | key 为 null,直接存入 table[0]。key 不为 null,计算 key 的 hash 值,调用 indexFor 计算元素下标 i,再遍历 table[i] 链表:key 已存在,更新 value 然后返回旧 value。key 不存在,将 modCount 加 1,调用 addEntry 方法增加一个节点并返回 null。 | 如果是数组,调用 putVal 方法添加元素:如果 table 为空或不存在元素就进行扩容,否则计算元素下标位置,不存在就调用 newNode 创建一个节点。如果存在元素且是链表类型,如果首节点和待插入元素相同,直接更新节点 value。如果首节点是 TreeNode 类型,调用 putTreeVal 方法增加一个树节点,每一次都比较插入节点和当前节点的大小,待插入节点小就往左子树查找,否则往右子树查找,找到空位后执行两个方法:balanceInsert 方法,插入节点并调整平衡、moveRootToFront 方法,由于调整平衡后根节点可能变化,需要重置根节点。如果都不满足,遍历链表,根据 hash 和 key 判断是否重复,决定更新 value 还是新增节点。如果遍历到了链表末尾则添加节点,如果达到建树阈值 7,还需要调用 treeifyBin 把链表重构为红黑树。存放元素后将 modCount 加 1,如果 ++size > threshold ,调用 resize 扩容。 |
resize | 当前容量达到了最大容量,将阈值设置为 Integer 最大值,之后扩容不再触发。当前容量没达到最大容量,计算新的容量,将阈值设为 newCapacity x loadFactor 和 最大容量 + 1 的较小值。创建一个容量为 newCapacity 的 Entry 数组,调用 transfer 方法将旧数组的元素转移到新数组。 | 重新规划长度和阈值,如果长度发生了变化,部分数据节点也要重新排列。① 如果当前容量 oldCap > 0 且达到最大容量,将阈值设为 Integer 最大值,终止扩容。② 如果未达到最大容量,当 oldCap << 1 不超过最大容量就扩大为 2 倍。③ 如果都不满足且当前扩容阈值 oldThr > 0 ,使用当前扩容阈值作为新容量。④ 否则将新容量置为默认初始容量 16,新扩容阈值置为 12。重新排列数据节点① 如果节点为 null 不进行处理。② 如果节点不为 null 且没有 next 节点,通过节点的 hash 值和 新容量-1 进行与运算计算下标存入新的 table 数组。③ 如果节点为 TreeNode 类型,调用 split 方法处理,如果节点数 hc 达到 6 会调用 untreeify 方法转回链表。④ 如果是链表节点,需要将链表拆分为 hash 值超出旧容量的链表和未超出容量的链表。对于hash & oldCap == 0 的部分不需要做处理,否则需要放到新的下标位置上,新下标 = 旧下标 + 旧容量。 |
transfer | 遍历旧数组的所有元素,调用 rehash 方法判断是否需要哈希重构,如果需要就重新计算元素 key 的 hash 值。调用 indexFor 方法计算元素存放的下标 i,利用头插法将旧数组的元素转移到新数组。 |
响应报文:状态码
状态码 | 短语 | 含义 |
---|---|---|
200 | OK | 成功响应 |
301 | Moved Permanently | 请求对象已被永久转移,新的 URL 定义在响应报文的首部行,客户端将自动获取。 |
302 | Found | 与301类似,但资源只是临时被移动,客户端继续使用原有 URL。 |
400 | Bad Request | 通用的差错代码,请求不能被服务器理解。 |
401 | Unauthorized | 未认证,缺乏相关权限。 |
402 | Payment Required | 保留,将来使用。 |
403 | Forbidden | 服务器理解客户端的请求,但是拒绝执行。 |
404 | Not Found | 被请求的文档不在服务器上,有可能因为请求 URL 出错。 |
405 | Method Not Allowed | 客户端中请求的方法被禁止,例如限制 POST 方式但使用了 GET 访问。 |
500 | Internal Server Error | 服务器内部错误,无法完成请求。 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求。 |
502 | Bad Gateway | 作为网关或代理工作的服务器尝试执行请求时,从远程服务器收到了一个无效响应。 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时无法处理客户端的请求。 |
504 | Gateway Timeout | 充当网关或代理的服务器,未及时从远端服务器获取请求。 |
505 | HTTP Version Not Supported | 服务器不支持请求报文使用的 HTTP 版本。 |
Linux常用命令
找到tomcat进程杀掉
执行ps -ef |grep tomcat 输出如下
sun 5144 1 0 10:21 pts/1 00:00:06 /java/jdk/bin/java
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.endorsed.dirs=/java/tomcat/common/endorsed -classpath
:/java/tomcat/bin/bootstrap.jar:/java/tomcat/bin/commons-logging-api.jar
-Dcatalina.base=/java/tomcat -Dcatalina.home=/java/tomcat
-Djava.io.tmpdir=/java/tomcat/temp
org.apache.catalina.startup.Bootstrap
start
说明tomcat已经正常启动, 5144 就为进程号 pid = 5144
杀死kill -9 5144
文件管理
命令 | 含义 |
---|---|
cat | 查看文件,一次性显示全部文件 |
chgrp | 变更文件或目录的所属群组 |
chmod | 更改文件权限,ugoa 分别表示拥有者、同组、其他人、所有人; rwx 分别表示可读、写、执行。 |
chown | 更改文件拥有者,一般只有系统管理者 root 才有此权限 |
cmp | 比较两个文件是否有差异 |
file | 辨识文件类型 |
find | 在指定目录下查找文件,-type 指定文件类型、-name 指定文件名 |
ln | 为文件在其它位置建立同步链接,软链接类似于 Windows 的快捷方式;硬链接以文件副本的形式存在,不占用实际空间 |
less | 查看文件,和 more 类似,查看前不会加载整个文件 |
more | 查看文件,以页的形式查看文件,按空格显示下一页,b 显示上一页 |
mv | 为文件和目录改名或移动 |
rm | 删除文件或目录 |
touch | 修改文件或者目录的时间属性 |
which | 查找文件 |
whereis | 查找文件,只能查找二进制文件、源代码和 man 手册,一般文件的定位需要用 locate |
cp | 复制文件或目录 |
read | 从标准输入读取数值 |
文档编辑
命令 | 含义 |
---|---|
ed | 最简单的文本编辑程序,一次只能编辑一行 |
egrep | 在文件内查找字符串 |
grep | 查找文件中的字符串 |
look | 查询单词 |
sort | 对文本文件内容排序 |
文件传输
命令 | 含义 |
---|---|
ftp | 文件传输 |
bye | 中断 ftp |
uuto | 将文件传送到远端的 UUCP 主机 |
磁盘管理
命令 | 含义 |
---|---|
cd | 切换当前工作目录 |
df | 显示文件系统磁盘使用情况 |
mkdir | 创建目录 |
tree | 以树状图列出目录内容 |
rmdir | 删除空目录 |
ls | 显示工作目录下的内容 |
网络通讯
命令 | 含义 |
---|---|
telnet | 远端登录 |
netconfig | 设置网络环境 |
nc | 设置路由器 |
httpd | Apache 的 HTTP 服务器程序 |
ifconfig | 显示或设置网络设备 |
netstat | 显示网络状态 |
ping | 使用 ICMP,若远端主机无问题会得到回应 |
tty | 显示终端机连接标准输入设备的文件名称 |
write | 传信息给其它使用者 |
系统管理
命令 | 含义 |
---|---|
adduser | 新增使用者账号 |
date | 显示或设定系统日期 |
exit | 退出目前的 shell 终端 |
sleep | 将目前动作延迟一段时间 |
kill | 删除执行中的程序或工作,1 重新加载进程、9 杀死进程、15 正常停止进程 |
ps | 显示当前进程的状态,-A 列出所有进程、-u 指定用户 |
whois | 查找并显示用户信息 |
whoami | 显示自身用户名称 |
who | 显示系统中在线的使用者 |
shutdown | 关机,-r 重新启动、-c 取消关机、-n 立即关机 |
top | 实时显示进程状态,-n 设置更新次数、-d 设置更新时间、-p 指定进程号 |
系统设置
命令 | 含义 |
---|---|
clear | 清除屏幕 |
rpm | 管理套件 |
passwd | 更改使用者密码 |
time | 测量指令消耗的时间和资源 |
备份压缩
命令 | 含义 |
---|---|
zip/unzip | 压缩文件/解压缩,兼容 Linux 与 Windows,可以压缩多个文件或目录 |
gzip/gunzip | 压缩文件/解压缩 gzip 文件,压缩单个文件,压缩率相对低,CPU 开销低 |
tar | 将多个文件打包成一个并压缩 |
xz/unxz | 压缩/解压缩 xz 文件,压缩单个文件,压缩率高,时间相对长,解压快,CPU 开销高 |