2019 百度校招面试题

TCP/IP 三次握手

1、建立连接协议(三次握手)
(1)客户 端发送一个带SYN标志的TCP报文到server。这是三次握手过程中的报文1。
(2) server端回应client的,这是三次握手中的第2个报文。这个报文同一时候带ACK标志和SYN标志。

 

因此它表示对刚才clientSYN报文的回应。同一时候又标志SYN给client,询问client是否准备好进行数据通 讯。


(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。



2、连接终止协议(四次握手)
   因为TCP连 接是全双工的,因此每一个方向都必须单独进行关闭。这原则是当一方完毕它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN仅仅意味着这一方向上没有数据流动。一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将运行主动关闭。而还有一方运行被动关闭。
 (1) TCP客 户端发送一个FIN。用来关闭客户到server的数据传送(报文段4)。
 (2) server收到这个FIN。它发回一个ACK,确认序号为收到的序号加1(报文段5)。

和SYN一样。一个FIN将占用一个序号。
 (3) server关闭client的连接,发送一个FIN给client(报文段6)。


 (4) 客户段发回ACK报文确认。并将确认序号设置为收到序号加1(报文段7)

面向对象三大要素

1.三大要素 封装,继承,多态

2.五大原则:

(1)单一职责原则(SRP:Single Responsibility Principle)一个类,最好只做一件事,只有一个引起它变化的原因

      举例:图书馆和宿舍都有桌有椅,为什么学习还是应该去图书馆?因为宿舍有人看球,有人吃饭,和其他事情,相互干扰,违反了单一职责原则。也就是说 一个类如果继承了多个职责,那么这些职责在并发执行时可能会相互干扰

 

(2)开放封闭原则(OCP:Open Close Principle)软件实体应该是可扩展的,而不可修改的。也就是说对扩展开放,对修改封闭

        举例:你想要变帅,有两种方法。一.穿漂亮衣服,做头发,化妆,这些就是扩展  二.你也可以整容,割双眼皮,隆胸等这就是修改。  之所以对修改关闭,是因为修改是要付出代价的,通常都是危险的。所以说一修改就容易出现Bug,应该对修改关闭

 

(3)依赖倒置原则(DIP:Dependency Inversion Principle)高层模块不应该依赖于低层模块,应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象

        举例:之前我们通过货物交换的方式来买到自己想要的东西,比如我用一个斧子换了一只鸡,但是感觉太麻烦了,所以我们发明了货币,任何一个商品都是有价值的,所谓的交换无非就是按各自的价值量去交换,既然如此那就用货币来代表这个抽象的价值量,其他东西都来跟他交换就可以了    这就是依赖倒置原则

(4)接口隔离原则(ISP:Interface Segregation Principle)客户端不应该依赖他不需要的的接口,一个类对另一个类的依赖应该建立在最小的接口上,应该多使用一些小的接口,而不是使用一些大的接口

         1.使用多个专门的接口比使用单一的总接口要好

         2.一个接口代表一个角色,不应该将不同的角色给一个接口没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。

(5)里氏代换原则(LSP:Liskov Substitution Principle)所有使用基类的地方必须能够透明的使用其子类的对象

        举例:人固有一死,列宁是人,所以列宁会死。这句话是对的,这里人是基类,列宁是子类,所以这就是一个里氏转换原则

线程死锁原理及解决办法

线程锁:当多个线程几乎同时修改一个共享数据的时候,需要进行同步控制,线程同步能够保证多个线程安全的访问竞争资源(全局内容),最简单的同步机制就是使用互斥锁。
某个线程要更改共享数据时,先将其锁定,此时资源的状态为锁定状态,其他线程就能更改,直到该线程将资源状态改为非锁定状态,也就是释放资源,其他的线程才能再次锁定资源。互斥锁保证了每一次只有一个线程进入写入操作。从而保证了多线程下数据的安全性。
进程锁:也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,但是可以使用本地系统的信号量控制。
死锁:在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。 当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。
产生死锁的四个必要条件

(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

解决死锁的方法

按同一顺序访问对象。(注:避免出现循环)

避免事务中的用户交互。(注:减少持有资源的时间,较少锁竞争)

保持事务简短并处于一个批处理中。(减少持有资源的时间)

使用较低的隔离级别。(注:使用较低的隔离级别(例如已提交读)比使用较高的隔离级别(例如可序列化)持有共享锁的时间更短,减少锁竞争)

尽量减少资源占用的时间,可以降低死锁的发生的概率

银行家算法。银行家算法----安全序列
 

你可能感兴趣的:(2019 百度校招面试题)