面试中常被问到的有关进程、线程和网络的问题

一、进程与线程:

1、进程与线程的区别?

0) 进程是资源调度的基本单位,线程是CPU调度的基本单位。
1) 进程可看作是程序的一次执行,线程可理解为进程中执行的一段程序。
2) 进程间是独立的,每个进程之间都有独立的内存空间和上下文环境。线程运行在进程空间内部。一般来讲一个进程无法存取其他进程的存储空间。同一进程所产生的线程共享同一内存空间。
3) 同一进程中的两段代码不能够同时执行,除非引入线程。
4) 线程是属于进程的,当进程退出时,该进程产生的所有线程都会被强制退出。
5) 线程占用的资源要少于进程所占用的资源,因此进程在上下文切换时要消耗大量的资源,所以多进程常用于长连接中。
6) 进程与线程都可以有优先级。

7) 进程间可以通过IPC通信,但是线程不可以


2、进程间通信有哪些方式,各自主要用在什么样的场景中?

信号、信号量、消息队列、共享内存、Socket

 

二、计算机网络:

1、Socket套接字通信的过程?

服务端:

1) 调用ServerSocket(int port)创建一个服务端套接字,并绑定到指定的端口。

2) 调用accept()监听连接请求,接收到连接并返回通信套接字。

3) 调用Socket类的getOutStream()和getInputStream()获取输出流和输入流,开始网络数据的发送和接收。

4) 关闭通信套接字Socket.close()

客户端:

1) 调用Socket(int port)创建一个流套接字,并连接到服务器端。

2) 调用Socket类的getOutputStream()和fetInputStream()获取输出流和输入流,开始网络数据的发送和接收。

3) 关闭通信套接字Socket.close()


2、TCP和UDP有什么区别?

1) TCP是传输控制协议,提供的是面向连接、可靠的字节流服务。当客户端和服务器彼此交换数据前,必须在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发、丢弃重复数据、检验数据、流量控制等功能,保证数据能可靠地从一端传到另一端。

2) UDP是用户数据报协议,是一个简单的面向数据报的传输层协议。不能提供可靠性保证。由于UDP不需要建立可靠连接,也没有超时重发等机制,故传输效率较高。


3、TCP的3次握手和4次挥手的过程?

TCP是一种全双工通信。

面试中常被问到的有关进程、线程和网络的问题

1)为什么是3次握手,而挥手确是4次呢?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

TCP之所以使用三次握手,完全是一种为了解决“两军问题”所采用的折衷的设计。


2)客户端为什么在TIME_WAIT状态需要经过2MSL(最大报文生存时间)后才返回到CLOSED状态呢?

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。


参考文献:

【1】http://blog.****.net/whuslei/article/details/6667471/