擎天柱网络科技有限公司面试

      辛辛苦苦工作一年,最后没有调薪,可能是老板觉得疫情不太好找工作,所以没调薪吧。已成业务员。

      本来没打算换工作了,因为使用目前的框架工作一年了,相对熟悉,开始多了时间学点东西。(换工作是真的累,又要重新找房子,又要重新熟悉新的工作环境,在前面几个月基本上是别想着自己学点别的了,估计要被业务搞死)但是在boss上联系我了,我就也试试看看自己的水平了,最后被虐的体无完肤,好多个问题我都是不懂得。做一下记录。

      值得一提,面试官很好,整个面试的过程也比较放松,非常的尊重面试者,让人感觉公司氛围很棒。

      首先,先给做了一份很基础很基础的笔试题(但是我还是有些不知道)。因为我是视频面试的,就直接打开面试题,面试官直接听我表述。

1.简述数组和链表的区别,以及适用环境?

数组,连续空间,访问快。内存利用率不高。

链表,不连续空间,插入、删除速度快,查找慢,内存利用率高。

经常查找用数组,不确定大小,经常插入删除用链表。

 

2.简述哈希表的大致原理,冲突解决方案,以及适用环境?

     记录的存储位置=f(关键字)

     原理:就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。(或者:把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。)

     冲突:当数据量够大时,不同的关键字经过散列函数的计算得到了相同的散列地址。毕竟一个数组容量是有限的,这种可能性很大。

     冲突解决:

     1.开放定址法

      这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。

      2.再哈希法

       这种方法是同时构造多个不同的哈希函数:

       Hi=RH1(key)  i=1,2,…,k

       当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

       3.链地址法

       这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

       4.建立公共溢出区

       这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。

 

3.网络通讯协议中 TCP 协议 和 UDP 协议的 区别?

       基于连接与无连接:TCP基于面向连接,UDP基于面向无连接; 

       系统资源的要求:TCP占用的系统资源较多,UDP较少;

       程序结构较简单:TCP程序结构复杂,UDP程序结构简单;

       流模式与数据报模式:TCP是流模式,UDP是数据报模式;

       可靠性:TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

 

4.进程间通讯的方式有哪些,各自有什么优缺点?

       1.管道:管道分为有名管道和无名管道,其中无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,一般用于两个不同进程之间的通信。有名管道也是一种半双工的通信方式,但它允许无亲缘关系进程间的通信。

        无名管道:优点:简单方便;缺点:1)局限於单向通信2)只能创建在它的进程以及其有亲缘关系的进程之间;3)缓冲区有限;

        有名管道:优点:可以实现任意关系的进程间的通信;缺点:1)长期存于系统中,使用不当容易出错;2)缓冲区有限

        2.信号:信号是一种比较复杂的通信方式,信号产生的条件:按键、硬件异常、进程调用kill函数将信号发送给另一个进程、用户调用kill命令将信号发送给其他进程,传递的消息比较少用于通知接收进程某个时间已经发生

        3.信号量:信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同步。他常作为一种锁机制。因此,主要作为进程间以及同一个进程内不同线程之间的同步手段

        优点:可以同步进程;缺点:信号量有限

        4.消息队列:消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点。

        优点:可以实现任意进程间的通信,并通过系统调用函数来实现消息发送和接收之间的同步,无需考虑同步问题,方便;缺点:信息的复制需要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合

        5.共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。他往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。

        优点:无须复制,快捷,信息量大;缺点:1)通信是通过将空间缓冲区直接附加到进程的虚拟地址空间中来实现的,因此进程间的读写操作的同步问题;2)利用内存缓冲区直接交换信息,内存的实体存在于计算机中,只能同一个计算机系统中的诸多进程共享,不方便网络通信

        6.套接字:套接字可用于不同及其间的进程通信。

                    流式套接字:提供可靠的,面向连接的通讯流

                    数据包套接字:定义一种无连接的服务,通过相互独立的报文进行传输,是无序的

                    原始套接字:用于新的网络协议的测试

        优点:1)传输数据为字节级,传输数据可自定义,数据量小效率高;2)传输数据时间短,性能高;3) 适合于客户端和服务器端之间信息实时交互;4) 可以加密,数据安全性强
