(腾讯)后台开发面试题解答

上传人:xzh****18 文档编号:46727175 上传时间:2018-06-27 格式:PDF 页数:16 大小:540.26KB
返回 下载 相关 举报
(腾讯)后台开发面试题解答_第1页
第1页 / 共16页
(腾讯)后台开发面试题解答_第2页
第2页 / 共16页
(腾讯)后台开发面试题解答_第3页
第3页 / 共16页
(腾讯)后台开发面试题解答_第4页
第4页 / 共16页
(腾讯)后台开发面试题解答_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《(腾讯)后台开发面试题解答》由会员分享,可在线阅读,更多相关《(腾讯)后台开发面试题解答(16页珍藏版)》请在金锄头文库上搜索。

1、linux 和和 os: netstat :显示网络状态 tcpdump:主要是截获通过本机网络接口的数据,用以分析。能够截获当前所有 通过本机网卡的数据包。它拥有灵活的过滤机制,可以确保得到想要的数据。 ipcs:检查系统上共享内存的分配 ipcrm:手动解除系统上共享内存的分配 (如果这四个命令没听说过或者不能熟练使用,基本上可以回家,通过的概率较 小 _ ,这四个命令的熟练掌握程度基本上能体现面试者实际开发和调试程序 的经验) cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟练掌握,设置修改权限 tcp 网络状态查看 各进程状态 抓包相关等相关命令 必须熟练掌握 awk sed 需

2、掌握 共享内存的使用实现原理共享内存的使用实现原理(必考必问,然后共享内存段被映射进进程空间之后, 存在于进程空间的什么位置?共享内存段最大限制是多少?) 共享内存定义:共享内存是最快的可用 IPC(进程间通信)形式。它允许多个不 相关的进程去访问同一部分逻辑内存。 共享内存是由 IPC 为一个进程创建的一个 特殊的地址范围,它将出现在进程的地址空间中。其他进程可以把同一段共享内 存段“连接到”它们自己的地址空间里去。所有进程都可以访问共享内存中的地 址。 如果一个进程向这段共享内存写了数据,所做的改动会立刻被有访问同一段 共享内存的其他进程看到。因此共享内存对于数据的传输是非常高效的。 共享

3、内存的原理:共享内存是最有用的进程间通信方式之一,也是最快的 IPC 形式。两个不同进程 A、B 共享内存的意思是,同一块物理内存被映射到进程 A、 B 各自的进程地址空间。进程 A 可以即时看到进程 B 对共享内存中数据的更新, 反之亦然。 c+进程内存空间分布 (注意各部分的内存地址谁高谁低, 注意栈从高到低分配, 堆从低到高分配) ELF 是什么是什么?其大小与程序中全局变量的是否初始化有什么关系(注意未初始 化的数据放在 bss 段) 可执行文件:包含了代码和数据。具有可执行的程序。 可重定位文件:包含了代码和数据(这些数据是和其他重定位文件和共享的 object 文件一起连接时使用的

4、) 共享 object 文件(又可叫做共享库) :包含了代码和数据(这些数据是在连接 时候被连接器 ld 和运行时动态连接器使用的) 。 使创建共享库容易,使动态装载和共享库的结合更加容易。在 ELF 下,在 C+ 中,全局的构造函数和析构函数在共享库和静态库中用同样方法处理。 使用过哪些进程间通讯机制进程间通讯机制,并详细说明(重点) makefile 编写,虽然比较基础,但是会被问到 mkdir mf cd mf vim makefile hello.o:hello.c hello.h gcc c hello.o -Lm make ./hello gdb 调试相关的经验,会被问到 如何定位

5、内存泄露?如何定位内存泄露? 内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的、大小任意的(内存 块的大小可以在程序运行期决定) 、使用完后必须显示释放的内存。应用程序一 般使用 malloc、realloc、new 等函数从堆中分配到一块内存,使用完后,程序 必须负责相应的调用 free 或 delete 释放该内存块。否则,这块内存就不能被再 次使用,我们就说这块内存泄漏了。 C+程序缺乏相应的手段来检测内存信息,只能使用 top 指令观察进程的动态内 存总额。而且程序退出时,我们无法获知任何内存泄漏信息 使用 Linux 命令回收内存,可以使用 ps、kill 两个命令检测内存使用情

6、况和进行 回收。在使用超级用户权限时使用命令“ps”,它会列出所有正在运行的程序名称 和对应的进程号(PID) 。kill 命令的工作原理是向 Linux 操作系统的内核送出一 个系统操作信号和程序的进程号(PID) 动态链接和静态链接的区别动态链接和静态链接的区别 动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件, 因为有许多函数在操作系统带的 dll 文件中,当程序运行时直接从操作系统中找。 而静态链接就是把所有用到的函数全部链接到 exe 文件中。 动态链接是只建立一个引用的接口, 而真正的代码和数据存放在另外的可执行模块中, 在运行时再装入;而静态链接是把所有的代码和

7、数据都复制到本模块中,运行时就不再需要库了。 32 位系统一个进程最多有多少堆内存位系统一个进程最多有多少堆内存 多线程和多进程的区别(重点 面试官最最关心的一个问题,必须从 cpu 调度, 上下文切换,数据共享,多核 cup 利用率,资源占用,等等各方面回答,然后 有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存 器,否则悲催) 写一个写一个 c 程序辨别系统是程序辨别系统是 16 位位 or32 位位 法一:int k=0; if(unsigned int)k 63356) cout 5. 改变当前工作目录 进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目

