这里简单的必知必会的Linux命令在这里我就不说了,网上百度能找到一大推的教程,今天我主要分享一下关于Linux使用方面的经验和面试技巧。
道理如是,能动手尽量别“吵吵”!
面试是一个考验面试者的过程,是你在日常学习中使用过的技能和知识点的一个总结性考试,你和别人拉开差距的原因我们抛开运气和个人表达的因素,影响面试结果很大的原因是因为别人对于知识点的掌握更有层次,更具体,更熟练。作为一个开发者,一直以来我认为一个开发人员最重要的就是动手能力,不能纸上谈兵,你知道这个知识点和技能,但是缺乏实战,在面试的过程中就很有可能暴露出很多的漏洞被面试官逼问,然后原形毕露,所以,知而行之,我认为是提高技能和灵活应变的最重要的一个方式。
首先通过一个简单的面试给大家分享几个面试中的小技巧吧,这是小码来应聘东家携程的面经呦:
面试官:小码你好,做一下自我介绍吧。
小码:面试官,您好,我是来自XXX大学的本科应届毕业生,我的专业是网络工程,说起我的专业,我对它充满了浓浓的喜爱....balabalaba...具体的记不清了,我所有的面试基本都是使用的一套开场白,在这段开场白里,我给面试官透露了我对计算机行业的喜爱,我是怎么喜欢钻研(读源码呀、关注技术论坛、写博客、做项目、对于感兴趣的知识喜欢写小程序去测验等等),开场白要跟简历上你所擅长的技能挂钩,也是引起面试官的注意。自我介绍不可早早而过。是一个套路面试官的过程。
在我的开场自我介绍中,我其实是在暗示面试官:快看我博客,快问问我写过哪些有趣的小测验。
很遗憾,面试官没有问,但是这并不影响我去展示这方面,在面试的过程中要找到自我的节奏,想方设法的去吧自己擅长的东西展现在面试官的眼前。
面试官:用过select吗,他的原理是什么呢?
小码把select、poll、epoll精髓,把select和epoll的底层实现给面试官讲了一遍,其实到这里我的回答已经足够了,但是做为一个对知识融会贯通的面试者,我需要把我热爱钻研,概念落于实践的一 面展示出来,我回答完上面的问题之后,我们面试官说我还用epoll测试过单机最大支持的链接数是多少。
面试官:来来来,说一下你是怎么测试的。
你也能看出来,面试官的兴趣被你钩了起来,这就是你自己找到的机会。我是怎么回答的呢?
小码:测试单机支持的最大TCP链接数 这是我实实在在测试的过程,你感兴趣可以试一下,这个测试你可以给面试官展现这样几点:1、epoll你真的会用,不是停留在概念上。2、你喜欢钻研和实践、动手能力强。3、你通过网络相关的技能展示了linux网络调优方面的技能,一举三得。
面试官:你还做过其他有趣的测试吗?
这几个小测试你都可以动手测试一下,面试的时候给面试官讲解一下你测试的初衷、过程、结论,你的面试会很加分。
总结一下上面的面试,两个小技巧吧:
- 自我介绍就像写作文的索引,给下文做铺垫
- 面试中把握主动权,遇到相关的技能,举一反三,可以把自己平常的小测试,小兴趣表现出来。
好了下面进入正题,我们分享的是Linux相关内容
Linux操作系统面试常见问题
什么是大端和小端?如何判断一个系统是大端还是小端?
- 大端就是高位字节存放在内存的低地址段,低位字节存放在内存的高地址段;
- 小端就是低位字节存放在内存的低地址段,高位字节存放在内存的高地址段;
判断方式C++:
-
union {
-
short val;
-
char c[
sizeof(
short)];
-
} test;
-
test.val =
0x0102;
-
if (test.c[
0] ==
0x01 && test.c[
1] ==
0x02)
-
cout <<
"big endian" <<
endl;
-
else
-
cout <<
"little endian" <<
endl;
判断方式Java:
-
static {
-
long a = unsafe.allocateMemory(
8);
-
try {
-
unsafe.putLong(a,
0x0102030405060708L);
-
byte b = unsafe.getByte(a);
-
switch (b) {
-
case
0x01: byteOrder = ByteOrder.BIG_ENDIAN;
break;
-
case
0x08: byteOrder = ByteOrder.LITTLE_ENDIAN;
break;
-
default:
-
assert
false;
-
byteOrder =
null;
-
}
-
}
finally {
-
unsafe.freeMemory(a);
-
}
-
}
处理器的状态可以分为哪几种?
- 内核态,运行于进程上下文,内核代表进程运行于内核空间;
- 内核态,运行于中断上下文,内核代表硬件运行于内核空间;
- 用户态,运行于用户空间。
并行和并发有什么区别?
- 并行是指在同一时刻,有多条指令在多个处理器上同时执行,无论从微观还是宏观上来看,都是多个独立任务同时执行,适用于资源充足的情况,如多核;
- 并发是指在同一时刻只能有一条指令执行,但多个指令被快速地轮换执行,使得从微观来看不是多个独立任务同时执行,但从宏观来看是同时执行,适用于资源有限的情况,如单核。
程序编译的顺序是什么?
- 预处理:源代码经过预处理器,生成一个
.i
中间文件,这个阶段会把#include
的头文件内容进行替换,并处理宏定义; - 编译:
.i
中间文件生成.s
汇编文件; - 汇编:
.s
汇编文件经过汇编器生成.obj
目标文件; - 链接:
.obj
目标文件经过链接器,与lib
静态链接库和dll
动态链接库生成可执行文件。
库函数与系统调用有什么区别?
- 库函数属于语言或应用程序的一部分,而系统调用是内核提供给应用程序的接口,属于系统的一部分;
- 库函数在用户地址空间执行,运行时间属于用户时间,开销较小;而系统调用是在内核地址空间执行,运行时间属于系统时间,开销较大;
- 库函数采用缓冲区技术,可以在读写文件时减少系统调用次数,从而提高效率。
实际问题和Linux命令排查
内存占用过高
- 查看内存占用情况
-- free查看内存占用情况
参数:
- total:总计物理内存的大小。
- used:已使用多大。
- free:可用有多少。
- Shared:多个进程共享的内存总额。
- Buffers/cached:磁盘缓存的大小。
- #所以空闲内存=free+buffers+cached=total-used
-- cat /proc/meminfo
-- 查看进程的内存占用
pidstat -r -p 12345 1 5 这个命令结合top或者slabtop使用
top命令:
找到内存占用多的进程pid,使用pidstat查看进程的内存占用情况。
ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20
该命令查看内存占用最高的前20个进程。我们找到导致内存占用高的进程后,可以使用
kill命令将进程杀死。
cached占用过高问题
cached主要负责缓存文件使用, 日志文件过大造成cached区内存增大把内存占用完 。
Free中的buffer和cache:(它们都是占用内存):
- buffer : 作为buffer cache的内存,是块设备(磁盘)的缓冲区,包括读、写磁盘
- cache: 作为page cache的内存, 文件系统的cache,包括读、写文件
如果 cache 的值很大,说明cache住的文件数很多。
如何解决呢?
#常用方法是执行下面的命令
- sync
- echo 1 > /proc/sys/vm/drop_caches
- #清除后要还原系统默认配置:echo 0 > /proc/sys/vm/drop_caches
- #查看设置 sysctl -a | grep drop_caches
补充: echo 字符串 > 文件 就是把字符串内容从定向到文件中
然后可以重复上面查看内存的方式查看内存的使用情况。
cpu飙升,机器停止运作
我们不考虑进行重启
CPU飙升排查思路
1、使用vmstat查看CPU负载情况
// 每间隔2秒钟打印一次系统维度的CPU复杂情况 vmstat -n 2
参数
- r: 表示系统中 CPU 等待处理的线程。由于 CPU 每次只能处理一个线程,所以,该数值越大,通常表示系统运行越慢。
- us:用户模式消耗的 CPU 时间百分比。该值较高时,说明用户进程消耗的 CPU 时间比较多,比如,如果该值长期超过 50%,则需要对程序算法或代码等进行优化。
- sy:内核模式消耗的 CPU 时间百分比。
- wa:IO 等待消耗的 CPU 时间百分比。该值较高时,说明 IO 等待比较严重,这可能磁盘大量作随机访问造成的,也可能是磁盘性能出现了瓶颈。
- id:处于空闲状态的 CPU 时间百分比。如果该值持续为 0,同时 sy 是 us 的两倍,则通常说明系统则面临着 CPU 资源的短缺。
2、top -p按照cpu的占用情况排序显示,找到占用cpu高的进程,终止或者杀死进程,分析是代码问题还是硬件问题导致,从本质上解决问题之后,再重启进程。3、如何查看进程下哪个线程占用cpu较高?程序中导致cpu占用过高,往往是存在循环或者线程的任务过重等情况,通过上述方法确认了是java进程导致CPU飙升后,我们可以在终端通过jps
或者java进程的PID,然后在使用 top -H -p java进程pid 查看占用CPU较高的java线程。
jstack打印进程下全部的线程堆栈信息,查找CPU占用较高的线程的堆栈详情信息?
通过jps找到占用cpu最高的线程是24341
将24341这个十进制的pid转化为16进制的,方式如下
-
[root@VM_0_11_centos ~]# printf
"%x\n"
24341
-
5f15
然后使用jstack打印java进程的堆栈信息,查看0x5f15对应的具体堆栈信息
-
[root@VM_0_11_centos ~]# jstack
24040 | grep
5f15
-
"ContainerBackgroundProcessor[StandardEngine[Catalina]]" #
35 daemon prio=
5 os_prio=
0 tid=
0x00007fd53022b800 nid=
0x5f15 waiting on condition [
0x00007fd4fb0fd000]
可以看到这样显示的不全,那一般的话会先打印全部堆栈信息到文件中,在文件中查看
[root@VM_0_11_centos ~]# jstack 24040 > jstack.log
这样可以定位到具体是因为哪一行代码导致的cpu飙升,从而优化代码来达到目的。
netstat命令帮你真正的了解网络的状态变化
你总是在说TCP的三次握手、四次挥手,但是你真的理解吗,通过netstat命令结合链接实例你可以实时观察网络状态的转变,排查网络问题,这里提供一个我认为比较有学习价值的博客,我就不再次总结了,如果你需要测试程序,或者不知道如何测试,可以私信我、加我主页的交流群,进群交流。
掌握了上面的命令,面试的时候结合我提到的两个技巧,我想你会让面试官眼前一亮的,加油!!祝你拿到心仪的offer!!
转载:https://blog.csdn.net/lyztyycode/article/details/106148882