并发编程部分
1. 什么是进程和线程?
进程:操作系统分配资源的最小单位,各个进程之间占据独立的寻址空间,运行也是独立运行,进程间通信需要一些机制。
线程:程序执行的基本单位,一个进程可以开启多个线程,他们的很多空间(如堆空间)是公用的。线程执行开销小,但是不够安全。
2. 线程有几种状态?
NEW:线程对象已经创建,尚未启动。
RUNNABLE:线程已经启动,正在运行或准备运行。
BLOCKED:等待锁的时候进入的状态。
WAITING:等待其他线程执行特定的操作(如调用wait()方法)。
TIMED_WAITING:线程等待另一个线程执行特定操作,但有一个时间限制(如调用sleep(long millis))。
TERMINATED:线程已经执行完毕或被中断。
3. 如何避免线程死锁?
保持一致的加锁顺序:确保多个线程在访问多个资源时,总是以相同的顺序请求锁。
设置锁超时:为获取锁设置超时时间,如果超时则放弃或稍后重试。
使用死锁检测工具:定期检查线程之间是否存在循环等待关系,并采取措施解决。
4. 线程间有哪些通信方式?
共享内存:通过共享变量进行通信,需要同步机制来保证数据的一致性。
消息传递:通过发送和接收消息进行通信,Java中的wait()和notify()方法就是一种基于消息传递的通信方式。
网络通信部分
1. 描述TCP/IP四层模型
应用层:提供网络应用服务,如HTTP、FTP、SMTP等。
传输层:提供端到端的通信服务,如TCP和UDP。
网络层:负责数据包的路由和转发,主要协议为IP。
网络接口层:负责数据在物理网络上的传输,如以太网、Wi-Fi等。
2. 常见的网络协议有哪些?
HTTP:基于TCP协议,用于Web浏览器与Web服务器之间的通信。
SMTP:基于TCP协议,用于发送电子邮件。
POP3/IMAP:基于TCP协议,用于接收电子邮件。
FTP:基于TCP协议,用于在计算机之间传输文件。
SSH:安全的网络传输协议,基于TCP协议,提供加密和认证机制。
3. TCP和UDP的主要区别是什么?
TCP:提供面向连接的、可靠的数据传输服务,有重传机制,适合大数据量传输。
UDP:提供无连接的、尽最大努力的数据传输服务,不保证数据传输的可靠性,简单高效,适合小数据量传输或实时性要求高的场景。
4. 如何解决网络延迟和丢包问题?
网络延迟:可以通过优化网络路由、增加带宽、使用更高效的传输协议等方式来降低网络延迟。
丢包问题:可以通过使用TCP协议(具有重传机制)来减少丢包的影响,同时也可以通过应用层的重试机制来应对丢包问题。