一、操作系统
进程
定义:程序的一次执行,是程序在数据集上运行的过程,在传统操作系统中是资源分配和调度的一个独立单位
结构:PCB – 程序段 – 数据段
特征:动态性 – 并发性 – 独立性 – 异步性
状态:就绪态-阻塞态-执行态;挂起态-创建态-终止态
挂起与阻塞的区别:主动/被动;释放cpu/不释放;系统调度唤醒/resume为阻塞
同步机制:空闲让进-忙则等待-有限等待-让权等待
通信方式:共享存储器 – 消息传递 – 管道 – 消息缓冲队列
如何理解进程与线程:一开始的时候操作系统中的程序是无法并发的执行,为了实现这个目的,就引入了进程的概念,以其作为资源分配以及调度的基本单位,从而能把程序拆分为多个进程或为多个程序创建进程,让这些进程并发的执行,从而提高计算机的资源利用率和吞吐量。但是由于进程拥有自己的资源,导致调度的时候开销过大,一次就引入比进程更小的线程,作为系统调度的基本单位,而进程则仅为资源分配的基本单位。Balabla线程进程的关系。
线程
定义:为解决进程开销大问题,引入作为系统调度的基本单位
与进程的关系:是进程的一部分;不同进程间调度会改变;共享进程资源;系统调度基本单位/资源分配单位
优点:响应快;上下文切换快;吞吐量++;多核利用;资源共享
通信:互斥锁;条件变量;信号量机制
协程
定义:比线程更轻,被成为微线程
特点:单线程执行,切换开销小 ;不需要锁防冲突
中断
定义:外部事件使得cpu暂停
处理过程:1、保存现场;2、分析原因;3、调用处理程序;4、继续执行;
原因:io异常;时钟中断;硬件故障
异常
定义:内部事件使得cpu暂停
原因:系统调用;缺页;程序性异常
死锁
产生条件:1、互斥条件;2、请求保持;3、不可剥夺;4、环路等待
解决方法:1、预防死锁;2、避免死锁;3、死锁检测
产生原因:1、资源抢占;2、程序推进顺序
二、测开相关内容
测试计划如何写
1. 测试范围
2. 测试策略
3. 资源安排
4. 进度安排
5. 发布标准
6. 风险预防
测试概念
Ø 类别:黑盒测试[等价类划分,边界值,因果图];白盒测试[语句覆盖,条件覆盖,分支覆盖,多分支覆盖]
测试用例设计
字符型:必填 / 空格 / 字段唯一性 / lenth / 特殊字符
数值型:range / size / 非数值 / 负数 / 首位0
日期型:月 / 日 / 闰年 / 非法格式 / 非法字符
接口测试:1、参数[接口文档正确性;缺少必填;缺少可选;名称非法;参数越界;参数类型];2、环境[操作系统;网络;设备];3、性能[响应时间;吞吐量;并发数;服务器资源];4、安全[加密;sql注入xss攻击]
三、计算机网络
网络七层协议
1. 应用层:直接提供服务 - http
2. 表示层:处理发送信息格式 – telnet
3. 会话层:组织进程通信 – dns / smtp
4. 传输层:提供进程间的逻辑通路– tcp / udp
5. 网络层:提供主机间的通讯通路– ip / icmp / arp / igmp / rip / ospf / bgp
6. 数据链路层:相邻节点通信 – ppp / csma\cd
7. 物理层:在物理媒介上传送比特流
四层协议
1. 应用层
2. 传输层
3. 网络层
4. 数据链路层
TCP
Ø 可靠传输的实现:滑动窗口 – 超时重传 – 选择确认
Ø 拥塞控制:慢开始 – 拥塞避免 – 快重传 – 快恢复
Ø 3次握手:1 – 发送SYN要建立,客户端进入SYNsent 2 – 发送ack,SYN允许建立-服务器进入SynRecived 3发送ack收到 – 一起estabListen
Ø 3次而非2/4 :超时又来 / 提高效率
Ø 4次握手:1 – 发送fin发完辣finWait1;2-发送ack知道了closeWait;0-发送未发完信息;3-fin发完辣lastACK;4-发送ack晓得timeWait
Ø 4次之后wait:1、确保送达;2、防止失效出现在下次中
Ø 与udp区别:可靠/不可靠;连接/无连接;字节/报文;开销大/小
IP
ARP:ip转化mac。网内广播,分组转发算法
RIP:基于距离向量选路,简单,但限制网络范围
OSPF:使用泛洪法,监控全局链路。先确定可达,再同步。Dijkstra
ICMP:用来报告差错和异常。如:ping测试主机连通。
IGP:自治系统内部使用的路由选择协议
EGP:不同自治系统的选路协议
BGP:发言人通过tcp,利用bgp会话沟通信息。
计网算法
分组转发算法:若在同一个网络中,则直接发送,否则根据路由表发送
距离向量算法:固定30s与相邻交流,目标路由距离减则更新路由表,3m无更新变不可达
http
特性:1、基于请求和响应;2、简单快速,灵活;3、无连接;4、无状态
无连接:早期网络传输突发性、瞬时性、通道空闲,因此每次只处理一个请求。
无连接解决:keep-live
无状态:为了避免服务器占用,对事务处理没有记忆能力,不会记录任何信息
无状态解决:cookie和session[通过id读取]
Cookie和session区别:客户端/服务器;有限制/无限制;直接查找篡改/加密存在服务器中;关闭浏览器消失/存在于服务器一段时间,消耗资源;
https:http + 加密 + 认证 + 完整性保护
加密过程:1、服务器公钥发给CA机构;2、CA用私钥签署签名发证书;3、服务器发送证书给客户端,客户端向CA查询身份;4、客户端用公钥加密发送;5、服务器用私钥解密
非对称加密和对称区别:1、加密解密过程[同一个,公私];2、速度;3、安全性
SSL通信过程:1、tcp;2、客户端hello;3、服务器hello;4、服务器certificate证书报文;5、客户端检查后发key change,包含随机密码;6、客户端发送change cipher sp报文告诉服务器密钥变了;7、客户端finish,来校验;8、服务器change cipher,表示同意;9、服务器发送finish校验;10、http请求;总结:交流密码的过程。
浏览器输入url发生:1、先进行dns解析,确定ip;2、http生成请求报文;3、建立tcp连接,且分组;4、通过ip在网络中寻找对方;5、服务器收到,重组报文;6、服务器处理信息,用tcp返回。
状态码:1xx通知信息[100continue继续发];2xx成功[200正常处理;204找不到;206范围请求];3xx重定向[301永久重定向;302临时重定向;303提醒用get重;304不符合请求条件;307临时重定向];4xx客户端错[400请求错误;401需要http认证;403不允许访问;404找不到资源];5xx服务器错[500服务器错误;503服务器繁忙]
请求类型:optione;get;head;post;put;delete;trace;connect
Get / post区别:可缓存/不可;保留历史参数/不留;信息可见不安全/较安全;长度限制/不限制
各版本http区别:1.0与1.1 – 持续连接 ; 1.1与2.0 – 速度提升、头部压缩、二进制传送、服务器主动发、连接多路复用。
Uri和url区别:uri-统一资源标识符 > url-统一资源定位符;均定义了资源,url定义了如何访问,且需绝对。
DNS
过程:1、检查浏览器中缓存;2、检查操作系统内缓存;3、请求本地域名服务器,递归查询;4、本地请求根服务器,迭代查询;5、找到ip后自己缓存
四、数据库
Mysql
索引:B+树,将所有关键词放在叶子节点,非叶子做索引,且所有节点都形成了自小而大的链表
B+树优点:1、查询i/o更少;2、查询效率更高且稳定;3、遍历效率高
B+树缺点:产生大量随机io,导致数据迁移和空间碎片
Innodb和myisam区别:数据既索引/索引数据分离;在索引中找/先索引后文件[行号];四种行格式/记录头+记录;支持事务外键/不支持
范式:1-属性不可再分;2-消除部分依赖;3-消除传递依赖;4-消除多值依赖;
异常:插入;删除;数据冗余;修改异常
优点:支持复杂查询;需要复杂事务的场景
事务问题:脏读;不可重复读;幻读;
事务等级:1、读未提交;2、读提交;3、可重读;4、可串行化
Acid特性:1、原子性;2、一致性;3、隔离性;4、持久性
Redis
定义:c写的一个key-value内存数据库
持久化:RDB-快照形式定时把内存中的数据保存在文件中-效率更高,占用更少 ;AOF-把所有对redis的修改命令都存在文件中-更完整
过期处理:1、定时删除;2、惰性删除;3、定期删除
淘汰策略:lru[过期/不过];ttl;random[过期/不过];noeviction
适用:缓存;消息队列;过滤器
数据类型:string[基本类型]、hash[key-value集合]、list[双向链表]、set[无序不重的hashtable]、sort set[hash map和跳表实现]等
五、算法
排序算法:冒泡排序;快速排序;插入排序;希尔排序;选择排序;堆排序;归并排序;计数排序;桶排序;基数排序
红黑树:外部节点都是黑;根为黑;红只有黑孩子;外部节点到根黑路径相同
B树
哈希冲突:1、开放地址法[线性散列、二次探测、随机再散列];2、再hash法;3、链地址法;4、公共溢出区
六、Python
闭包定义:内部函数调用了外部定义的变量,在定义外的环境也能运行
闭包特点:引用变量与具体闭包有关,各个闭包实例不干扰;修改会被传递到下次调用
闭包陷阱:使用循环变量或后序会发生变化的变量可能导致不期望的变化
参数传递:脚本中传参[1、sys.argv以数组方式提取;2、parse库解析];函数传参[通过引用传参,偏向于c++的指针,赋值时对象若在直接指向,否则创建一个再指向]
装饰器:在不影响原有功能的基础上添加额外的功能
迭代器:时一种遍历集合的方式,作为一种适配器方便不关注底层容器去访问数据
垃圾回收:1、默认用引用计数;2、标记清除;3、分代回收
字符串连接:格式化 - % / format;拼接 - +/join;插值 – {}
Json处理:json库,loads解码与dump编码
Python2和python3区别:<>/无;除法返回整数/都可;无bool/有;long/无;ascii/utf-8;print不用()/要;
Python多线程:threading;multiprocessing;aiohttp
可变不可变变量:可变 - 列表/字典[不变地址变值];不可变 – 数字/字符串/元组[值变地址变]
深拷贝/浅拷贝:单纯拷贝地址,改变其中一个对象两者同时变;深-考虑到数据结构拷贝值
Lambada:lambda_i=i:i*i
GIL锁:同一时刻只有一个线程在运行,对io密集型友好;python使用tick计数而py3则用计时器,对cpu密集型更好;ticks结束或io时切换;通过使用多进程解决
线程池:减少线程的创建和销毁,提高了效率方便管理
七、C++
虚函数:方便实现动态多态,在编译时动态绑定
Sizeof/strlen:编译时计算/运行时计算;参数任何都可/参数为指针
内存对齐:数据在内存中的地址应当是其数据项大小的整数倍,结构与联合体内部以及本身都需要进行对齐,此时为最长成员的倍数;提高cpu内存的访问速度;可通过#pragma pack(4)修改
内存覆盖:当数组越界访问的时候可能会造成覆盖;malloc申请过小,赋值时占用;memcpy复制过大的字符串
内存泄漏:主要是new出的空间没有被释放,1、new与delete没有配对;2、数组delete没有用delete[];
与java区别
内存分配/回收:分配【静态区-编译时就分好/栈-局部变量/堆-动态分配】,c++没有自配GC
指针/引用区别:指针有自己的内存空间,引用只是别名;指针可null/不可 ;可变/不可
Const/define区别:带类型/不带类型;编译运行阶段起作用/编译预处理;需要进行判断/直接替换;占用数据段/占用代码段;不能重定义/#undef
Static:存放于全局静态数据区,随第一调用而初始化,此后都不再初始化,静态全局只能在文件内使用,局部只能在局部中使用。对类来说,静态成员跟函数都属于类,而非具体对象。
Extern:可以置于变量或函数前,表示定义在别的文件中,编译器也会在别的模块中寻找。
C++与c区别:新增对象、继承、多态、虚函数、重载、引用、泛型编程、名称空间
Struct与class区别:默认成员和继承public/private;不可定义模板参数/可;按照声明顺序存储/不保证连续;union-存储连续,无法继承
重写和重载的区别:通常是函数名相同,参数列表不同,编译器根据不同的参数列表为相同的函数名称修饰成一些不同的预处理函数 / 重写通常在继承关系中出现,基类需要虚 / 重定义是继承中,重定义了与父不同参数的同名函数,把基类的其他重载隐藏
八、Linux
常用命令:find / ls / pwd / cd / mkdir / rm / mv /cp /cat / less / more / grep / sed / vim / tar / kill / crontab / man / ping /top / free /netstat / ps
体系结构:用户空间[应用程序、c库] / 内核空间[系统调用接口、内核]
通信方式:管道、信号、消息队列、共享内存、信号量
链接方式:软链接[创建一个新文件,指向link的那个文件];硬链接[通过inode链接,在目录的block内多写入一个关联数据,不能跨filesystem]
磁盘阵列:多个较小的磁盘合成一个大磁盘,等量模式 – 映射模式 – 等量和映射杂糅
全部评论
(6) 回帖