搭建一个后台服务器--引子

来源:互联网 发布:安卓手机数据恢复 编辑:程序博客网 时间:2024/06/05 16:28

最近去了几家公司面试,有一些大公司(比如企鹅)的考核内容真心弱智,考的都是些算法,尼玛,拿一个刚毕业的学生来做说不定也可以过的,看来本来就不是在招搞服务器的,举个例子,企鹅多个部门都曾出的一道题:如何知道集合A,B中的相关性。

意思就是哪些元素在A,B之中都有,哪些元素在A,B中不都出现。

其实解法很简单,学过算法的完全可以做到 。我们知道集合具有互异性,就是集合中的元素只能出现一次,可以建一个map< key, value >,是标准库的还是自建一个红黑树都无所谓,

将A,B集合中的元素当成key,各自遍历一次,插入map中,每次插入 value自增一次,最后再遍历一次map,所有 value = 2的key是A,B共有的,value=1的key是A,B相异的。

如果A,B中的元素是整数,而且很小,问题则退化成类似计数排序,解法如下:


A{ 2,4,6,10,7,25 } B{ 3,9,4,2,19,25 }

#define MAX_NUMint test( int A[], int a_len, int B[], int b_len ){int size, i, max, tp_key;int  *tmp;if( !a_len || !b_len ){return -1;}size = MAX_NUM * sizeof( int );tmp = malloc( size );if( !tmp ){return -1;}memset( tmp, 0, size );max = 0;for( i = 0; i < a_len; ++i ){tp_key = A[i];max = tp_key > max ? tp_key : max;tmp[ tp_key ]++;}for( i = 0; i < b_len; ++i ){tp_key = B[i];max = tp_key > max ? tp_key : max;tmp[ tp_key ] ++;}++max;for( i = 0; i < max; ++i ){if( !tmp[ i ] )continue;if( 1 == tmp[ i ]  ){printf( "%d is in A or B\n", i );}else{printf( "%d is in A and B\n", i );}}free( tmp );return 0;}




言归正传,其实算法应该是大家的基本功,考核算法应该也没有错,但既然招的是服务器架构开发,我想考核更多的是实战经验。

有一家中等公司的面试题不错,此系列博文将围绕它展开研究。

原题:时间同步系统开发需求

需求场景:客户端向服务器发起登录请求,鉴权通过后(为了简化工作,所有登录请求,只要请求参数里的用户名和密码不为空,都鉴权通过),客户端再向服务器请求当前系统时间,服务器返回当前系统时间后关闭连接。


要求:

1、传输层使用TCP协议,应用层协议不限。

2、可支持同时在线用户量:大于 2W。

3、并发性能:没有明确指标。

4、服务器端运行环境:linux 2.4以上内核版本;开发语言:C++/C。

5、客户端运行环境:不限;开发语言:不限。(可以很简单,不要求界面)

6、要求有模拟性能测试操作方法,如多客户端、多线程模拟同时请求等。

7、用真实代码。

8、不要求日志系统,但是要考虑在主线程打印屏幕引起的性能问题。


我就觉得要是哪个公司面试的时候能出得出这样的题目,那就应该很专业了,对面试的人也就可以算得上挑战了。

tcp 服务端-客户端通信的程序,网上一搜一大堆,大家可能都会写,但是并发量和容错性不一定能上得去,2W的并发量不是盖出来的,如果这道题目能够搞定,基本上服务器这块应该是难不倒了。

下面说说我应该怎么做:

首先是建立前后端的通信协议:

request:

username/password, 约定username与password  各占32个字节(联同末位0)

response:

time_t 格式


由于通信内容简单,选择二进制传输,而不选择http,当然如果要考考 http 协议的了解,那就另当别论了。

请回头对题目认真看看,或者自己也可以写写,这里没有放代码,是因为我打算连载,请关注啦。

下篇我给大家写客户端程序先。