缺点:1) 需对传输的数据进行解析,转化成应用级的数据

 

5.数据库建立索引有什么优缺点?有哪几类常见的索引?

        优点:
        第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
        第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
        第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
        第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
        第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

        缺点:
        第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
        第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
        第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 

        常见类型:  

        index ----普通的索引,数据可以重复

        fulltext----全文索引,用来对大表的文本域(char,varchar,text)进行索引。语法和普通索引一样。 

        unique ----唯一索引,唯一索引,要求所有记录都唯一

        primary key ----主键索引,也就是在唯一索引的基础上相应的列必须为主键

6.常见的HTTP 请求方法有哪些,表示什么意思?

序号 方法 描述
1 GET

发送请求来获得服务器上的资源,请求体中不会包含请求数据,请求数据放在协议头中。另外get支持快取、缓存

、可保留书签等。幂等

2 POST

和get一样很常见,向服务器提交资源让服务器处理,比如提交表单、上传文件等,可能导致建立新的资源或者对

原有资源的修改。提交的资源放在请求体中。不支持快取。非幂等

3 HEAD

本质和get一样,但是响应中没有呈现数据,而是http的头信息,主要用来检查资源或超链接的有效性或是否可以可达、检

查网页是否被串改或更新,获取头信息等,特别适用在有限的速度和带宽下。

4 PUT

和post类似,html表单不支持,发送资源与服务器,并存储在服务器指定位置,要求客户端事先知

道该位置;比如post是在一个集合上(/province),而put是具体某一个资源上(/province/123)。所以put是安全的,

无论请求多少次,都是在123上更改,而post可能请求几次创建了几次资源。幂等

5 DELETE 请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截。如果是https协议,则无需担心。幂等
6 CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页

然后把数据返回回来,连接成功后,就可以正常的get、post了。

7 OPTIONS 获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。
8 TRACE

回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息。

 

 

 

 

 

 

 

 

    7.使用shell脚本统计~/src/下 .c结尾的文件的代码行数

    find . -name "*.c"|xargs cat|grep -v ^$|wc -l ^C

 

8.下述三个声明有什么区别?

char* const p;    定义一个指向字符的指针常数,即const指针,不能修改p指针指向别的变量,但是可以修改该指针指向的内容

char const* p;    此种写法和const char *等价

const char* p;    定义一个指向字符常量的指针,不能用ptr来修改所指向的内容(*p的值为const,不能修改)

 

9.char str1[] = "123";

char str2[] = "123";

const char str3[] = "123";

const char str4[] = "123";

const char* str5 = "123";

const char* str6 = "123";

char* str7 = "123";

char* str8 = "123";

 

cout << (str1 == str2) << endl;

cout << (str3 == str4) << endl;

cout << (str5 == str6) << endl;

cout << (str7 == str8) << endl;

cout << (str5 == str7) << endl;

打印结果是?

0,数组比较,地址比较

0,数组比较,地址比较

1,值比较

1,值比较

1,值比较

 

 

10.void* p1 = NULL;

char* p2 = "abc";

int* p3 = NULL;

double* p4 = NULL;

 

cout << sizeof(p1) << endl;

cout << sizeof(p2) << endl;

cout << sizeof(p3) << endl;

cout << sizeof(p4) << endl;

 

打印结果是?

 

都是4,指针大小为4

 

 

11.void print_size(char str[])

{

cout << sizeof(str) << endl;

}

char str[] = "12345";

cout << sizeof(str) << endl;

print_size (str);

打印结果是

 

6,4

 

12.struct A

{

char a0;

short b0;

int c0;

void* p;

int c1

short b1;

char a1;

}

 

cout << sizeof(A) << endl;

打印结果是?

 

20

 

 

13.char str[5];

strcpy(str, "12345");

上述代码有无问题,若有,请指出?

 

越界。

 

14.char* str = "12345";

str[0] = 0;

上述代码有无问题,若有,请指出?

 

