2014年10月22日网易游戏数据库系统工程师初面

http://blog.csdn.net/hellen1900/article/details/40421911

不得不承认网易游戏的低效,上个月27号,就笔试了,结果10月20日才通知我去面试,可能是备胎吧。

好吧,其实这是我第二次面试网易游戏的,第一次是今年五月份师兄内推的网易游戏QA实习,当时被问和很多什么都不懂。

如,(1)写一个单例;(2)写一个123的全排序;(3)http状态。其实都是不难的。

;3.会设计模式吗?写一个你最熟悉的设计模式?4.知道HTTP的状态码吗?

这一次面网易游戏,也没太大期待,因为我之前网申的时候是报游戏研发的,结果网易的hr打电话叫我换数据库系统工程师职位,

尼玛,好吧,数据库什么都不懂,不过为了有机会参加网易的笔试,也就同意了调岗,另外说道网易游戏的笔试,3个小时,做得狂抓啊。

《MySQL技术内幕InnoDB存储引擎》

好吧。笔试过了,其实只是做了一道算法题,面试的时候,面试官还在说我,怎么只做了一道算法题。

下面是面试的时候问到的:

(1)Linux进程间通信有哪些?

(2)有名管道具体的内部怎么实现的?

(3)共享内存有哪些?用过没有?

(4)说说(linux + apache+nginx+mysql+php)框架?

(5)Nginx和Apache的区别?

(6)Apache的rewrite为什么比Nginx强大?

(7)负载均衡策略还有哪些?

另外还聊了聊试卷上的数据库设计题。

大概这些吧。感觉答得不是很好,然后面试官叫我出去等等,然后就叫我回去了。

1.为什么要三次握手

TCP是一个面向连接的协议,所谓面向连接就是指通信双方任何一方向对方发送数据前,

必须将建立安全通道,就像打电话一样,必须要等到对方的手机响铃,并且对方接听电话时,才能与对方通信。

三次握手过程:

(1)第一次握手:建立连接时,客户端发送SYN包(假设序列号seq = x)给服务器,并进入SYN_SEND状态,等到服务器的确认;

(2)第二次握手:服务器收到SYN包之后,必须确认客户端,所以就要发送ACK包(ack = x+1),同时服务器还必须发送SYN包(seq = y),等客户端的确认,此时服务器进入SYN_RECV状态。

(3)第三次握手:客户端接收到SYN+ACK包后,向服务器发送确认包ACK(y+1),该发送完毕,此时客户端与服务器进入ESTABLISHED,两者就可以进行数据交换了,完成三次握手。

四次挥手过程:

(1)第一次挥手:客户端发送数据完毕后,发送一个FIN,提出断开连接要求。

(2)第二次挥手:服务器收到该FIN包后,对其作出响应,发送一个ACK包,确认这一方向的连接将关闭。CLOSE_WAIT/FIN_WAIT_1

(3)第三次挥手:等服务器的应用程序做好关闭准备时,服务器反向发送一个FIN包给客户端,请求关闭连接请求。LAST_ACK/FIN_WAIT_2

 (4)第四次挥手:客户机对服务器发送的请求进行确认,并发送ACK包 TIME_WAIT

2.为什么需要TIME_WAIT?

最后一次主机Host1发送的ACK可能丢失导致HOST2重新发送FIN消息,TIME_WAIT维护连接状态

另外,TIME_WAIT为连接中“离群的段“提供从网络中消失的时间。

3.同步与异步,阻塞与非阻塞的区别?

同步:是指在发出一个功能调用时,在没用得到结果之前,该调用就不返回,

也就是必须一件一件事做等前一件做完了才能做下一件事情。

异步:和同步相对,当一个异步过程调用发出后,调用者不能立即得到结果

实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

阻塞:阻塞调用时指调用结果返回之前,当前线程会被挂起。函数只有得到结果后

才会返回。

非阻塞:和阻塞是相对的,指在不能立即得到结果之前,该函数不会阻塞当前线程,

而会立即返回。

1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。 2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知

3. 阻塞,      就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。 4. 非阻塞,  就是调用我(函数),我(函数)立即返回,通过select通知调用者

同步IO和异步IO的区别在于:数据拷贝的时候,进程是否阻塞;

阻塞IO和非阻塞IO的区别在于:应用程序的调用是否立即返回。

4. select, poll和epoll的区别?

select的缺点:

(1)单个进程可监视的fd数量被限制,即能监听的端口大小有限。

(2)多socket进行扫描是线性扫描,即采用轮询的方法,效率低下。

(3)需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间传递

该结构时复制开销大。

 poll:

poll和select没有本质的区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态。

如果设备就绪则在设备等队列中加入一项并继续遍历,如果遍历完所有fd后,没有发现就绪设备,则挂起

当前进程,直到设备就绪或主动超时,被唤醒后它又要再遍历fd。

poll的缺点:

大量的fd数组被整体复制于用户态和内核地址空间之间。

没有最大连接数限制。

epoll_create

epoll_ctl

epoll_wait

epoll的优点:

1. 没有最大并发连接的限制

2. 效率提升,不是采用轮询方式。

