腾讯后台开发面试总结

总结腾讯后台开发所遇到的问题

大纲

Linux和操作系统OS

netstat命令:显示网络连接状态

  1. netstat -a:显示tcp、udp和unix协议下套接字的所有连接
  2. netstat -t:tcp协议连接
  3. netstat -u:udp协议连接
  4. netstat -n:默认netstat会通过反向域名解析技术查找每个ip地址对应的主机名,会降低查找速度,如果仅直到ip地址即可,可通过-n禁用域名解析功能
  5. netstat -l:只列出监听中的连接,-tl列出监听状态的tcp端口和连接,-ul列出监听状态的udp端口和连接,不能使用-al这会列出所有连接
  6. netstat -p:查看端口号的同时查看对应的进程名和进程号
  7. netstat -s:打印网络统计数据,包括协议下的收发包数量
  8. netstat -r:打印内核路由情况
  9. netstat -i:打印网络接口信息
  10. netstat -c:持续输出信息
  11. netstat -aple | grep +服务:可以查看http、smtp、ntp等服务是否在运行

tcpdump命令:即dump the traffic on a network根据使用者的定义对网络上的数据包进行截获的包分析工具。
tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

  1. tcpdump -c number:限制截获number数量的数据包
  2. tcpdump -q:精简模式显示

ipcs命令:报告进程间通信设施状态,包括共享内存,消息队列,信号量等

  1. ipcs -a:打印出当前系统所有进程通信方式信息
  2. ipcs -m -q -s:分别打印出使用共享内存、消息队列、信号进行进程通信的信息
  3. ipcs -t:输出信息的详细时间变化
  4. ipcs -p:输出创建ipc方式的进程ID
  5. ipcs -c:输出ipc方式的创建者、拥有者
  6. ipcs -u:输出当前系统下ipc方式的状态信息

ipcrm命令:移除一个消息对象、共享内存段、信号集,同时会将与ipc对象相关链的数据也一起移除,只有超级管理员,或者ipc对象的创建者才有这项权利

  1. ipcrm -M shmkey:移除用shmkey创建的共享内存段
  2. ipcrm -m shmid:移除用shmid标识的共享内存段
  3. ipcrm -Q msgkey:移除用msqkey创建的消息队列
  4. ipcrm -q msqid:移除用msqid标识的消息队列
  5. ipcrm -S semkey:移除用semkey创建的信号
  6. ipcrm -s semid:移除用semid标识的信号

关系系统命令方面的命令:

  1. top:实时显示进程状态
  2. ps -ef|grep +进程名:查看进程名的进程状态
  3. kill -9 +进程ID:强制杀死进程
  4. chmod u+x +文件名:给予文件运行权限
  5. find / -name “文件名”:搜索文件

关于文本编辑方面的命令:

  1. awk:报告生成器,格式化以后显示,对处理的文件数据生成报告
  2. sed:Sed是Strem Editor(流编辑器)缩写,是操作、过滤和转换文本内容的强大工具。常用功能有增删改查,过滤,取行。
  3. grep:文本搜集工具, 搜索文本,过滤文本字符串。

多线程和多进程的区别
进程是资源分配的基本单位,一个进程可以有多个线程,多个进程可以并发执行
线程是系统独立调度和CPU独立运行的基本单位,一个进程中的线程可以共享进程的资源

线程和进程的区别:

  1. 资源占用:进程时资源分配基本条件,线程不拥有资源只可以访问隶属进程的资源
  2. CPU调度:线程是独立调度的基本单位,同一进程的线程切换不会引起进程切换,不同进程的线程切换会引起线程切换
  3. 系统开销:创建撤销进程时,系统都要分配或者回收资源,如内存空间、IO设备等,开销大于创建撤销线程。进程切换时系统要保存当前CPU执行环境和新调度进程的CPU环境设置,开销大于线程切换时仅需保存和设置少量寄存器内容
  4. 通信:进程间通信(IPC)需要使用同步、互斥手段,保持数据一致性,线程则可以通过读写同一进程的数据段(如全局变量)进行通信

并发和并行的区别:
并发:系统的CPU小于线程数时,系统会将CPU运行时间划分为若干个时间段(时间片),分配给各个线程执行,一个时间段的线程代码执行时另外的线程处于挂起状态
并行:系统CPU大于同时运行的线程数时,每个CPU执行一个线程,多个线程不互相抢占CPU资源,可以同时执行

