现在的位置: 首页 > 综合 > 正文

2015百度校园招聘软件研发类笔试题(笔试时间:2014-9-14,西安、哈尔滨、大连站)

2018年04月22日 ⁄ 综合 ⁄ 共 4013字 ⁄ 字号 评论关闭

一、简答题

1.请简述TCP-IP的3次握手以及4次挥手过程?并解释为何关闭连接需要4次挥手?


所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence
Number)字段里。



第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement
Number)设置为客户的I S N加1以.即X+1。


第三次握手:客户端再次发送确认包(ACK)
SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1


TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way
handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。


由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:



2.操作系统的内存管理淘汰算法有哪些,请列出并简要说明?

a. FIFO先进先出的算法
FIFO算法总是选择在内存驻留时间最长的一页将其淘汰。FIFO算法认为先调入内存的页不再被访问的可能性要比其他页大,因而选择最先调入内存的页换出。实现FIFO算法需要把各个已分配页面按分配时间顺序记录在一个数组中,每次淘汰最早进入数组的页。
b. OPT最佳淘汰算法描述:
该算法淘汰在访问串中将来最不常用的页。这样,淘汰掉该页将尽量减少因需要访问该页又立即把它调入的现象。遗憾的是,这种算法无法实现,因为它要求必须预先知道每一个进程的访问串。
c. LRU最近最少使用算法
LRU工作原理是,当需要淘汰某页,选择离当前时间最近的一段时间内最久没有使用过的页先淘汰。在这里采用一个页面集大小的栈存储最近访问的页面。页面按时间顺序压如栈中。如果被访问的页在栈中,则从栈中移出页面,压入栈顶。这样栈底记录离当前时间最近的一段时间内最久没有使用过的页。
d. LFU最少访问页面算法
LFU在需要淘汰某一页时,首先淘汰到当前时间为止、被访问次数最少的那一页。这只要在页面集中给每一页增设一个访问计数器即可实现。每当该页被访问时,访问计数器加1,而发生一次缺页中断时,则淘汰计数值最小的那一页,并将所有的计数器清零。
e. NUR最近最不经常使用算法
NRU在需要淘汰某一页时,从那些最近一个时期内未被访问的页中任选一页淘汰。只要在页表中增设一个访问位即可实现。当某页被访问时,访问位置1。否则,访问位置0。系统周期性地对所有引用位清零。当需淘汰一页时,从那些访问位为零的页中选一页进行淘汰。如果引用位全0或全1,NRU算法退化为FIFO算法。


3.进行数据库设计时通常需要遵守哪些范式,请列出并说明?

第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。第一范式是为了要排除 重复组 的出现,所采用的方法是要求数据库的每个字段都只能存放单一值,而且每笔记录都要能利用一个惟一的主键来加以识别。

第二范式(2NF)是数据库规范化中所使用的一种正规形式,是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。它的规则是要求数据表里的所有数据都要和该数据表的主键有完全依赖关系;如果有哪些数据只和主键的一部份有关的话,它就不符合第二范式,就得把它们独立出来变成另一个数据表。同时可以得出:如果一个数据表的主键只有单一一个字段的话,它就一定符合第二范式。

第三范式(3NF)是数据库规范化中所使用的一种正规形式,用来检验是否所有非键属性都只和候选键有相关性,也就是说所有非键属性互相之间应该是无关的。满足第三范式(3NF)必须先满足第二范式(2NF)。第三范式和第二范式不同的地方在于,在第三范式里,所有的非键属性都必须和每个候选键有直接相关。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

BC范式(英语:Boyce-Codd normal form,缩写BCNF)是在第三范式的基础上加上更严格约束,每个BCNF关系是第三范式的子集,有从属关系。它的定义是:如果对于关系模式R中存在的任意一个非平凡函数依赖X->A,都满足X是R的一个候选键,那么关系模式R就属于BCNF。
BCNF与第三范式的不同之处在于,第三范式允许A是主属性(第三范式中不存在非主键被另一个非主键决定),而在BCNF中,任何属性(包括非主键和主键)都不能被非主键所决定。

解释:
与第三范式相比,一个是“任何非关键字段不能”,一个是“任何字段不能”,显然更严格了
侯选关键字或其部分字段不能传递依赖其他的侯选关关键字
注释:
侯选关键字:又叫侯选码,惟一标识一行数据,其真子集不能是侯选关键字,一个表可以存在多个侯选关键字,如用户表的username,userid
主关键字:又叫主键,主码,被选中的用来区分其它行的侯选关键字,一个表只有一个主关键字
部分依赖:(A,B)->C,D,如A->C,则C部分依赖A
传递依赖:A->B->C,则C传递依赖A

二、算法与程序设计题

1.寻找一个单向链表的中项,如果存在两个则返回前一个。请给出算法描述并给出代码实现。

#include <stddef.h>
struct listtype
{
    int data;
    struct listtype * next;
};
typedef struct listtype * list;
/* Find the middle element of the singly linked list sll. */
list find_middle(list sll)
{
    list slow = sll;
    list fast = sll;
    if (NULL == fast)
    {
        return NULL;
    }
    while (1)
    {
        if (NULL == fast->next || NULL == fast->next->next)
        {
            return slow;
        }
        slow = slow->next;
        fast = fast->next->next;
        /* Prevent that there is a loop in the linked list. */
        if (fast == slow)
        {
            return NULL;
        }
    }
}


2.在有N个正整数的集合S中:找出最大元素C,满足C=A+B,其中A,B都是集合S中元素。请给出算法描述、代码与时间复杂度分析。

算法描述:

1)将集合S中的数排序X1<=X2<=X3.............Xn;
2)

for(i=n;i>0;i--)
{
for(j=0,k=i-1;k>j;)
{
if(Xj+Xk>Xi)
{
      k--;
      cotinue;
}
if(Xj+Xk<Xi)
{
      j++;
      contiue;
}
A=Xj;
B=Xk;
C=Xi;
break;
}
例子:
1,4,7,10,11,13,15,18,34
34:1-18,4-18........15-18
18:1-15,4-15,4-13,7-13,7-11
结果:
A=7;B=11,C=18;


3.使用堆栈(Stack)来模拟队列(FIFO)功能,要求数据必须储存在堆栈内部。需要实现enqueue(入队),dequeue(出队),isEmpty(判空)三个功能,并给出单元测试。


三、系统设计题

1.手机推送服务设计,在各个手机端应用都需要一定的云控制能力,可以在某些情况下云端发送各种数据或者命令到手机端,例如发送一个强制升级的命令或者手机app配置变换的数据包,以及发送一个信息给特定人群(某个地区)

请设计一个以长链接为主的云端控制服务,为了聚焦主要问题,可以忽略低速手机网络(2g网络)手机终端等因素,用户登陆的需求。

服务需要承担定向、定量的推送需求,在设计中要尽量高的吞吐能力和容错能力

需要完成

a)基本的模块视图。

b)链接管理主要设计思路。单台机器承担更多链接,但是链接多了后管理链接(连接中断、链接查找)都会出现性能瓶颈,请尝试给出思路。

c)尝试给出提高容错能力(避免因为某台物理机器或者某个机器上的程序挂掉 导致整个系统不可用)的思路。

参考文献:http://lilhorse.me/post/20

抱歉!评论已关闭.