腾讯后台开发面试总结(1) - 图文 - 下载本文

前段时间专心面过腾讯,经过了N轮的技术面,结果还是挂了,但没挂在技术面,比较欣慰,回来之后写一点总结,以供有梦想进入腾讯做后台服务器开发的同学参考,本文章为胡成精心总结,胡成原创,copy和转载请通知。ps:()之内的文字由作者点评,非面试题文字。

linux和os:

netstat tcpdump ipcs ipcrm

(如果这四个命令没听说过或者不能熟练使用,基本上可以回家,通过的概率较小 ^_^ ,这四个命令的熟练掌握程度基本上能体现面试者实际开发和调试程序的经验)

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。

tcpdump命令用于监视TCP/IP连接并直接读取数据链路层的数据包头。

cpu 内存 硬盘 等等与系统性能调试相关的命令

uptime

我们可以使用uptime命令来监视Linux系统性能和状态, 这是一种非常有效的简单方法。uptime命令会显示在一定时间间隔内系统运行队列中进程的信息。通过这些信息可以大致地分析系统的工作负载。所以当系统性能下降时,首先应使用uptime命令来观察系统运行队列中进程的情况。

$ uptime

2:07pm up 11 days, 4:54, 9 users, load average: 1.90, 1.98, 2.01

在上面显示内容其中有用的信息是三个负载的平均值:1.90、1.98和2.01分别是前1分钟、5分钟和15分钟内的负载平均值。

系统管理员需要定期运行uptime命令以观察系统的平均负载值及其变化趋势。系统的问题往往通过上述数据反映出来。当系统负载增大时,说明多条命令被阻塞在内存和I/O系统中。这时需要检查系统的有关信息。一般Linux系统,负载为2和3 表示轻载,5和6

表示中等程度负载,10 以上为过载。不同系统的划分标准是不同的。系统管理员应根据实际情况确定自己系统中划分轻载和过载的界限。

19.2.2 free

使用free命令可以查看系统中内存空间的大小。内存是以KB为单位来衡量的。例如用户可以用free命令来获取系统内存空间的大小信息,命令如下:

$ free

Total used frdd shared buffers cached Mem: 95772 86748 9024 54480 5796 36164 -/+ buffers/cache: 44788 50984 Swap: 136512 7000 129512

在上面显示内容中,Mem行中的total栏显示了当前Linux正在使用的RAM总量。used栏显示的是被占用的内存空间,但Mem行与这一栏结合并不能产生最好的分析结果,因为其中包含了Linux分配给磁盘缓冲区的一部分分区。在大多数系统中,used栏显示的值和total栏的值相当。然而,我们可以核对used栏、-/+buffers/cache行对应的值来查看有多少内存处于使用状态(used栏、Swap栏对应的数值)。这一部分是作为内存来用的磁盘,而磁盘速度比内存慢,所以最好优先使用物理内存,交换内存则较少使用。

19.2.3 top

在本书第三章我们已经介绍过了top 命令,它可以动态实时的察看系统性能,分析CPU、内存的使用资源以及相关进程的信息等。关于top命令的具体的使用方法和命令参数这里就不再谈及了,如果读者还不了解,请参看第三章“ 3.5.6 top 命令”小节的内容。

top会显示系统现在的负载情况,如下所示: # top

2:58pm up 3:40, 1 user, load average: 0.00, 0.01, 0.00 37 processes: 35 sleeping, 2 running, 0 zombie, 0 stopped CPU states: 5.6% user, 1.6% system, 0.0% nice, 92.8% idle

Mem:190776K av,183588K used,7188K free,0K shrd, 80180K buff Swap: 385520K av,1476K used, 384044K free 65096K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 6 root 10 0 0 0 0 SW 0.5 1.7 0:18 find 9 root 9 0 1036 1036 860 R 0.3 0.4 0:00 top 1 root 8 0 100 84 52 S 0.0 0.0 0:03 init 2 root 9 0 0 0 0 SW 0.0 0.0 0:00 kevent 3 root 9 0 0 0 0 SW 0.0 0.0 0:00 kapmd 5 root 9 0 0 0 0 SW 0.0 0.0 0:00 kswapd 7 root 9 0 0 0 0 SW 0.0 0.0 0:00 bdflus 8 root 9 0 0 0 0 SW 0.0 0.0 0:00 kdated 9 root -1 -20 0 0 0 SW< 0.0 0.0 0:00 telnet

top显示的系统信息包括运行时间、进程的数量和状态、CPU周期的百分比和每个进程占用的存储空间、每个进程运行的时间,以及大量的其它信息。进程是按使用资源的多少来排列的,显示每5秒钟自动更新一次。在显示过程中,也可以按下空格键手动更新显示。在查找并解决系统性能故障时,这些信息是相当有用的。

在上面显示的信息中,大家可以看到显示的系统情况,运行中的进程有正在使用的top程序,它使用了0.3%的CPU和0.4%的存储空间;还有 find 进程使用了0.5%的CPU和1.7%的存储空间。而其它进程要么处于睡眠状态(S),要么处于睡眠并被换出状态(SW)。

19.2.4 vmstat

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

vmstat 命令我们也曾在本书第三章简单提及过,现在让我们详细了解一下它。

vmstat的语法为: vmstat [-V] [-n] [delay [count]]

其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。对于vmstat输出各字段的含义,可运行man vmstat查看。

当我们运行vmstat命令后,显示结果如下: $ vmstat

procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 0 0 0 1460 7768 79864 65040 0 0 12 10 103 25 1 0 98

设置修改权限 tcp网络状态查看 各进程状态 抓包相关等相关命令

tcpdump netstat ps??

awk sed需掌握

共享内存的使用实现原理

(必考必问,然后共享内存段被映射进进程空间之后,存在于进程空间的什么位置?共享内存段最大限制是多少?)

将一块内存映射到两个或者多个进程地址空间。通过指针访问该共享内存区。 一般通过mmap将文件映射到进程地址共享区。 存在于进程数据段,最大限制是0x2000000Byte

c++进程内存空间分布(注意各部分的内存地址谁高谁低,注意栈从高道低分配,堆从低到高分配)

ELF是什么?其大小与程序中全局变量的是否初始化有什么关系(注意.bss段)

使用过哪些进程间通讯机制,并详细说明(重点) makefile编写,虽然比较基础,但是会被问到 gdb调试相关的经验,会被问到

如何定位内存泄露?

http://my.oschina.net/kaixindewo/blog/28526 也可以用top实时观察

动态链接和静态链接的区别

动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。

而静态链接就是把所有用到的函数全部链接到exe文件中。

动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入;

而静态链接是把所有的代码和数据都复制到本模块中,运行时就不再需要库了。

32位系统一个进程最多多少堆内存

4G

Linux实现的是 虚拟地址的前3G供给用户态的进程. 后1G是内核的部分. 也就是用户态的进程不能访问0xc0000000以上的虚拟地址