面经题目

1.怎样通过进程号查看进程?

进程保存在/proc/pid,所以可以这样查看:ll /proc/pid

或 ps aux | grep pid(查看进程执行的文件) 或 ps -elf | grep pid

2.百度一面
自我介绍
画一下虚拟地址空间,然后说明一下
能结合画的虚拟地址空间说一下段错误吗
然后能说一下内存泄露吗,结合你画的虚拟地址空间来说
说一些linux下的命令
shell 编程(面试官好像很熟悉,很无奈答得他好像很不满意)
vim的用法了解多少(面试官好像也非常了解)
vector和list的区别,从底层实现包括内存管理来说,越细越好
算法题:
给一些数据和一个数,找到数据中相加等于这个数的两个数的下标,结果是唯一的
场景题:
服务器和客户端传输数据,可能会出现宕机、抖动等问题,想一些办法保证通讯的稳定性或者处理机制
还有一个场景题忘记了,准确来说我根本没听明白
面试官不太想了解我的项目一点没问,面试是一个面试官在一个房间,非常安静

(1)结合虚拟地址空间说一下内存泄漏

程序在运行期间,申请的堆内存不能释放(即程序并没有结束,而是申请了没有用它的时候),可以这么理解,在mm_struct结构体中,有一个指向vm_area_struct的指针,vm_area_struct是由链表串起来的很多个vm_area_struct,它们对应的是4G虚拟进程空间上的各个段。在链表里的每个节点描述每个区间的起始位置和结束位置,泄漏就是程序在运行时,申请了内存空间,程序不用的时候,也没有释放。申请是指要么挪堆指针,要么挪mmap指针,这两者会导致线性区间的变化。线性区间的那部分空间给你了,你用的时候,通过缺页中断会给你分真实的物理内存。(这里也就是通过线性区间去映射真正的物理内存)。那么,你用完后,需要释放,相应空间会回收,申请mmap的那部分空间会直接还给系统,向上挪指针的那种(?),能合并在一起的空间达到条件,堆才收缩。所以你申请了内存,在程序运行过程中,不用了,也不释放相应空间,堆不能收缩,mmap也不能断开映射,内存自然也回收不了。但要注意,程序结束了,无论内存是否释放,都会归还给系统。

对于虚拟地址空间的理解:

虚拟地址空间在内核的实现主要依赖于以下结构体:

1.pgd页目录项(分级页表:一共三级页表),里面存着虚拟地址空间中真正映射到物理内存页的映射关系。

2.vma结构体,这里主要保存着虚拟地址空间中大量的段,一个vma结构对应一个段它们是用链表串连起来的,这里的段有map映射的文件,heap,栈,包括从elf可执行文件映射的.bss、.data、.text段。

3.pages结构体数组,保存物理内存页的使用,和真正的物理内存大小有关(4k一个pages)

扩展:一个物理页为什么是4k大小?

段错误是说,你访问了内核为进程实现虚拟地址空间的vma结构体根本不存在,或者访问的权限不正确(读写,执行)。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@所谓伊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值