一些小的知识点补充

文章目录

  • NIO
  • IO流
  • 进程结构及说明
  • 操作系统中线程的实现
  • HashMap中的主要函数
  • 响应报文:状态码
  • Linux常用命令
      • 找到tomcat进程杀掉
      • 文件管理
      • 文档编辑
      • 文件传输
      • 磁盘管理
      • 网络通讯
      • 系统管理
      • 系统设置
      • 备份压缩

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 开销高

你可能感兴趣的:(java)