研发工程师面试题整理

这篇博客详细整理了Java研发面试中常见的问题,包括TCP与UDP的区别、多线程和多进程的优缺点、进程和线程的关系、Java并发中的CAS机制、读写锁的概念、常用的Linux命令,以及单例和工厂模式的讨论。此外,还涉及到了Python线程池实现、线程间通讯的Event机制,以及Python字典的底层实现和内存占用等知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP, UDP区别和各自优缺

  • TCP提供一种面向连接的、可靠的字节流服务 在一个 TCP 连接中,仅有两方进行彼此通信。广播和多播不能用于 TCP
  • TCP使用校验和,确认和重传机制来保证可靠传输
  • TCP 给数据分节进行排序,并使用累积确认保证数据的顺序不变和非重复
  • TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制

注意:TCP 并不能保证数据一定会被对方接收到,因为这是不可能的。TCP 能够做到的是,如果有可能,就把数据递送到接收方,否则就(通过放弃重传并且中断连接这一手段)通知用户。因此准确说 TCP 也不是 100% 可靠的协议,它所能提供的是数据的可靠递送或故障的可靠通知。

UDP 是一个简单的传输层协议。和 TCP 相比,UDP 有下面几个显著特性:

  • UDP 缺乏可靠性。UDP 本身不提供确认,序列号,超时重传等机制。UDP 数据报可能在网络中被复制,被重新排序。即 UDP 不保证数据报会到达其最终目的地,也不保证各个数据报的先后顺序,也不保证每个数据报只到达一次
  • UDP 数据报是有长度的。每个 UDP 数据报都有长度,如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一起传递给接收方。而 TCP 是一个字节流协议,没有任何(协议上的)记录边界。
  • UDP 是无连接的。UDP 客户和服务器之前不必存在长期的关系。UDP 发送数据报之前也不需要经过握手创建连接的过程。

总结: 基于连接vs无连接,可靠性不同,有序性,数据边界,速度,重量级vs轻量级

什么情况下用UDP?

UDP更适用于对速度比较敏感的应用,例如:在线视频媒体,电视广播和多人在线游戏。

基于TCP协议的最好例子是HTTP协议和HTTPS协议,他们几乎存在于互联网的任何地方,实际上,绝大多数你所熟悉的通常协议,都是基于TCP的,例如:Telnet,FTP以及SMTP协议。UDP协议没有TCP协议那么受欢迎,但是也被广泛应用,比如DHCP以及DNS协议,其他还有一些基于UDP的协议如SNMP,TFTP,BOOTP以及NFS(早期版本)

多线程和多进程的区别,优缺点

多进程

  • 数据共享复杂,需要IPC(进程间通讯,如管道,文件,Socket),数据是分开的,同步简单
  • 占用内存多,CPU切换复杂,创建销毁简单,利用率低
  • 进程间不会互相影响

多线程

  • 因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂
  • 占用内存少,切换简单,CPU利用率高,创建销毁,速度很快
  • 一个线程挂掉将导致整个进程挂掉

同步与异步:在计算机领域,同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。举个例子,打电话时就是同步通信,发短息时就是异步通信。

进程和线程的关系:

进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。进程是cpu资源分配的最小单位,线程是cpu调度的最小单位

  1. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
  2. 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
  3. CPU分给线程,即真正在CPU上运行的是线程。

并行和并发:并行处理(Parallel Processing)是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。并发处理(concurrency Processing):指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行。并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集

Thread和Runnable的区别

Thread是类,Runnable是接口,继承Thread类和实现Runnable接口都能实现多线程。由于Java不支持多继承,因此继承Thread类就代表这个子类就不能继承其他类,而实现Runnable接口没有这个限制。其实Thread类本身也是实现了Runnable接口。

当使用Runnable接口时,我们还是需要实例化一个Thread类并传入Runnable的实例来调用start()方法

public class RunnableExample implements Runnable{
   
   
    public void run(){
    ...
    }
}

public class ThreadExample 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值