关于操作系统和网络编程的一些小面试题目~

1.作业、进程、线程和管道之间的关系:
作业:用户在一次解题或一个事务处理中要求计算机系统所做工作的集合。它包含了用户程序、所需要的数据及控制命令等;作业是由一系列有序的步骤组成的;

进程:一个程序在一个数据集合上的一次运行过程。所以一个程序在不同的数据集合上运行,乃至一个程序在同样数据集合上的多次运行都是不同的进程;

线程:线程是进程中一个实体,是被系统独立调度和执行的基本单位;

管道:管道实际上是定义了一个数据结构和在该数据结构上的能为并发进程所执行的一组操作,这组操作能同步进程和改变管道中的数据。

2.进程和线程的差别:
进程是程序的一次执行;线程可以理解为进程中执行的程序片段。
进程间是独立的,主要体现在内存空间、上下文环境上;线程运行在进程空间内。一般来讲,进程无法突破进程边界获取其他进程的存储空间;而线程可以;因为同一进程内的多个线程是共享一个内存空间的;

同一个进程中的两段代码不能够同时执行,除非引入线程;

线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除其资源。

线程和进程都有优先级。

进程间可以通过IPC通信,但线程不可以。

3.指针和引用的差别?
(1)非空区别:在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是变量在某些时候也可能不值任何对象,这是你应该把变量声明为指针。因为这样你可以赋空值给该变量。

(2)合法性区别:在使用引用之前不需要测试它的合法性,相反,指针则应该总是被测试,防止其为空;

(3)可修改性区别:指针和引用的另外一个重要的区别是指针可以重新被赋值并指向另外一个不同的对象;但是引用则总是旨在初始化时被指定的对象,以后也不能改变,但是指定的对象其内容可以改变;

(4)应用区别:总的来说,在以下情况下应该使用指针:一是考虑到存在不指向任何对象的可能(在这种情况下,能够设置指针为空),二是需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么应该使用引用。

4.OSI参考模型分为物理层、数据链路层、网络层、会话层、表示层和应用层:
物理层涉及在信道上传输的原始比特流;
数据链路层的主要任务是加强物理层传输原始比特流的功能,使之对应的网络显现为一条无错线路。发送包把输入数据封装在数据帧,按顺序传送出去并处理接受党会送的确认帧;
网络层关系到子网的运行控制,其中一个关键问题是确认从源端到目的端如何选择路由;
传输层的基本功能是从会话层接受数据并且把其分成较小的单元传递给网络层;
会话层允许不同机器上的用户建立会话关系;
表示层用来数据格式化、数据转化;
应用层为应用程序提供服务,包含着大量人们普遍需要的协议。

5.如何编写Socket套接字?
服务端程序编写:
(1)调用ServerSocket(int port)创建一个服务器端套接字,并绑定到指定端口上;
(2)调用accept(),监听连接请求;
(3)调用Socekt类的getOutStream()和getInputStrem()获取输出流和输入流,并开始网络数据的发送和接收;
(4)关闭通信套接字Socket.close()。

客户端程序编写:
(1)调用Socket()创建一个流套接字,并连接到服务器端;
(2)调用Socekt类的getOutStream()和getInputStrem()获取输出流和输入流,并开始网络数据的发送和接收;
(3)关闭通信套接字Socket.close()。

6.TCP的三次握手和四次挥手:
三次握手:
第一次握手:起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN-SENT状态,等待Server确认;
第二次握手:Server收到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量;
第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server就可以开始传输数据。
在这里插入图片描述
四次挥手:
(1)Client的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待Server的确认。B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),Server进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,Client到Server的连接释放。
(2)Client收到Serve的确认后,进入FIN-WAIT-2(终止等待2)状态,等待Serve发出的连接释放报文段。
(3)在Serve没有要向Client发出的数据的情况下,Serve发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。
(4)Client收到Serve的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),Client进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,Client才进入CLOSED状态。

在这里插入图片描述

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

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章