DBIS的21天学习打卡系列活动,此篇将记录这期间学习的计算机网络和操作系统。琦琦学长发钱了,冲啊!
感谢杀哥引路JavaGuide
5.15 计算机网络
- OSI与TCP/IP各层的结构和功能
- 应用层通过应用进程间的交互来完成特定网络应用,应用层协议定义应用进程间通信和交互的规则(HTTP、SMTP、DNS)
- 运输层负责向两台主机进程间的提供通用的数据传输服务(复用和分用,TCP,UDP)
- 网络层选择合适的网间路由和交换节点,发送数据报
- 数据链路层将网络层交下来的IP数据报封装成帧,包含必要的控制信息,如差错控制,在相邻节点的链路上传送帧
- 物理层实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异
- TCP三次握手,为了建立可靠的通信信道,确认自己与对方的发送与接收是正常的
- 四次挥手
- TCP与UDP协议的区别
- TCP协议可靠性传输的保证:1. 数据分隔 2.包编号 3.校验和 4.丢弃重复数据 5.流量控制(滑动窗口)6.拥塞控制 7.ARQ协议 8.超时重传
- ARQ(自动重传请求)协议包括停止等待ARQ:发送完一个分组就停止发送,等待对方确认,一段时间内没有收到确认信息则重新发送。连续ARQ协议:发送方维持发送窗口,接收方累计确认,重传需要Go-Back-N
- TCP利用滑动窗口实现流量控制,接收方发送的确认报文中的窗口字段可以用来控制
- 拥塞控制防止过多数据注入到网络中,TCP发送方维持一个拥塞窗口,采用慢开始(从1开始,每次加倍)、拥塞避免(每经过一个往返cwnd加1)、快重传(三次重复ACK)和快恢复(拥塞窗口一半加3)
- 从输入URL到显示主页的过程主要是:1.DNS解析 2.TCP连接 3.发送HTTP请求 4.服务器处理请求并返回HTTP报文 5.浏览器解析渲染页面 6.连接结束
- 状态码
- 各种协议与HTTP协议的关系
- HTTP/1.0默认使用短连接,HTTP/1.1起默认使用长连接,连接时间可以在服务器软件中设定
- HTTP是一种无状态(stateless)协议,但服务端可以通过Session来记录用户状态,如购物车。大多数情况下通过在Cookie中附加一个Session ID来跟踪
- Cookie一般在客户端保存用户信息,如保持用户登录状态;Session主要通过服务端记录用户状态。相对来说Session安全性更高
- HTTP 1.1相比于1.0使用长连接,新增了24个错误状态响应码,引入了更多的缓存控制策略,允许只请求资源的某个部分
- URI是统一资源标识符,可以唯一标识一个资源。URL是统一资源定位符,是一种具体的URI,不仅唯一标识资源还提供了定位该资源的信息
- HTTP默认端口80,HTTPS默认端口443。HTTP运行在TCP之上,传输明文,HTTPS运行在SSL/TSL上,SSL/TLS运行在TCP之上,传输内容经加密,安全性更高,但是耗费更多服务器资源
5.16 操作系统
- 操作系统是管理计算机硬件和软件组资源的程序,屏蔽了硬件层的复杂性
- 运行在用户态的用户程序在进行系统态级别的资源有关操作时,需要通过系统调用方式向操作系统提出服务请求,如设备管理、文件管理、进程控制、进程通信、内存管理
- 线程是进程划分的更小运行单元,一个进程可以产生多个线程。各进程基本上是独立的,各线程则不一定。在JVM中,多个线程共享进程的堆和方法区,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈。线程执行开销小,但不利于资源的管理和保护,进程则相反
- 进程有创建、就绪、运行、阻塞、结束五种状态
- 进程间的通信方式有管道/匿名管道、有名管道、信号、消息队列、信号量、共享内存、套接字
- 线程间同步的方式有互斥量、信号量、事件(Wait/Notify)
- 进程调度有先到先服务调度算法、短作业优先调度算法、时间片轮转调度算法、多级反馈队列调度算法、优先级调度
- 死锁指有时进程申请的资源被其他等待进程占有,那么该等待进程可能再也无法改变状态
- 死锁的四个必要条件:互斥、占有并等待、非抢占、循环等待
- 操作系统内存管理主要负责内存的分配与回收,另外还有逻辑地址到物理地址的转换
- 操作系统内存管理简单分为连续分配管理方式和非连续分配管理方式两种,前者有块式管理(将内存分为几个固定大小的块,每个块中只包含一个进程),后者有页式管理(划分成更小的页)和段式管理(按照逻辑信息将主存划分成段),还有段页式管理机制,先分段后分页
- 快表加速虚拟地址到物理地址的转换,可以理解为一种特殊的高速缓存。多级页表目的是避免把全部页表都放在内存中占用空间,属于时间换空间的典型场景。都利用到了程序的局部性原理
- 分页和分段机制都是为了提高内存利用率,减少内存碎片,且分配离散、内部连续。页面大小固定,段大小不固定。分页满足操作系统内存管理需求,分段能更好满足用户需求
- 逻辑地址由操作系统决定,物理地址是真实物理内存中的地址
- MMU将虚拟地址翻译为物理地址来进行虚拟寻址,使用虚拟地址空间更安全,彼此隔离,并且使得程序可以使用大于可用物理内存的虚拟内存(存储在外部磁盘存储器上)
- 局部性原理:时间局部性和空间局部性
- 页面替换算法:最佳页面置换算法(未来最长时间不使用),FIFO页面置换算法(淘汰最先进入内存的页面),LRU页面置换算法(最近最久未使用),LFU页面置换算法(之前时期最少使用的页面)
5.17 Linux
- 求助:
--help
,man
- 关机:
1
2
3who # 查看有没有其他用户在线
sync # 内存数据同步到磁盘
shutdown - 文件系统;inode,block,superblock,block bitmap
- inode大小有限,而block太多,因此引入了间接、双间接、三间接引用
- 获取文件内容
1
2
3
4
5
6cat # 取得文件内容
tac # 从最后一行开始打印
more # 一页一页查看文件内容
less # 与more类似,但可以向前翻页
head [-n number] filename # 取得文件前几行
tail # 取得文件后几行 - 文件搜索
1
2
3whereis [-bmsu] dirname/filename
locate [-ir] keyword
find [basedir] [option] - 正则表达式
1
2grep [-acinv] [--color=auto] 搜寻字符串 filename
grep -n 'the' regular_express.txt
5.18 面经总结
Q:String 为什么设计为final?
A:String类的数组变量使用private final修饰的,也就意味着其一旦初始化就无法修改。这样可以实现字符串常量池,同一个字符串常量可以被多个String类引用,可以有效节省空间。同时不可修改的特性也能实现线程安全,多线程同时访问也不需要同步操作。
Q:hashCode和equals的区别?
A:在Object类中equals方法用来比较两个对象是否引用的同一个对象,而在其他类中,重写的equals方法默认比较两个对象的值是否相等。而Object类中的hashCode更具对象的内存地址返回一个hash值。两个对象如果使用equals方法比较相等,那他们hashCode的值也必须相等;如果equals不等,hashCode值可相等也可不等;hashCode的值不相等那equals方法比较一定不相等。
Q:hashCode用来做什么?
A:hashCode常用语Java中的Set集合,用于快速查找元素存储位置,判断Set中是否存在重复元素。如果只使用equals方法的话需要和每一个元素比较,而使用hashCode可以迅速找到元素应该存储的位置,然后判断元素是否存在与集合中。
Q:hashCode冲突怎么解决?
A:常用的解决方法有:开放地址法(再散列),比如从冲突位置向后顺延一位。再哈希,使用多个hash函数,当前函数冲突就使用下一个函数。拉链法:每个位置使用链表或者树的结构来存储具体的值。
Q:hashCode和equals什么时候重写?
A:当对象需要加入到集合中,或者需要比较值是否相等时,就需要重写equals方法。而重写equals方法就得重写hashCode方法,保证对值相等的对象他们的hashCode也相等。
Q:重载和重写?
A:重载指的是类中可以有多个同名的函数,但他们的参数个数或类型需不同,最常见的是类的构造方法的重载。重写指的是子类可以重写从父类继承来的方法,但final、static、private修饰的方法不能被重写,构造方法不能被重写,子类重写的方法不能比父类方法访问权限更低,抛出的异常不能比父类抛出异常的类型范围更广。
Q:Java容器的分类?
A:Java容器主要可以分为Collection和Map两大类。Collection下面有List、Set、Queue,List有ArrayList、LinkedList,Set有HashSet、LinkedHashSet、TreeSet。Map下面有HashMap、LinkedHashMap、TreeMap。
Q:HashMap的put过程?
A:首先如果HashMpap为空则使用resize函数初始化,然后计算key的hashCode值,根据hashCode值判断key应该存储的位置,如果该位置未存储其他key,则直接在此插入。否则使用equals方法比较两个key是否相等,相等则直接覆盖,不等的话判断该位置数据类型是链表还是红黑树,是链表则遍历判断是否存在相等key,相等覆盖,都不相等从尾部插入;如果是红黑树则直接插入红黑树节点。
Q:线程池的原理?
A:线程池是使用池化的技术来统一管理线程,这样可以减少线程重复创建和销毁的开销,同时也有利于资源的统一调配,不会出现无节制申请线程导致资源枯竭的现象。具体来说,如果要创建一个线程,会首先判断核心线程数是否已满,如果未满则会创建新的线程执行当前任务,如果已满则会加入等待队列等待其他线程执行完。如果等待队列已满会判断是否已达到最大线程数,如果未达到则创建新线程,已达到则会根据一定的策略来处理新到来的线程。
Q:拒绝策略有哪些?
A:AbortPolicy抛出异常拒绝新任务的处理;CallerRunsPolicy调用执行自己的线程运行任务,也就是执行execute方法的线程;DiscardPolicy不处理新任务,直接丢弃掉;DiscardOldestPolicy丢弃最早未处理的任务。
5.19 续
Q:线程状态?
A:线程有创建、就绪、运行、等待、超时等待、阻塞、终止几种状态,其中等待可能是因为磁盘IO或者需要其他线程处理的数据,因此主动释放锁进入等待队列,而阻塞是因为无法获得同步资源的锁
Q:wait(10)会让线程进入什么状态?wait() 究竟有什么用? A:wait(10)会让线程进入超时等待状态,wait()可以释放当前线程所持有的锁,进入等待队列,让其他线程可以获得同步资源的锁执行。
Q:索引的分类?
A:可分为聚簇索引和非聚簇索引。聚簇索引将数据和索引放在一块,非聚簇索引将索引和数据分开存储,索引的叶子节点指向数据的具体位置。聚簇索引访问数据更快,辅助索引的维护更简单,可以将相关数据保存在一起,适合排序及取出一定范围的数据。但是索引的维护很昂贵。
Q:MySQL的索引数据结构?
A:B+树,其中InnoDB是聚簇索引,MyISAM是非聚簇索引。
Q:为什么使用B+树而不是二叉树或B树?
A:使用二叉树无法保证高度的平衡,在最差的情况下树会退化成链表,使得检索的时间变为线性的。B+树相对于B树,内部节点更小,所以磁盘的读写代价更低,每次查询都是一条从根节点到叶子节点的路径,查询效率更稳定,B+树数据存储在叶子节点中,更方便扫库和基于范围的查询。
Q:事务的隔离级别?
A:读未提交、读已提交、可重复读、串行化
Q:TCP为什么能建立可靠连接?
A:建立连接时有三次握手的过程,首先发送方向接收方发送SYN连接请求,然后接收方发送ACK、SYN,最后发送方发ACK。
Q:TCP除了三次握手、四次挥手,还有没有什么机制保证可靠传输?
A:将数据划分成合适大小的包并对包编号;端到端的校验和,校验和错误的直接丢弃;重复的数据包丢弃;流量控制;拥塞控制;ARQ协议;超时重传。
Q:快重传和快恢复?
A:发送方在收到连续三次ACK时,会直接重新发送接收方未收到的数据包,而不会等待计时器超时。此时ssthred设为cwnd的一般,cwnd设为ssthred+3,直接执行拥塞避免阶段。
Q:HTTP状态码?
A:1XX表示收到请求还需继续操作,如100继续操作;2XX表示请求成功,如200;3XX表示重定向,如301;4XX表示客户端错误,请求包含语法错误或无法完成请求,如400 bad request,404 not found;5XX表示服务器处理请求错误,如500内部服务器错误
Q:HTTP首部构造?
A:有强制缓存和对比缓存两类。强制缓存从本地缓存中寻找请求的页面,如果未超过有效时间则直接使用,超过则向服务器重新请求。对比缓存从本地缓存中取出页面对应的标识符,然后访问服务器判断标识符对应的资源是否过期,如果过期服务器会重新发送。
Q:进程和线程的区别?
A:进程是程序执行过程中分配和管理资源的基本单位,线程是CPU调度和分派的基本单位。线程是进程的一部分,一个进程可以有多个线程。进程有自己的独立数据空间,进程之间切换开销大,线程有自己的运行栈和程序计数器,切换开销小。
Q:多线程的实现方式?
A:继承Thread类,重写run方法;实现Runnable接口;实现Callable接口并用FutureTask封装;使用线程池ThreadPoolExecutor类
Q:线程之间通信方式?
A:锁机制,如互斥锁、读写锁、条件变量、自旋锁等;信号量机制;信号机制;violate全局变量;wait/notify
Q:JVM内存结构和GC?
A:JVM内存结构可分为堆、方法区、栈。堆从垃圾回收的角度可以分为年轻代和老年代,年轻代又可细分为Eden、From Survivor、To Survivor,主要存储创建的对象。方法区主要存储类信息、常量、静态变量和编译后的代码。每个线程都有自己独立的栈,包括虚拟机栈和本地方法栈。对象刚创建的时候会被分配到Eden区,Eden区已满会进行Minor GC,存活的对象转移到from survivor,并且年龄加1,Eden区再满时Minor GC会对Eden和from survivor区进行垃圾清理,存活的对象转移到to survivor区。当对象的年龄到达某一阈值(默认为8)时,会被转移到老年代,老年代满后会进行Full GC。常见的垃圾清理算法有标记清理、标记复制、标记整理、分代收集。垃圾收集器有Serial、ParNew、Parallel Scavenge、CMS、G1、ZGC。
Q:数据库事务特性?
A:原子性,事务中的操作要么全部执行,要么全部不执行;一致性,事务按照预期执行并达到一致性状态;隔离性,不同的事务之间相互隔离,不能干扰;持久性,事务一旦提交,对数据库的更改是永久的。
Q:MVCC机制?
A:每行记录后面保存两个隐藏的列,一个保存行的创建时间,一个保存行的过期时间或删除时间,时间使用系统版本号来表示,没开始一个新的事务,系统版本号都会递增。事务开始时的系统版本号将作为事务的版本号,用来与查询到的每行记录的版本号来进行比较。
Q:tcp中的TIME_WAIT解释一下?
A:客户端(主动断开连接)在接收到服务器的FIN消息后,会进入TIME_WAIT状态并向服务器发送ACK消息,在等待两个最大数据段生命周几时间后会进入CLOSED状态。主要是为了防止延迟的数据段被其他TCP连接收到,以及保证TCP连接的远程被正确关闭,如果未关闭重新建立连接会被终止。如果TIME_WAIT的TCP连接太多可以通过设置参数使客户端发送RST直接终止连接或者重用处于TIME_WAIT状态的TCP连接。
Q:CPU进程调度算法?
A:先来先服务、最短任务有限、最短剩余时间优先、优先级队列、时间片轮转、多级反馈队列。
Q:Cookie和Session区别?
A:Cookie存储在客户端,Session存储在服务器端;Cookie只能记录ASCII,Session可以记录多种类型数据;Cookie保存时间较长,而Session较短,往往会在对话关闭后失效;Cookie保存在本地,安全性较差,Session保存在服务器端,安全性较高。单个Cookie不能超过4K,而Session可以大的多。
Q:Cookie的位置和格式?
A:Cookie存放在HTTP报文的请求头部或者是响应头部,以Key=Value的形式存储,多个键值之间使用分号和空格分开,可以设置expire、domin、path等属性。
Q:Session的存储方式?
A:可以存储在IIS进程上、StateServer上、SQL Server数据库上。存储在IIS上简单、性能高,但容易丢失,存储在StateServer上对Web服务器依赖不高,Web服务关闭仍能保存,但还是在内存中。SQL Server上能够持久化保存,但是磁盘的读写比较耗时。
Q:HashMap是线程不安全的,为什么?如何改进?
A:HashMap中的put和get操作都是不会加锁的,所以在多个线程中可能有多个线程同时操作HashMap,如果有两个线程同时Put同一个位置的Key,都取的是同一个链表头部,会出现插入值的丢失。在多个线程同时对HashMap进行resize扩容时,可能会导致链表成环,下次访问就会出现死循环。使用尾插法替代头插法可以一定程度上解决这些问题,但仍无法实现访问的同步。因此在多线程时最好使用ConcurrentHashMap(HashTable已不常用)
5.20 完结篇
Q:ThreadLocal变量原理?
A:使用ThreadLocal创建的变量在每一个线程中都会有独立的实例副本,可以使用get和set方法来获取默认值及更改当前实例副本值。其具体存储使用的是ThreadLocalMap类,每个线程都会有自己的ThreadLocalMap存储键为ThreadLocal,值为具体对象的键值对。由于键ThreadLocal是弱引用,值是强引用,因此垃圾回收后键可能为NULL导致值无法回收,出现内存泄漏,所以ThreadLocalMap在调用set、get、remove方法后会清理掉key为null的记录。
Q:管道介绍?无名、命名管道区别?
A:调用pipe函数,会在内核中开辟出一块缓冲区用于进程间的通信,就是匿名管道,它有一个读端和一个写端,使用两个文件描述符来表示,父进程可以通过fork来创建子进程,父进程关闭读端,子进程关闭写端,这样就可以实现通过管道的进程间通信。匿名管道只有具有亲缘关系的进程才能进行通信,命名管道解决了该问题,它提供一个路径名与之关联,以FIFO的文件形式存储在文件系统中。
Q:TCP报文头?
A:一般为20字节(无选项),最长60字节。包含IP协议版本号、服务类型、头部长度、数据长度、标识、分片信息、校验和、目的IP、源IP等信息。
Q:客户端最多和服务器建立多少个tcp连接?
A:理论上等于端口号的个数,端口号为unsigned short,0号端口有特殊用处,因此最多为65535个连接。但实际上还受硬件资源和网络带宽的影响。
Q:TCP攻击?
A:SYN Flood、SYN-ACK Flood、ACK Flood、FIN/RST Flood、TCP连接耗尽攻击、分片攻击、异常报文攻击。Anti-DDos防御使用源认证,真实源IP限速。
Q:TCP三次握手和四次挥手流程状态?
A:三次握手:SYN(syn-sent), SYN-ACK(syn-rcvd), ACK(established)。四次挥手:FIN(FIN-WAIT1), ACK(CLOSED-WAIT), (FIN-WAIT2), FIN(LAST-ACK), ACK(TIME_WAIT), (CLOSED), (CLOSED)。
Q:半连接队列和全连接队列?
A:服务器收到客户端的SYN请求后,会发送SYN-ACK,同时内核把该连接加入半连接队列。在收到客户端的ACK后,会把该连接从半连接队列中取出来加入全连接队列,调用accept函数。
Q:IO多路复用?
A:IO一般可分为同步阻塞IO、同步非阻塞IO、IO多路复用(异步阻塞IO)、异步非阻塞IO。IO多路复用使用的是经典的Reactor设计模式。建立在内核提供的多路分离函数select基础上。用户将需要进行IO操作的socket添加到select中,然后阻塞等待select函数调用返回,当数据到达时,socket被激活,select函数返回,用户线程可以正式发起read请求,读取数据并继续执行。通过Reactor方式,可以将用户轮询IO操作状态的工作交给handle_events循环来处理,用户注册完事件处理器后可继续其他的操作。handle_events会调用系统的select函数,如果有被激活的socket,会通知用户进程(或调用回调函数),执行对应handle_event函数来处理。
5.23 面经续
Q:CMS和G1区别?
A:CMS会存在内存碎片的问题,G1将内存分为一个个大小相等的Region,解决了内存碎片问题。同时G1支持用户控制垃圾回收时间,选择合适的Region进行垃圾回收,在大对象处理上可以横跨多个Region存储,不用直接进入老年区。
Q:accept、connect、listen对应三次握手什么阶段?
A:listen是在三次握手之前,服务器的监听,connect对应三次握手的SYN,ACK,connect在三四次握手之后,阻塞获取一个客户端与服务器端的连接。
Q:tcp keepalive实现原理?
A:tcp的keepalive是为了测试与保持客户端与服务器端的连接,当一方发现另一方一定时长没发送数据时,就会发送数据为空的心跳包进行心跳检测,如果间隔发送几次对方返回的都是RST而不是ACK的话,那么心跳发起方就判断这个连接已经失效,主动关闭连接。
Q:tcp粘包?
A:tcp粘包指发送方发送的若干包数据到达接收方时粘成了一包,可能是因为发送方tcp使用了Nagle算法减少网络中报文的数量,也有可能是接收方接收数据到缓存的速度大于应用程序从缓存读取数据包的速度。
Q:CopyOnWrite(写入时复制)?
A:多个调用者访问相同的资源时,会获取相同的指针指向相同的资源,直到某个调用者修改资源内容时,才会真正复制一份专用副本给调用者。
Q:如何在应用层保证udp可靠传输?
A:添加seq/ack机制,确保数据发送到对端,添加发送和接收缓冲区,添加超时重传机制
Q:https为什么要采用对称和非对称加密结合的方式?
A:如果只使用非对称加密进行数据传输的话效率比较低,如果只是用对称加密的话安全性无法保证,所以采用了非对称加密方式来加密对称加密的秘钥,数据传输用对称加密。
5.24 面经续
Q:HTTP1.0、HTTP1.1 和 HTTP2.0 的区别?
A:HTTP1.1比HTTP1.0增加了更多的缓存控制策略、带宽优化断点续传、错误状态码、长连接。HTTP2.0与HTTP1.X比,使用二进制格式、多路复用、header压缩。
Q:死锁条件?
A:互斥、请求与保持、不剥夺、循环等待
Q:协程?
A:基于线程之上的,比线程更加轻量级的存在,由用户自己写程序来管理调度,对内核不可见,一个线程可以有多个协程,适用于被阻塞的,需要大量并发的场景。
Q:GET和POST区别?
A:GET请求可被缓存,可被收藏为书签,保留在浏览器历史记录中,有长度限制,用于取回数据。POST请求不会被缓存,不会被保留在浏览器历史记录,不能被收藏为书签,对长度没有限制,用于将数据发送到服务器来创建或更新资源。
Q:Hash索引?
A:InnoDB本身的索引结构是B+树,如果监控到某个索引经常使用,就认为是热数据,然后创建一个hash索引,下次再使用到这个索引可以通过Hash一次查到数据。
Q:如何解决幻读?
A:使用串行化读的隔离级别,或者使用MVCC + next-key locks.
6.2 续面经
Q:共享内存实现方式?
A:各个进程通过函数将自己的一部分虚拟地址空间映射到同一块物理地址空间中。
Q:为什么数据库索引用b+树而不用红黑树?
A:红黑树是二叉树,树的深度会比较大,在查找时会有更多的IO操作。
Q:数据库的三范式? A:1NF属性具有原子性,不可再分解;2NF记录的唯一性,记录有唯一标识,不存在部分依赖;3NF字段没有冗余,不存在传递依赖。
Q:HTTP为什么使用TCP?
A:HTTP本身是无状态的协议,使用UDP的话无法保证数据传输的正确性,得用TCP保证正确传输
Q:进程控制块PCB?
A:主要包括(1)进程标识符(内部,外部) (2)处理机的信息(通用寄存器,指令计数器,PSW,用户的栈指针)。 (3)进程调度信息(进程状态,进程的优先级,进程调度所需的其它信息,事件) (4)进程控制信息(程序的数据的地址,资源清单,进程同步和通信机制,链接指针)
Q:介绍一下红黑树?
A:性质1:每个节点要么是黑色,要么是红色。 性质2:根节点是黑色。 性质3:每个叶子节点(NIL)是黑色。 性质4:每个红色结点的两个子结点一定都是黑色。 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。