哈希算法以及哈希冲突
哈希算法:将任何长度的输入通过散列函数转换成固定长度的字符串
哈希冲突:不同的输入经过哈希函数处理后得到相同的哈希值
因为哈希函数的输出域是有限的
解决哈希冲突:
1. 开放寻址:产生哈希冲突后,寻找一个空闲位置存储新的元素
2. 链地址法:哈希表的每个槽位是一个链表,新元素与现有元素发生冲突,可以存储在同一个槽位的链表中
Python 和 Cpp的区别
python是脚本语言,解释执行;cpp是编译语言,编译后在特定平台运行
python用缩进来区分不同的代码块;cpp用花括号进行区分
cpp需要事先定义变量类型;python不需要
python的库函数比cpp多,调用更方便
Linux的kill和kill -9的命令区别
kill是发送TERM信号,kill -9是发送KILL信号
kill是软终止信号,告诉进程尽快停止运行,允许进程进行清理动作
kill -9是硬终止信号,立刻停止运行,不做清理和恢复资源机会
TCP粘包的问题和解决方案
粘包:TCP为了保证效率,将发送端的数据粘合在一起,作为一个整体发送,接收端需要进行拆分;如果应用层不处理粘包,会导致无法解析出正确消息
解决方案:
1. 固定长度:每个消息都是固定长度,但浪费带宽
2. 定界符:在消息尾部加上特殊符号
3. 长度字段:在消息的头部加上数据长度的字段,根据长度来读取数据
用户态和内核态
处理器运行在不同的权限级别,定义CPU访问资源的权限级别
用户态:用户运行的应用程序(文本编辑器、游戏);防止直接操作硬件;通过系统调用的方式向操作系统请求服务(读写文件、请求网络资源)
内核态:CPU可以执行任何指令并访问所有资源;负责系统任务,如管理内存、处理中断和异常、输入输出;用户发起请求,CPU进行切换态
例子:
用户进行读取文件、网络通信、设备访问,通过系统调用接口来请求内核服务,从而涉及到用户态到内核态的上下文切换
- 应用程序执行系统调用。
- CPU 从用户态切换到内核态。
- 内核执行所请求的任务。
- 任务完成后,内核返回结果,并将 CPU 切回用户态。
- 应用程序继续执行。