手撕:二叉树中序遍历,数组中的第k个最大元素
面试管很友好,开始介绍了十分钟业务,后续简单聊了聊项目(点评)
-
线程和进程
-
为什么需要加锁?java中有什么锁?
-
java的内存模型。垃圾回收机制。
-
http和https的区别,https的加密握手
-
tcp和udp的区别
-
tcp有哪些特点(如何实现可靠传输的)
-
DNS解析
-
在浏览器中输入一个url会发生什么
作者:我就是0offer糕手
链接:
https://www.nowcoder.com/discuss/739507140812869632?sourceSSR=dynamic
来源:牛客网
1. 线程和进程
进程是系统进行资源分配的基本单位,拥有独立的内存空间和系统资源。 独立性:不同进程内存隔离,互不干扰。 资源开销大:创建、切换和销毁需要操作系统介入,成本较高。 线程是进程内的执行单元,共享进程的内存和资源,但拥有独立的栈和寄存器。 共享资源:线程间可直接访问进程的堆和全局变量。 切换开销中等:由操作系统调度,上下文切换成本低于进程。 同步需求:需通过锁、信号量等机制避免竞态条件。
进程间的通信方式
- 管道 半双工 命名管道
- 消息队列
- 共享内存 多个进程可以将同一块内存映射到它们的地址空间中,从而实现共享内存。这样,一个进程对共享内存的写操作会影响到其他进程对相同内存区域的读操作。在Unix/Linux系统中,使用shmget、shmat等系统调用来操作共享内存。
- 信号量 信号量是一种用于进程同步和互斥的通信方式。通过信号量,进程可以对资源进行加锁或解锁。在Unix/Linux系统中,可以使用semget、semop等系统调用来操作信号量。
- 套接字
线程间的通信方式
- 共享内存
- 条件变量
- 信号量
- 互斥锁 synchronized:Java中最基本的线程同步机制,可以修饰代码块或方法,保证同一时间只有一个线程访问该代码块或方法,其他线程需要等待锁的释放。
- ReentrantLock:与synchronized关键字类似,也可以保证同一时间只有一个线程访问共享资源,但是更灵活,支持公平锁、可中断锁、多个条件变量等功能。
- Semaphore:允许多个线程同时访问共享资源,但是限制访问的线程数量。可以用于控制并发访问的线程数量,避免系统资源被过度占用
2.为什么需要加锁?java中有什么锁?
一是为了提高并发性能 二是防止并发多线程操作时出现错误
synchronized reentrantlock
3.java的内存模型、垃圾回收机制
Java程序是需要运行在Java虚拟机上面的,Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。
Java内存模型规定了所有的共享变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。
而JMM就作用于工作内存和主存之间数据同步过程。他规定了如何做数据同步以及什么时候做数据同步。
JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。
4.http和https的区别,https的加密握手
- 安全性 http不加密 https 使用ssl tls协议加密
- url http https
- 证书 http不需要数字证书;https需要证书 证明服务器是可信任的
- 默认端口 http 80 https443
- 性能 http https
HTTPS 的加密过程可以分为以下几个阶段:
阶段 1:客户端发起请求
客户端向服务器发起 HTTPS 请求,并发送以下信息: 支持的 SSL/TLS 版本 支持的加密算法列表 客户端生成的随机数(Client Random),用于后续密钥生成。
阶段 2:服务器响应
服务器收到请求后,向客户端发送以下信息: 选择的 SSL/TLS 版本 选择的加密算法 服务器生成的随机数(Server Random),用于后续密钥生成。 服务器的数字证书(包含公钥)
阶段 3:验证服务器证书
客户端验证服务器的数字证书: 检查证书是否由受信任的 CA 签发 检查证书是否在有效期内 检查证书中的域名是否与访问的域名一致 如果验证通过,客户端信任服务器的公钥
阶段 4:密钥交换
客户端生成一个密钥key,并使用服务器的公钥通过非对称加密算法加密后发送给服务器 服务器使用自己的私钥解密,获取密钥key(因为私钥只有服务器有,所以这个密钥key是安全的)
阶段 5:生成会话密钥
客户端和服务器使用 Client Random、Server Random 和密钥key,通过相同的对称加密算法生成会话密钥(Session Key)
阶段 6:加密通信
客户端和服务器使用会话密钥(Session Key)对通信内容进行对称加密,开始安全的数据传输
5.tcp和udp的区别
1连接类型
TCP 是一种面向连接的协议。在发送数据之前,它需要建立连接,这通过三次握手过程完成。结束后通过四次挥手断开连接。
UDP 是无连接的协议。它发送数据而不预先建立连接。
2可靠性
TCP 提供可靠的数据传输,通过确认和重传机制来确保数据的正确送达。
UDP 不保证数据的可靠送达。它发送数据但不确认接收方是否收到,因此可能会丢失数据包。
3速度和效率
TCP 由于其握手和确认机制,速度通常比UDP慢,但更可靠。
UDP 由于缺乏复杂的错误检查和恢复机制,通常比TCP更快,适用于对实时性要求较高的应用。
4数据流控制和拥塞控制
TCP 有流量控制和拥塞控制机制,可以调整数据传输速率以避免网络拥堵。
UDP 没有内置的流量控制或拥塞控制机制。
5头部大小
TCP 头部较大,最小为20字节,因为它包含更多的控制信息。
UDP 头部较小,仅8字节,使得其开销更小。
在使用场景上,TCP 通常用于需要高可靠性的应用,如网页浏览、电子邮件、文件传输等。UDP 适用于实时应用,如视频流、在线游戏和语音通话,其中一些数据丢失是可以接受的。
TCP | UDP | |
---|---|---|
连接类型 | 面向连接,需要三次握手和四次挥手 | 无连接 |
可靠性 | 可靠的数据传输 | 不保证数据可靠性送达 |
头部大小 | 20-60字节长度 | 固定8字节 |
速度 | 比UDP慢 | 比TCP快 |
顺序性 | 所有数据包按特定顺序传递给接收者 | 数据报以无特定顺序送达 |
错误检测机制 | 提供了流量控制、拥塞控制 | 只有基本的错误检测机制,如校验和 |
上层协议 | HTTP, HTTPs, FTP, SMTP, Telnet | DNS, DHCP, TFTP, SNMP, RIP, VoIP |
应用场景 | web浏览器、文件传输、邮件 | 网络游戏,视频流 |
6.tcp有哪些特点(如何实现可靠传输的)
我觉得描述一个网络协议可靠,至少要满足以下几点:
-
数据完整性,我传给你的是123,你收到的也得是123,不能是13
-
数据顺序,我是按照123给你的,你不能按照213收到。
-
不能重复,我传给你的是123,你不能给我接收成1223
-
不被篡改,我传给你的是123,你不能接收成12`3
所以,要保证以上几点,TCP主要做了以下几个事情:
应用数据被分割成 TCP 认为最适合发送的数据块。TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
校验和:
TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
三次握手&四次挥手:
TCP通过三次握手建立连接和四次挥手关闭连接,确保通信的可靠性和数据的可靠传输。
流量控制:
TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
拥塞控制:
TCP使用拥塞控制算法来确保网络中不会因为过多的数据而导致拥塞。当网络拥塞时,发送端会减少发送速率,以避免进一步加重网络拥塞。常用的拥塞控制算法包括慢启动、拥塞避免和快速重传等。
ARQ协议:
也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
超时重传:
当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。7.DNS解析
7.在浏览器中输入一个url会发生什么
- URL解析,对URL自动编码,然后检查长度,之后根据url查看浏览器是否缓存了该页面
- DNS查询,依次通过浏览器缓存,OS hosts缓存,路由器缓存,ISP缓存和根域名服务器去查询对应的ip
- 浏览器将请求封装为HTTP报文,在client和server建立连接之前,会进行TCP三次握手
- 之后将报文从外到里封装为 以太网首部+ip首部+tcp首部+http首部经过网关和路由器发送给server
- 对于淘宝来说,请求会先到nginx服务器上,然后nginx采用默认的轮询算法进行负载均衡,携带原来browser的ip把报文发送给Servlet容器
- Servlet容器接收到请求之后会解析请求行,请求体,请求头,然后交给MVC处理
- DispatcherServlet接收到请求后,通过请求路径返回相应的拦截器和Controller;
- 在Controller中会进行业务逻辑的执行,可能会调用下层的Service以及持久层进行数据的CRUD。
- 对Controller进行处理并返回ModelAndView;然后在通过ViewResolve对ModelAndView进行处理,返回View视图;最后一步是进行渲染View,产生response
- 浏览器接收response,HTTP响应报文的头部包含了状态码(Status-Code),并进行缓存和解码
- 浏览器渲染页面# 手撕:二叉树中序遍历,数组中的第k个最大元素
1 条评论
回复