线程共享环境:进程代码段,进程共有数据(全局变量等),进程打开的文件描述符,进程的当前目录,进程用户ID,进程组ID
线程私有环境:线程ID,寄存器组的值(将当前线程的寄存器集合状态保存再线程重新被切换时能回复原本的运行状态),线程堆栈(保证调用的函数能正常执行不受其他线程影响),错误返回码,线程优先级

C语言辨别系统64位/32位:
位指的是操作系统的位数,在C中直观的就是指针类型占用的字节数,32位系统指针占32位即4字节,64位系统指针占64位即8字节
int main()
{
int bits= sizeof(char *);
if(bits == 4) printf(“32位\n”);
else if(bits == 8) printf(“64位\n”);
else printf(“others, bits = %d\n”, bits);
}

信号:
是Linux系统中用来通知进程发生了异步事件,它是一种进程间的通信通知机制。
[1,31]为Unix支持的传统信号,是不可靠信号(不实时,不支持排队(可能丢失)),[32,63]是扩充信号,是可靠信号(实时信号,支持排队)

产生信号:

  1. 终端组合键:如Ctrl+C发出信号2SIGINT,Ctrl+\发出信号3SIGQUIT
  2. 硬件异常产生的信号:如当前进程执行了除以0的命令,CPU运算单元产生异常,内核会将异常解释为SIGFPE信号发给进程;如当前进程访问了非法地址,MMU会产生异常,内核会将异常解释为SIGSEG发送给进程
  3. 调用系统函数向进程发信号:如kill命令、raise函数给当前进程发送指定信号、abort函数给当前进程发送SIGABRT终止信号
  4. 由软件条件产生信号:调用软件函数如alarm函数发送SIGALRM信号

接受信号产生的动作:

  1. 忽略此信号
  2. 执行该信号的默认处理动作(终止该信号)
  3. 执行自定义的信号处理函数处理信号,称作捕捉信号

核心转储Core Dumped:当⼀个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump。也叫核心转储,帮助开发者进行调试,在程序崩溃时把内存数据dump到硬盘上,让gdb识别。

数据库

SQL语句优化:

  1. 使用索引查询:具体方法有在where、orderby语句中涉及的列上建立索引,避免全表查询,在where语句中不使用!=、不进行null值判断、不用or连接、in用between代替、不对字段进行表达式或者函数操作等,以上都是使用索引不进行全表查询的注意点
  2. 适当使用索引:若索引列有大量重复数据时不使用索引,过多的索引会降低inset和update效率,一般的表中索引最好不超过6个
  3. 避免更新聚集索引:因为聚集索引数据列的顺序就是数据表的物理存储序列,若更新则会导致整个表的记录顺序调整,若频繁更新聚集索引数据列则需考虑是否将该索引建为聚集索引
  4. 用varchar代替char:节省空间、查询效率高
  5. 用数字字段代替字符字段:提升查询和连接性能,字符字段的查询和连接需要比较字符串中每一个字符,而数字仅需比较一次
  6. 避免大事务操作,提升系统并发能力

锁机制:

  1. 乐观锁:通过版本控制,实际上不加锁先执行,若执行完毕后版本号发生改变,则回滚重新执行
  2. 悲观锁:上锁,每次数据只有一个线程访问,其余的线程会阻塞
  3. 共享锁(lock in share mode):读锁,允许多个线程并发读取资源,不允许写入资源
  4. 排它锁(for update):写锁,会阻塞其他的读锁或写锁请求,确保同一时刻只能有一个连接可以写入资源,并防止其他连接读取或者写资源
  5. 区间锁:next key lock,锁定某个范围区间,如between 10 and 30
  6. 边界锁:gapLock,锁定某个边界
  7. 表锁:锁定整个表,影响整个表的读写
  8. 行锁:仅锁定某些行,其他行仍可以被其他链接请求读写

SQL事务的隔离级别:

  1. RU(Read Uncommited)未提交读:事务中的修改没有提交也对其他会话可见,会导致脏读(读取到一个事务未提交的数据,因为无法保证事务是否执行成功,因此读取到的数据不一定准确)
  2. RC(Read Commited)提交读:事务中的操作对其他会话不可见,但可能出现不可重复读(一个事务读取到的数据可能产生变化,同一个sql在一个事务中执行多次得到不同结果)
  3. RR(Repeatable Read)可重复读:事务中多次执行统一sql返回结果相同,mysql默认的隔离等级
  4. Serializable可串行化:事务中每次读取的行加锁,写加写锁