3. 内存拷贝,利用mmap文件映射内存加速与内核空间的消息传递。

五,什么是数据库索引?

索引是一种提高数据库查询速度的机制,它是一个在数据库的表或视图上按照某个关键字段值,升序或降序排序创建的对象。

用户查询索引字段是,它可以快速地执行检索操作。

索引的类型有:聚集索引和非聚集索引

提高性能:

(1)通过创建唯一索引,可以保证数据库表中每一行数据的唯一性;

(2)通过索引,可以大大加快数据的检索速度;

(3)通过索引可以加速表和表之间的连接,从而有效实现数据的参考完整性;

建立索引注意:

(1)创建索引和维护索引要耗费时间,空间。

(2)每个索引需要占用一定的物理空间。

(3)对表中数据进行增加,删除和修改,索引也要动态地维护,从而降低了数据的维护速度。

六,MySql中的存储引擎

MyISAM索引实现:

(1)使用B+树作为索引结构,叶子节点的data域存放的数据记录的地址

(2)MyISAM的索引方式也叫”非聚集的“。

MyISAM索引的原理图:

主索引:

MyISAM辅助索引:

InnoDB索引实现:

(1)使用B+树作为索引结构,具体实现方式与MyISAM截然不同。

(2)InnoDB的数据文件本身就是索引文件,叶子节点data域保存了完整的数据记录

(3)InnoDB的辅助索引data域存储响应记录主键的值而不是地址

聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要

检索两遍索引:首先检索辅助索引获得主键,然后通过主键到主索引中检索记录。

InnoDB实现原理图:

主索引:

InnoDB的辅助索引:

七,GDB使用

> gcc -g mygdb.c

> gdb a.out

> b 4

> r

> bt       //查看运行时的堆栈

> p a    //打印变量a

> p b

>up

1. 加入断点:

break 行号

break 函数名

break ... if  

(1) list

(2) run

(3) countinue

(4) next

(5) step

(6) enter

(7) until

(8) info locals

(9) clear

多线程中:

info threads

threads IDX

break file.c 20 thread all

当程序奔溃时,内核有可能把该程序当前内存映射到core文件里,方便程序员调试。

> gdb core

用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的。

ulimit -c 1024

ulimit  -c  unlimited 调试的话输入: gdb filename core  filename就是产生core文件的可执行文件

八,Nginx和Apache区别

LNAMP = Linux + Nginx + Apache + MySQL + PHP

Apach服务器是重量级Web服务器,功能强大,而且性能稳定;

缺点:每建立一个网络连接就会创建一个进程;

Nginx服务器是轻量级Web服务器,处理静态Web十分出色,可以作为

负载均衡服务器,反向代理服务器,高并发。

(1)轻量级,占用更少内存资源,抗并发,异步非阻塞

(2)高并发下,能保存低资源,低消耗,高性能;

(3)高度模块的设计,编写模块相对简单;

Apache相对Nginx的优点:

(1)rewrite比Nginx的rewrite要强大;

(2)模块超多,少bug

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏idba

死锁案例之七

死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋...

7220
来自专栏搜云库

Spring Boot 中使用 RabbitMQ

一、什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器...

24090
来自专栏数据和云

MySQL 8.0.12 有什么新内容?

今年4月份,MySQL突然直接从8.0.5跳过多个版本号到8.0.11,直接宣布8.0.11 GA,告诉大家说,这个版本已经可以到线上用了。

14110
来自专栏liuchengxu

在 Golang 开发中使用 Makefile

使用 Golang 已经有一阵了,在 Golang 的开发过程中,我已经习惯于不断重复地手动执行 go build 和 go test 这两个命令. 不过,现...

25010
来自专栏nnngu

MySQL 存储过程的简单使用

首先创建一张 students 表 SQL脚本如下: create table students( id int primary key auto_in...

29940
来自专栏数据和云

故障分析:一则library cache lock问题处理

编辑手记:library cache lock 大家都并不陌生,在MOS上对该阻塞的一般成因描述为:一般可以理解的是alter table或者alter pac...

38750
来自专栏沃趣科技

初相识 | 全方位认识 sys 系统库

前阵子,我们的"全方位认识performance_schema"系列为大家完整的介绍了performance_schema系统库。在我们的发布计划中为什么要把p...

24930
来自专栏沃趣科技

Oracle Real Time SQL Monitoring

术语说明 TableQueue,消息缓冲区,在并行操作中使用,用于PX进程之间的通信,或者PX进程与QC进程之间的通信,是内存中的一些page,每个消息缓冲区的...

47380
来自专栏Debian社区

Postgres 10 开发者新特性

目前非常流行的RDBMS PostgresSQL已经在几周前发布了它的第10个版本。由于Postgres的可靠性、节约成本、成熟,当然还有它的开源,已经21岁的...

14920
来自专栏量化投资与机器学习

战斗民族开源神器ClickHouse:一款适合于构建量化回测研究系统的高性能列式数据库(二)

编辑部原创 编译:wally21st、 西西 未经允许,不得转载 Tutorial 对于一些私募、投资机构和个人来说,量化投资研究、回测离不开数据的支持。当数据...

2.8K60

扫码关注云+社区

领取腾讯云代金券