8、录改变到 根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如 /tmpchdir(“/“) 6. 重设文件创建掩模 进程从创建它的父进程那里继承了文件创建掩模。 它可能修改守护进程所创建的 文件的存取位。为防止这一点,将文件创建掩模清除:umask(0); 7. 处理 SIGCHLD 信号 处理 SIGCHLD 信号并不是必须的。但对于某些进程,特别是服务器进程往往在请 求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵 尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进 程的负担,影响服务器进程的并发性能。在 Linux 下可以

9、简单地将 SIGCHLD 信 号的操作设为 SIG_IGN。 signal(SIGCHLD,SIG_IGN); 这样,内核在子进程结束时不会产生僵尸进程。这一点与 BSD4 不同,BSD4 下必 须显式等待子进程结束才能释放僵尸进程。 三 守护进程实例 守护进程实例包括两部分:主程序 test.c 和初始化程序 init.c。主程序每隔一 分钟向/tmp目录中的日志test.log报告运行状态。 初始化程序中的init_daemon 函数负责生成守护进程。读者可以利用 init_daemon 函数生成自己的守护进程。 linux 的内存管理机制是什么?的内存管理机制是什么? Linux 虚拟内

10、存的实现需要 6 种机制的支持: 地址映射机制、 内存分配回收机制、 缓存和刷新机制、请求页机制、交换机制和内存共享机制 内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址。 当用户程序 运行时,如果发现程序中要用的虚地址没有对应的物理内存,就发出了请求页要 求。如果有空闲的内存可供分配,就请求分配内存(于是用到了内存的分配和回收), 并把正在使用的物理页记录在缓存中(使用了缓存机制)。如果没有足够的内 存可供分配,那么就调用交换机制;腾出一部分内存。另外,在地址映射中要通 过 TLB(翻译后援存储器)来寻找物理页;交换机制中也要用到交换缓存,并且把 物理页内容交换到交换文件中,也要修

11、改页表来映射文件地址。 linux 的任务调度机制是什么?的任务调度机制是什么? 标准库函数和系统调用的区别?标准库函数和系统调用的区别? 1、系统调用和库函数的关系 系统调用通过软中断 int 0x80 从用户态进入内核态。 函数库中的某些函数调用了系统调用。 函数库中的函数可以没有调用系统调用,也可以调用多个系统调用。 编程人员可以通过函数库调用系统调用。 高级编程也可以直接采用 int 0x80 进入系统调用,而不必通过函数库作为中介。 如果是在核心编程,也可以通过 int 0x80 进入系统调用,此时不能使用函数库。 因为函数库中的函数是内核访问不到的。 2、从用户调用库函数到系统调用

12、执行的流程。 1) 假设用户调用 ssize_t write (int fields, cont void *buff, size_t nbytes);库函数。 2) 库函数会执行 int 0x80 中断。因为中断使得进程从用户态进入内核态,所以 参数通过寄存器传送。 3) 0x80 中断对应的中断例程被称为 system call handler。其工作是: i. 存储大多数寄存器到内核堆栈中。这是汇编代码写的。 ii. 执行真正的系统调用函数system call service routine。这是 C 代码。 iii. 通过 ret_from_sys_call ()返回,回到用户态的库

13、函数。这是汇编代码。 1、系统调用 系统调用提供的函数如 open, close, read, write, ioctl 等,需包含头文件 unistd.h。 以write为例: 其函数原型为 size_t write(int fd, const void *buf, size_t nbytes),其操作对象为文件描述符或文件句柄 fd(file descriptor), 要想写一个文件,必须先以可写权限用 open 系统调用打开一个文件,获得所打 开文件的 fd,例如 fd=open(/“/dev/video/“, O_RDWR)。fd 是一个整型值,每 新打开一个文件,所获得的 fd 为当

14、前最大 fd 加 1。Linux 系统默认分配了 3 个 文件描述符值:0standard input,1standard output,2standard error。 系统调用通常用于底层文件访问(low-level file access) ,例如在驱动程序中 对设备文件的直接访问。 系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。 系统调用发生在内核空间, 因此如果在用户空间的一般应用程序中使用系统调用 来进行文件操作,会有用户空间到内核空间切换的开销。事实上,即使在用户空 间使用库函数来对文件进行操作,因为文件总是存在于存储介质上,因此不管是 读写操作,都是对硬件(存储器

15、)的操作,都必然会引起系统调用。也就是说, 库函数对文件的操作实际上是通过系统调用来实现的。例如 C 库函数 fwrite() 就是通过 write()系统调用来实现的。 这样的话,使用库函数也有系统调用的开销,为什么不直接使用系统调用呢?这 是因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所 实现的数据操作单位而言) , 这时, 使用库函数就可以大大减少系统调用的次数。 这一结果又缘于缓冲区技术。在用户空间和内核空间,对文件操作都使用了缓冲 区,例如用 fwrite 写文件,都是先将内容写到用户空间缓冲区,当用户空间缓 冲区满或者写操作结束时, 才将用户缓冲区的内容写到内

16、核缓冲区, 同样的道理, 当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件媒介。 2、库函数调用 标准 C 库函数提供的文件操作函数如 fopen, fread, fwrite, fclose, fflush, fseek 等,需包含头文件 stdio.h。以 fwrite 为例,其函数原型为 size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),其 操作对象为文件指针 FILE *pf,要想写一个文件,必须先以可写权限用 fopen 函数打开一个文件,获得所打开文件的 FILE 结构指针 pf,例如 pf=fopen(/“/proj/filename/“, /“w/“)。实际上,由于库函数对文件的操作最 终是通过系统调用实现的,因此,每打开一个文件所获得的 FILE 结构指针都有 一个内核空间的文件描述符 fd 与之对应。同样有相应的预定义的 FILE 指针: stdinstandar

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题 > 高中试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号