对未知的地址进行赋值,有危险。

 

15.void alloc_memory(void* p, size_t s)

{

p = malloc(s);

}

 

char* str = NULL;

alloc_memory(str, 10);

strcpy(str, "12345");

上述代码有无问题,若有,请指出?

 

没问题

 

16.char* get_name()

{

char name[] = "hello kitty";

return &name[0];

}

上述代码有无问题,若有,请指出?

生命周期结束,返回引用无法获取想要的值。

 

     然后是面试的部分。只能大概记录出一些印象比较深刻的问题。

1.linux怎么查看i\o的占用。

     iotop

2.linux怎么查看单个线程的cpu占用,和cpu内存

     top -H -p [PID]   显示某个进程所有活跃的线程消耗情况 (-H设置线程模式)

3.如果你远程到服务器去,要敲一些命令,然后因为你的网络波动,你可能会断开网络,你怎么保证你敲的命令会被全部执行。

4.tcp如果保证消息传输的可靠。

     校验和、确认应答+序列号、超时重传、流量控制、拥塞控制

5.http属于哪一层。

     HTTP协议是属于应用层,与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的

6.linux你怎么查看日志,比如,我要查看100行至200行。

     head -n 200 filename | tail -n 100

7.一个系统,多线程,调用动态库的时候,内存会使用几份动态库的内存。

     多线程调用动态库时候,只会使用一份动态库内存

8.简述快速排序的原理。

     先从数据序列中选取一个元素,并将序列中所有比该元素小的元素都放在它的左边或者右边,在分别对左右两边费别用以上的方法处理知道每一个待处理的序列的长度为1

9.你的代码是如何测试的,如何保证代码质量的。

10.项目上线,出bug了怎么办。

    我目前使用的框架是支持hotfix的,一般会hotfix,如果严重的bug,就停服更新。

11.你在项目中,使用了哪些数据库,有什么区别。

     mysql,redis,

     1.从类型上来说,mysql是关系型数据库,redis是缓存数据库

     2.mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢。redis用于存储使用较为频繁的数据到缓存中,读取速度快

     3.mysql和redis因为需求的不同,一般都是配合使用

12.进程间通信使用哪些。

     信方式有管道、信号量、信号、消息队列、共享内存、套接字。都有用过,现在使用最多的是消息队列和套接字。

13.在使用python时,缺少相应的库,而你又不是root权限,你怎么办。

14.有没有使用过正则表达式。

     以前有使用过,现在很久没用了。

15.使用你没用过的语言开发你觉得怎样。

     当时回答,我觉得不是什么问题,就像我原来用c语言,现在用lua语言,我也是用了新语言开发。(应该回答,技术不能都是自己学过的,总要使用自己没用过的,工作我觉得都是这样)

16.你们的服务器是云服务器么,有没有关注一些云服务之类的。

     阿里云的云服务器。暂时没关注。

17.了解SSH么。

      应该是一种安全协议。具体不了解(SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。)

 

总结:整个面试下来,没有问过我一点项目上的东西,一点都没有,全部是一些基础,包括语言的基础,服务器开发的基础,linux命令的基础。从这点可以看出,面试官是非常的重视基础的。而我,应该也是不满足他们的需求的,在我看来,我只是个业务员,不过也是开了眼界,又了解了服务器开发需要学习的东西。擎天柱用的框架是自己写的,平常开发写业务也是用的脚本,是什么脚本我忘记了,只是知道是一种很像C语言的脚本,开发环境是linux不带界面的(我用的是ubuntu,带界面),也就是说一般开发都是在命令行下开发的,会这几大量的shell脚本(我觉得这应该算是比较纯正的oldschool开发,技术含量高),会远程到服务器上查询,甚至处理bug。

 

      我现在使用的框架下,经理早就搭建好一切,包括打包,部署,更新,一切的一切,都已经全部写好脚本,傻瓜式。在这里再次觉得经理真的是牛逼。我也丧失了很多能在工作中被动学习这些的路径。大多数码农都是再写业务代码,希望自己能有一些进步吧。

 

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