-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathkernel.txt
More file actions
897 lines (634 loc) · 48.9 KB
/
kernel.txt
File metadata and controls
897 lines (634 loc) · 48.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
--- 内核相关面试题目汇总 ---
// CPU 调度&进程管理
1、简单介绍下 O(1)调度算法
2、简单介绍下CFS算法,和O(1)算法的不同之处在哪
3、什么是IDT,有什么用
4、中断处理 和 内核态调用 哪个优先级高,为什么?
5、IPI是什么,有什么用?
6、pthread_mutex 默认情况下 对同一个锁 重复加锁两次 会有什么效果,为什么?
7、pthread_mutex 怎么实现? 使用了哪个系统调用?
(tips:futex)
8、可以在线程中调用fork吗?为什么?
9、内核是怎么处理僵尸进程的?
(tips:由init进程来回收僵尸进程)
10、ps的命令中,怎么知道哪个是内核线程(一般情况下),内核线程又是怎么实现的?
(tips:使用 ps -afx 可以查看所有的内核线程)
11、在内核中,怎么获取当前进程的 task_struct 结构?
12、为什么在spinlock的临界区中不能睡眠?
(tips:1 在临界区睡眠不符合spinlock加锁临界区快速执行的语义
2 有可能导致死锁)
13、为什么在中断处理程序中不能睡眠?
14、内核中使用较多的锁都有哪些?作用都有哪些?
15、简单解释下RCU?
(tips:和读写锁相同,多个读者之间可以并行访问,但有读者时,写者不用阻塞等待,可以新申请空间,
更新后再将原指针替换,具体做法依赖于优雅周期的判断,多个写者之间的同步? TODO)
16、解释下uptime命令的输出?具体的计算依据是什么?
(CPU run queue中 runnable进程和处于D状态的进程数量)
(tips:计算方式类似于统计时间段内平均值)
17、nice命令的作用有哪些?
18、进程的静态优先级和动态优先级的概念?
19、top 命令输出中 hi 列 si 列 分别代表什么?
20、mpstat 或者 sar 命令中 steal% 列代表什么意思?
21、解释下bogomips?
22、内核中表示时钟中断频率的常量值是哪个?在命令行中怎么查看?
23、后台服务器和桌面系统的时钟中断频率值有什么差别?为什么要这样设置?
24、chrt 作用有哪些?
25、简单解释下 CFS 调度算法中的vruntime概念?
26、fork 调用后 父进程先执行还是子进程先执行?
27、解释下 sched_yield 函数?
28、怎样查看系统是否支持cgroup?
29、怎样避免程序被调试执行(安全相关)?
tips:PTRACE_TRACEME & SIGTRAP handler & /proc/self/status
30、简单解释下 vsyscall & vdso ?
(tips:vsyscall是为了解决常用的time,gettimeofday等函数频繁调用时上下文切换过多的问题,
它提供了一种映射机制,将内核中的时间数据映射到用户态中。
vdso则更进一步,将这种映射封装为动态链接库,可以利用ADSR机制来对数据进行保护,
在/proc/$pid/smap中,可以通过dd来将vdso导出得到一个elf格式的库文件)
31、/proc/kcore文件有什么用?
32、/proc/kallsyms文件有什么用?
33、linux的线程实现方式?
34、简单描述下线程组中接收到信号的处理?
35、task_struct结构中pid,tgid的作用?
36、getpid(),gettid()实现?
(tips:getpid其实取的值是tgid,gettid取的值是pid,有点绕。其实还是和LWP的实现方式相关)
37、pthread_self() 又是怎么实现的呢?和上面两个函数的区别和联系分别是什么?
38、top命令显示中S列代表什么?"I"表示什么状态?
39、什么是内核抢占?什么是用户态抢占?在多核系统中怎么定义?
(tips:内核抢占即运行在内核态的进程被抢占,与之对应的是用户态抢占,这两个抢占发生的时间点不一样,
内核态抢占发生在从中断上下文回到内核态时,检查__preemp_count计数和need_resched标志,
用户态抢占发生在从系统调用返回用户态,从中断上下文返回用户态时,检查need_resched标志。
CFS调度算法中,在每次时钟中断的处理中,会判断当前进程是否运行的时间足够多,
或者是和下一个候选者的vruntime差距大于sched_wakeup_granularity_ns,那么就设置当前继承的need_resched标志位)
40、preempt_enable是一个抢占点吗?为什么?
(tips:在preemt_enable函数中,会尝试抢占执行,具体参考源码实现)
41、sysenter和sysexit指令实现了什么功能?
42、SCHED_FIFO SCHED_RR SCHED_NORMAL 三种调度策略有什么区别?
43、什么是DMA?
44、什么是RDMA?
45、什么是IPI?有什么作用?
46、CFS中通过什么方法来避免fork出的新进程总是优先于其他进程执行?
47、CFS算法中怎样保证长时间睡眠的进程被唤醒时(vruntime很小),不至于长时间占用CPU?
48、CFS算法中,进程从一个CPU上迁移到另一个CPU,对应的vruntime会不会变?为什么要这样做?
49、系统中最大进程数由什么控制?
(tips:之前的设计中,进程数量还受到GDT表项的限制,但现在没有这个问题了)
50、pread和pwrite在哪种场合下使用较多?
(tips:因为pread和pwrite的操作不修改对应fd的offset,所以在多线程读写方面有优势)
51、access_ok 宏有什么作用?
52、链接静态库时,单个.o文件中未引用的部分的优化方式是什么?
53、什么是LLC cache?
54、Intel 的 Skylake 和 Broadwell架构有什么区别,带来了什么影响?
55、spinlock怎么实现?(考虑多核情况)
(tips:当前内核中采用ticket-based算法来实现;
之前的实现是采用一个简单变量的0和1取值来判断是否加锁,这有一个问题就是在多核场景下,
之前加锁的CPU因为L1 cache中有缓存锁数据,导致其他CPU忙等,现在的解决方案类似吃饭排队拿好号牌,
当排队等待的CPU的号牌等于下一个可加锁的号码时,加锁成功)
56、Linux现在的实现中中断允许嵌套吗?为什么?
57、当内核现在正处于中断处理上半部时,后面来的中断怎么处理?丢掉还是?
(tips:pengding)
58、怎样禁止 ping 请求?
(tips: echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all)
59、系统重启后上述的禁止 ping 会失效,怎么解决?
(tips: 在 /etc/sysctl.conf文件中添加 net.ipv4.conf.icmp_echo_ignore_all=1)
60、nice值在 O(1) 和 CFS 算法中有什么不同的含义?
61、oops 和 panic 一样吗?
(tips:不一样,在硬中断或软中断中,如果oops,那么肯定panic,即内核崩溃,如果是在进程上下文中,那么发送SIGSEGV信号,如果配置了oops_on_panic选项为1,那么在oops中内核也会崩溃。总结就是 oops 不一定会引起 内核 panic)
62、write被中断打断后,会返回什么?ERRNO又会是什么?
(tips:尤其是在处理网络请求时要注意)
63、上下文切换有哪几种?都有哪些寄存器参与了上下文切换?
(tips:具体有进程上下文切换,中断上下文切换,线程的上下文切换
进程的上下文切换中,TLB尤其重要;中断上下文中涉及到了很多和
中断标志等有关的信息的保存;线程上下文切换则相对比较轻量)
64、怎样查看进程具体的上下文切换数据?
(tips:pidstat -w 参数可以查看上下文切换是自愿还是被动
更加具体的中断信息,需要查看/proc/interrupts文件中数据)
65、top 或 pidstat中展示的CPU使用率信息怎么计算?
(tips:通过/proc/cpu 信息计算或者 /proc/{pid}/stat
计算方式其实是1-TimeIdle/TimeTotal)
66、 内核线程和用户线程有什么区别?
(tips:1 创建方式不同,用户态线程通过clone或fork创建
2 内核线程没有自己的栈空间,使用内核栈,且使用上一个进程的内存空间
3 内核线程一直运行于内核态)
67、怎样做到进程不重启 而升级库文件版本?
(tips:使用dlopen得到所有使用的接口函数指针,然后替换文件(这一步是安全的,因为对应库文件已经映射到内存中,
磁盘文件的修改不会影响程序运行),然后向进程发送信号等方式来通知,
进程等到所有引用这个接口的处理完成后,再重新dlopen保存新的函数指针)
68、PID的选择策略是什么?
(tips:从上一次使用的PID往后查找到PID_MAX,如果没找到,再从头开始查找,
但是并不是从0开始,而是从300,因为0~300预留给了系统进程使用)
69、PID_MAX的取值是多少?
(tips:32位系统和64位系统的取值不一样,32位系统大概在32768,64位系统在4MB)
70、fork调用后,父进程在调用前打开的文件,子进程可以看到吗?
(tips:可以,fork实现中的do_fork拷贝了文件描述符,但是两个打开文件表指向的是相同的file结构,
那么文件偏移量也是共享的,但是之后子进程打开的文件,两者不共享)
71、什么是僵尸进程?
(tips:在进程结束后,task struct 结构不是直接回收的,而是要以SIGCHLD信号通知父进程,
父进程调用wait方法获取到退出状态后,子进程才算完整的结束,对应结构也会被回收。
如果不想被回收,那么通常的做法是调用两次fork,第二次fork的父进程在子进程之前退出,
显示的告诉内核不由父进程负责回收)
72、wait waitpid的实现?
(tips:等待子进程退出,并获取退出状态,子进程的退出值在 exit 字段中表示)
73、exit函数的参数取值有什么约定?
74、如果线程组里面,非主线程的线程退出,需要通知父进程吗?
(tips:不需要,task_struct结构直接回收)
75、接上面的题目,如果主线程先于其他线程退出,那么由谁来给父进程发信号?
(tips:由最后一个退出的线程来完成这个工作)
76、父进程怎样获知 子进程的执行结束?
(tips:一种是由 子进程通过信号来通知;另一种是 父进程通过wait后,将自己挂入等待队列,
子进程退出时,再唤醒父进程等待队列里面的进程)
77、为什么spinlock临界区不允许发生抢占?
(tips:因为有可能导致死锁)
78、系统中的mutex实现了自旋等待,即加锁失败时,并不是立即加入等待队列,而是尝试自旋等待持有锁的调用者释放锁
79、系统中的mutex和futex有什么区别?
(tips:1 mutex的锁在内核中,futex的锁在用户态中
2 mutex的锁内核只是做了加锁或睡眠等待,futex明确告诉内核调用者的一个期望
3 两者都有实现唤醒和睡眠)
80、进程收到SIGKILL后,会有dump文件吗?
(tips:SIGKILL信号系统的默认行为为终止对应进程,没有dump文件产生,
但是,当收到SIGTERM信号时,有dump文件产生)
81、OOM时的进程选择机制是什么?
(tips:根据/proc/${pid}/oom_score来选择一个值最大的进程,一般来说,
内存占用量高的进程这个值较大,但是如果是 root 用户的进程,会减去30分,
因为内核认为root用户的进程重要性更高,如果有CAP_SYS_ADMIN权限,
则会减去 score的 3%)
82、barrier的作用是什么?
(tips:乱序访问分为 编译时乱序和执行时乱序,编译时乱序通常由高级别的优化引入,例如 -O2,
编译乱序可以通过内嵌汇编的方式解决;
执行时乱序则需要通过CPU相关的fence指令来避免;
单CPU执行时,不存在执行时乱序,但是有可能有编译时乱序,
这里可以参考内核里面相关mb()函数的定义)
83、/proc/${pid}/oom_adj 作用是什么?
(tips:计算oom_score的一个参考数值)
84、/proc/${pid}/oom_score_adj 作用是什么,和上面的变量的区别是?
(tips:oom_score_adj是一个新的参数数值,oom_adj的取值范围为 -17~+15,
oom_score_adj的取值范围为 -1000~+1000,且系统建议使用新的oom_score_adj)
85、OOM时发送的信号是什么?
(tips:发送SIGKILL信号)
86、添加cgroup规则后,超过内存使用限制会OOM吗?
(tips:cgroup中OOM是默认开启的)
86、SIGKILL 和 SIGSTOP 两个信号不能被忽略,也不能由应用使用自定义信号处理函数捕获
87、MSI 和 MSI-X 表示什么?
(tips:一种新的中断通知方式,主要用于网卡中断)
88、sched_min_granularity_ns 表示什么意思?
(tips:表示每个进程可以运行的最小时间片,
CFS算法中每个进程可以运行的时间片相同)
89、sched_latency_ns 表示什么意思?
(tips:表示运行队列中所有进程都运行一遍需要的时间,
当nr_running*sched_min_granularity_ns > sched_latency_ns 时,sched_latency_ns需要调整
为 nr_running * sched_min_granularity_ns)
90、sched_wakeup_granularity_ns 表示什么意思?
(tips:当前运行进程的vruntime 和 抢占进程的vruntime 的差,
大于 sched_wakeup_granularity_ns所表示的vruntime时,可以抢占)
91、为什么CPU访问寄存器快于访问内存,因为访问寄存器只需要一个时钟周期,
而访存需要多个时钟周期才能拿到数据
92、系统级的load数据从哪里来?
(tips:uptime等工具可以查看当前系统的load,这个数值正比于
active process 和 处于 uninterruptable状态的进程,
load = old * e + (1-e)*processes,即也会参考前一次的load数据
所以说,如果通过命令看到系统负载高,不一定是CPU繁忙,也有可能是
系统I/O繁忙,更多的进程在等待着从磁盘等设备读取数据,
系统的负载有两种,一种是CPU,一种是IO,uninterruptable状态的进程就是反馈系统
的IO情况)
93、操作系统中并没有为cgroup添加专用的system call,而是通过 cgroup fs来完成
进程的资源隔离操作
94、内核会为每个cpu启动一个优先级很高的实时内核线程watchdog/x,尝试每5s调度一次,更新时间戳,
如果对应线程长时间没有被调度执行,则打印soft lockup告警
95、同样内核会为每个CPU启动一个高精度的timer来检测中断的执行是否被长时间阻塞,这个timer默认每4s触发一次来更新时间戳
96、kill -0 $pid 可以用来检测给定的进程是否存在(不发送任何实际的signal),对于一些有pid文件的服务来讲,
可以通过判断 kill -0 `cat /var/xxx.pid` 命令的返回值来确认对应的进程是否存在
97、lazy FPU context switch
(tips:Intel CPU 支持lazy FPU context switch的特性,在没有使用FPU的进程进行切换时,
不用保存涉及浮点数运算的寄存器
当进程确实用到了浮点数运算时,会触发一个异常,然后下一次的context switch会保存浮点数寄存器
不过这个功能好像有安全风险)
98、应用层使用spinlock需要注意什么?
(tips:应用层的spinlock在lock时,不关中断,这是与内核实现最大的不同;而这也导致用户态的
程序在拿到lock后,可能因为外部中断的原因而delay,这时另一个cpu上的程序就陷入了空转,浪费CPU资源,
解决办法就是拿锁失败后sleep,而sleep又会有上下文切换的开销,与spinlock的高效不符,当前系统mutex基于
CAS已实现的足够高效)
// 内存管理 mm
1、malloc的实现
(tips:malloc申请空间时,直觉上进程不会触发sleep逻辑,因为申请的是虚拟内存,
但是需要注意,内核有可能申请vma_area结构,在申请时用的GFP_KERNEL标志,
这有可能sleep,所以整体上 malloc 有可能sleep;C++的 new 因为是在malloc之后在对应内存写入数据,
触发缺页中断,这就有可能导致当前进程sleep,甚至OOM)
2、简单介绍下 tcmalloc 或 jemalloc 或 ptmalloc
(tips:tcmalloc在申请内存失败时,直接abort了当前进程)
3、简单介绍下 buddy system
4、简单介绍下 slab
5、内核初始化时使用的内存分配算法是什么?
6、内核的一级页表和二级页表分别存放在哪里?
7、slab是怎样避免内存碎片的?
8、slab分配的是物理内存还是虚拟内存?
9、buddy system 分配的是物理内存还是虚拟内存?
10、简单解释下slab着色?
(tips:通过计算slab各个object在缓存行的偏移来避免在cache line被换出时,
影响其他object的cache 命中率)
11、匿名页面和文件缓冲页面有什么区别?
12、解释下什么是 NUMA?
(tips:传统的总线模型,在CPU数量增多时,对应的总线长度越来越长,
位置靠后的CPU访存延迟增高)
13、使用哪个命令来查看NUMA信息?
(tips:numactl命令
numactl --hardware or numactl --show)
14、/proc/interrupts 文件内容解释?
15、应用程序中怎样将虚拟地址转换为物理地址?
16、简单描述下 /proc/{pid}/pagemap? -> Q:15
17、为什么malloc的实现中,大于128K的内存使用mmap?
18、什么是内存巨页?相比于传统的页大小有什么优势?
19、简单描述下hugetblfs?
20、怎样查看系统是否开启了巨页?
21、什么是PAE,有什么作用?怎么实现?
(tips:PAE表示物理地址扩展,解决了32位虚拟地址在大于4G环境下,仍然只能映射4G物理地址的问题
具体细节是,32位地址的高两位用来选择页目录表表项,接下来的9位表示页目录项,
再接下来的9位表示页表项,剩下的12位仍然表示页内偏移;页表项扩展为64位,从12到35位表示物理地址前缀
这样 24 + 12 = 36,可以表示64GB物理地址空间)
22、CPU的 CR3 寄存器存放的是什么?
23、Linux的页表访问分为几个层级?具体实现方式?
24、什么是swap,有什么作用?
(tips:将内存物理页面写回backup storage,减轻内存压力,写回时,
需要修改页表内容,通过PTE表项可以拿到对应虚拟地址对应的在swap中的
物理页面内容。
2.6 内核针对多个连续页面内容新增了 extent 属性,可以向文件系统那样
操作多个连续物理页面
线上有可能不开swap,因为swap会带来额外的磁盘IO,会引起应用进程延迟增加,
同时,swap的读回又会带来随机IO)
25、什么是内存overcommit?
(tips:操作系统向外提供的内存总量比 RAM+Swap 多,这里有一个假设就是,
应用申请的一些内存并没有使用,或使用了很快释放,当触发缺页中断时,
还是要申请物理内存,并且要考虑OOM机制的影响)
26、系统可配置的处理overcommit策略都有哪些?
(tips:vm.overcommit_memory和vm.overcommit_ratio proc变量的取值
具体修改的是/proc/sys/vm/overcommit 和 /proc/sys/vm/overcommit_ration 这两个文件中的内容
其中overcommit=0,mmap传入MAP_NORESERVE则不进行参数检查;如果为1,表示允许overcommit;
如果为2,可以使用的最大虚存为Swap+RAM*overcommit_ration/100,且不允许超过这个限制)
27、怎样判断进程有overcommit行为?
28、系统内存空间紧张后的回收策略都有哪些?
29、kswapd 线程有什么作用?
30、什么是同步回收,什么是异步回收?
31、什么情况下会启动kswapd线程?
32、kswapd是否是多线程的?
(tips:大多数系统上为单线程,但已经有人提出了多线程版本的patch)
33、kswapd 消耗CPU过高的问题怎么解决?
34、vm.swapiness 系统参数的作用是?
35、swapoff 和 swapon 命名有什么作用?
36、/proc/sys/vm/drop_caches 传入 1 2 3 分别代表什么?
(tips:1 表示只回收pageCache,
2表示通过回收dentries和inode占用的slab空间,
3表示上述两个都回收,
回收的方法是写回dirty数据,然后free占用的内存空间)
37、缓存一致性协议有哪几种实现方式?
(tips:基于目录的MESI实现和基于总线通讯的实现)
38、Power系列CPU 和 x86CPU 的比较?
39、split lock是什么?
(tips:MESI协议只能保证Cache line的数据一致性,而如果数据跨越了Cache line,则仍然需要锁总线,这就是split lock,
不利于性能提升)
40、什么是 Power Virsus?
(tips:指一类高功耗程序,CPU热量增加,触发THP,CPU会强制降频,这在多租户的情况下,会影响其他VM)
41、Intel RDT 技术,实现了高速缓存、内存带宽级别的资源隔离,具体包括,CMT(高速缓存监控),CAT(高速缓存分配),
MBM(内存带宽监控),代码和数据优先级(CDP)
42、touch 命令的作用?
(tips:touch命令更新文件的access time 和 modify time,这在make编译程序时常用,在不修改文件内容的情况下,
触发重编译)
43、编译器如何处理inline函数中的static变量?
(tips:这里的处理和inline函数本身没什么关系;带有extern属性的函数,编译器保证多次调用函数时,static变量指向的是同一个对象,
如果是internal类型的inline函数,就更能保证这一点。static函数中的static变量在不同的编译单元中都有一份定义)
44、flock对于dup操作的特点是?
(tips:dup操作后,因为使用的是同一个打开文件,所以仍然共有flock属性),如果一个文件被打开多次,
那么就是不同的文件描述符,所以锁是独立的。一个文件flock后,后续的其他打开文件不进行flock操作也可以进行正常的读写,
所以说flock是一种逻辑锁。
45、dmesg命令的作用是?
(tips:dmesg查看内核中的环形缓冲区信息,可以获得如CPU、硬盘、网卡等设备的信息)
46、什么是 cc-NUMA ?
(tips:即保证数据一致性的NUMA架构,主要的是Cache的数据一致性)
47、NMI中断表示什么意思?
(tips:NMI表示Non-Mask Interrupt,即不可屏蔽中断,不可以通过CLI设置标志寄存器的IF位而忽略)
48、CPU本身是否支持中断优先级?
(tips:CPU本身是有支持中断优先级的,但是位于同一个优先级内的多个中断的处理可能与CPU型号有关)
49、为什么两次mmap同样的地址,没有报错?
(tips:因为第二次mmap时,会先unmap之前的映射,然后再次尝试mmap)
50、DR0 ~ DR7寄存器的作用?
(tips:硬件断点的实现)
51、IVT 和 IDT有什么区别?
(tips:IVT是中断向量表用来在实模式下处理中断,IDT是中断描述符表,用来在保护模式下处理中断)
52、malloc刚申请的内存内容显示“烫”表示什么?
(tips:调试模式下保护程序访问未初始化的内容内容,其实质是 int 3指令,用来触发调试)
53、写时复制(COW)是通过什么实现的?
(tips:通过缺页中断来实现)
54、缺页中断会发生在内核态吗?为什么?
55、内核中struct page 并没有指向具体内存的指针,那么page对应的存储空间怎么表示?
56、struct page结构中的 _count 和 _mapcount 有什么区别?
(tips:_count表示内核中引用当前页面的数量,_mapcount表示有多少个进程映射了当前页面)
57、反向映射的技术实现是?
(tips:早期通过遍历进程来实现,效率较低,之后的实现方法是父进程中有一个链表用来保存共享页面,
如果需要从page找到对应的进程,则遍历这个链表,更新的实现是通过一个中间结构来衔接父进程和子进程,
映射的共享页面加入到红黑树中加快查找过程。)
58、怎么判断一个page是匿名映射还是文件映射?
(tips:page结构中的mapping字段的低两位有对应的掩码来标识当前页面的匿名页面还是文件映射页面)
59、反向映射的典型应用场景有哪些?
(tips:kswapd内核线程回收页面时,页面迁移时,需要重新映射对应的PTE表项)
60、什么是KSM页面?
(tips:KSM页面是指Kernel Shareable Merge页面,由madvise函数创建,且使用MERGEABLE标志)
61、KSM页面的使用场景是?
(tips:有研究指出,在多虚拟机环境下,虚拟机主要使用的是匿名页面,且各个页面映射的物理页面的内容一样,
这就可以合并页面,释放多余的物理页面)
62、KSM具体实现细节是?
(tips:首先通过madvise创建的页面加入到对应的KSM 链表,然后扫描stable树,找到候选的页面,
通过校验和机制来确定物理页面是一样的,然后修改PTE指向,这里需要注意,当修改多个PTE指向相同物理页面后,
该页面需要执行COW,即当有人修改时,还是需要分离页面)
63、如果用户空间使用 PROT_READ 来mmap映射一个文件到用户空间,然后使用memcpy来写这段内存空间,会发生什么?
(tips:内核会检测到权限不匹配,产生对应的段错误)
64、假设在内核空间获取了某个文件对应的page cache页面的struct page数据结构,对应的VMA是只读的,
那么内核空间是否可以修改该page的内容呢?
(tips:可以,内核空间和用户空间使用的PTE不一样,内核利用KMAP机制映射页面是可写的)
65、如何由mm数据结构和虚拟地址vaddr 找到对应的VMA?
(tips:vma记录在以起始地址为key的一个红黑树中,所以只需要查找这个红黑树就可以找到)
66、如何由page和VMA找到虚拟地址vaddr?
(tips:page->index记录了vma中的偏移量,加上vma->start_addr)
67、如何由page找到所有映射的VMA?
(tips:反向映射的实现)
68、如何由VMA和vaddr找出相应的page数据结构
(tips:根据vaddr 在页表中查找到pfn,然后在全局page数组中根据下标访问)
69、什么是OOM?
(tips:内存紧张时,向进程发送SIGKILL信号)
70、flock的实现?
(tips:flock是基于struct file结构中的flags实现的,本身并不基于inode中的锁,但是,
考虑到同一个文件可能在不同进程中open,包括同一进程open多次,具体实现中是在inode中以链表的形式来
保存锁信息)
71、flock锁定的文件,是否可以unlink?
(tips:可以,不影响)
72、内核在面对多核系统时,都可能有哪些瓶颈点?
(tips:CPU级别的负载均衡,per-cpu runqueue,合理使用IPI机制,内存分配中的锁的合理使用,NUMA环境下的内存分配,
I/O队列的per-cpu设计,网络收发队列的per-cpu设计,各个统计计数功能的per-cpu设计)
73、在64位系统中为什么不存在高端内存的概念?
(tips:因为在64位系统中,内核可以使用的内存有128T,而机器上真正安装的内存大小小于这个数值,
所以用不到高端内存)
74、x86 和 x86_64 系统中 zone 的表示有什么不同?
(tips:x86_64系统中不存在 ZONE_HIGHMEM,如果外设可以访问高于16M且小于4G空间时,增加ZONE_DMA32)
75、用户空间进程是否有高端内存概念?
(tips:没有)
76、为什么不把所有地址空间分配给内核使用?
(tips:因为没有这个必要,不是所有的程序都需要运行在内核态,即用户态访问用户态数据,内核态访问内核数据)
77、rename 函数时原子的吗?
(tips:查看man page 这个函数是原子的执行的)
78、内核栈空间一般多大?
(tips:8KB,两个页面大小)
79、getpid 和 gettid 分别返回什么?
(tips:POSIX规定,同一个线程组内的线程共享一个PID,但是Linux内核为每一个线程都分配了不同的PID,为了满足协议要求,
就添加了thread group id的概念,这样,getpid 返回的其实就是 thread group id,而gettid返回的是线程真正的PID)
80、面试题,for循环,然后调用 fork,回答打印的字符数量?
(tips:如果打印在前,fork在后,那么数量就是以循环次数为高的树的叶子节点总数
如果fork在前,print在后,那么打印的数量就是以循环次数+1为高的树的叶子结点总数-1(减去根节点))
81、CFS调度器中,怎样计算vruntime?
(tips:使用 实际执行时间 * nice_0_weight / weight,进程的nice值越高,weight越低,vruntime越大,
被调度的可能越小)
82、RCU常用接口有?
(tips: rcu_read_lock 读者加读锁,rcu_read_unlock 读者解锁
rcu_dereference 读者拿到被保护的指针, rcu_assign_pointer 写者替换原来的指针
rcu_sync 将替换行为同步给其他访问者)
83、传统RCU有什么问题?
(tips:在大型系统中,随着核数的增多,在优雅周期的判断时,对于CPU mask 的争用加剧,导致RCU操作效率降低)
84、Tree RCU 又是怎么解决这个问题的?
(tips:将CPU mask组织成树形结构,将CPU划分成组,不同的组访问不同的rcu_node,减少锁争用)
85、TASK_KILLABLE 状态的作用是?
(tips:TASK_INTERUPTABLE 状态的进程可以响应信号,TASK_UNINTERRUPTABLE状态的进程又完全不响应信号,
而TASK_KILLABLE是在这两者之间,首先,处于TASK_KILLABLE状态的进程也是可以响应信号的,
当收到致命信号时,会唤醒对应进程。
ps 命令输出中 D 状态的进程不一定就是 TASK_UNINTERRUPTABLE 的,也有可能是 TASK_KILLABLE 的,
这个新的状态在 内核版本 2.6.26 之后添加)
86、flock和lockf调用的区别是?
(tips:lockf是fcntl锁定操作的封装,是POSIX文件锁的实现,而flock则用了一个新的系统调用,
lockf可以针对文件的range进行加锁,而flock不行,但是两者都是实现了基本的意向锁,但是,
fcntl也有强制锁的实现)
87、schedule函数中选择下一个调度进程的方法是?
(tips:Linux内核实现了四个调度类,stop停止类,rt实时类,fair公平类,idle空闲类,
优先级从高到低,先在stop类中选择进程,如果没有则在rt类,接下来是fair类,再接下来是idle类,
同时,实时类也对应之前O1调度算法中0~99 这个优先级区间的任务,fair对应的是100~139区间的优先级)
88、stop停止类只有一个任务,用于多CPU之间负载均衡相关或CPU热插拔,
idle类也只有一个任务,用于CPU睡眠
89、新创建的进程的vruntime取值刚开始和父进程的vruntime一样,但要减去运行队列中的最小vruntime,
之所以这样做,是因为要考虑多CPU之间的负载均衡,各个CPU上的运行队列的最小vruntime不一样,
如果不这样做,直接迁移可能会造成负载不均衡。当确定好运行CPU后,再加上对应CPU运行队列的最小vruntime
90、唤醒后的进程的vruntime更新是在之前vruntime的基础上,用运行队列最小vruntime减去一个调度周期表示为vruntime1,
然后取 max(当前进程vruntime,vruntime1),这样就解决了长时间睡眠的进程醒来时由于vruntime太小而导致长期占用CPU
91、之前System V 风格的signal机制有一个问题,就是在信号处理函数不是默认值且设置了SA_ONESHOT标志后,
内核会在自动在自定义信号处理函数执行后,恢复到默认信号处理函数。
92、信号值在 1~31 范围内的都是不可靠信号,即实现中是以位图来标志是否有挂起的信号,
而又相同的信号时,会导致信号丢失。
93、信号中断系统调用表示?
(tips:内核在执行慢速系统调用时有可能被信号打断而无法继续执行,这时接口会返回EINTR错误,
为了可以让系统调用继续执行,可以在设置信号处理的行为为 SA_RESTART,但不是所有的系统调用都能自动继续执行,
具体可以 man 7 signal 查看)
94、可靠信号的队列长度有限制吗?
(tips:有,可以通过 ulimit -a 查看 signal pending 的取值)
95、信号与多线程的关系?
(tips:
1 信号处理函数在多线程之间共享,但是各个线程可以有自己的信号屏蔽集
2 kill 函数必须面向进程
3 每个发给多线程应用的信号,由内核随机挑一个未屏蔽该信号的线程来接收
4 如果向多线程程序发送致命信号,那么内核将停止进程下的所有线程)
96、多个信号的投递优先级?
(tips:优先处理私有信号队列,然后处理共享队列,
优先处理SIGSEGV,SIGBUS,SIGILL,SIGTRAP,SIGFPE,SIGSYS同步信号,
然后处理信号值小的信号,不可靠信号优先级高于可靠信号)
97、异步信号安全也要值得考虑,具体做法就是化异步为同步
可以采用sigwait方法,也可以将signalfd返回的fd加入epoll中来处理,
还可以通过管道的方式来处理,还可以通过socketpair来通知主进程有信号发生
98、匿名管道和命名管道的区别?
(tips:匿名管道通过pipe函数创建,命名管道通过mkfifo函数创建)
99、管道空间有大小限制吗?
(tips:有,如果写入的内容超过了管道空间,会报错)
100、多个进程向管道中写入数据时,是否是原子的?
(tips:标准规定,写入PIPE_BUF大小的数据时,是原子的,这个值在linux上取值为 4096)
101、mmap的私有映射的实现?
(tips:通过写时复制来实现,对于文件内容的修改,不会同步到底层文件中)
102、khungtaskd 功能?
(tips:打印出长时间处于D状态的进程堆栈和对应告警信息,如果开启了hung_task_panic,那么内核会panic)
103、drop cache 操作导致机器磁盘util升高,可能的原因有?
(tips:drop cache操作对应的是文件修改内容的写回,
这时缓存在page cache中的数据将会排队写回磁盘,如果涉及的文件多,
且位置随机,那么将会产生很多排队I/O,使磁盘util升高)
104、free命令显示可用内存小,程序crash原因及解决方案?
105、操作系统中inode有cache吗? dentry呢?
(tips:都有对应的hash cache)
106、pidstat命令的输出中 minor page fault 和 major page fault 分别表示什么?
(tips:minor page fault表示所需的数据页已经在内存中,只不过还没有标记为loaded状态,
major page fault表示数据页需要从磁盘等设备中读取
一般,major page fault出现的数量太多,表示频繁的读取磁盘)
107、为什么采用分页模式起来管理内存?
(tips:分段方式没有内碎片,但是因为各个段的长度不能严格保证是2的整数次幂,
会造成内存的外碎片,导致数据访问效率降低,分页模式则没有这个问题,
另一方面,在真正使用内存之前,有可能不知道数据的长度,所以段的长度不定)
108、cgroup可以对用户态map的页面进行管理,也可以针对内核使用的内存进行管理,
常见的为tcp,当应用触发limit时,cgroup启动reclaim,如果失败,
则启动OOM(OOM可以配置为不启动,那么进程会hang或者sleep);memory.limit_in_bytes为
hard limit;memory.soft_limit_in_bytes在系统整体内存不紧张时不生效,
但当系统整体内存紧张后,soft_limit_in_bytes会生效,超额的内存申请会失败sleep。
memsw表示memory+swap的空间使用量,在内存空间紧张时,用户态的匿名映射页会swap out。
在调大memory.limit_in_bytes 之前,需要先把memory.memorysw.limit_in_bytes调大
且需要逐级调整,保证整个parent->child链路上的限制都符合预期。
109、内核使用的页面不会swap out到二级存储
(tips:这里还需要明确下具体是哪些页面,例如tcp使用的skb?shm使用的?等,
同时,用户进程使用 mlock 锁定的页面也不会swap)
110、为什么在某些性能调优场景下需要关闭NUMA?
(tips:因为如果应用没有针对NUMA进行优化,那么有可能父进程在Node0运行,
启动时预分配了运行时需要的的总内存,如果后续spawn的子进程迁移到Node1,这时,
访问原来的内存就需要经过QPI总线,走point-to-point link,导致数据访问延时增加,
QPI总线的数据传输速度低于CPU访问内存的
所以在使用NUMA时,对进程绑核是必须操作,减少跨node访存;当某一个numa node内存紧张时
早期的实现会回收本node的page cache,造成上层应用延迟升高;当时2014年之后的内核代码已经修复
了这个问题,修改为尝试申请其他node的内存)
111、OOM计算的是物理内存的使用,malloc返回非NULL,只是表示分配了虚拟内存,
后续访问时,有可能触发缺页中断,进而引发OOM,一个可取的方法就是malloc之后,
memset
112、共享内存的实现方式有哪几种?
(tips:
1、SYS V 方式 调用 shmget 等方法,接口不友好,
使用ipcs命令行工具查看具体mem address
2、shmget + mmap
3、memcreate_fd)
113、ulimit -n 可以列出当前对每个进程open file的限制,
ulimit -Sn 可以看到 soft limit
ulimit -Hn 可以看到 hard limit
同时 /proc/sys/fs/file-max 可以设置整个系统打开的文件总数限制
同时 /etc/security/limits.conf 这个文件中可以针对user级别设置limit
同时 /proc/<pid>/limits文件中可以查看对应process的相关limits
114、实现atomic指令时的lock前缀,提供了一种保证,后续对相关的数据访问独占进行,
如果之前的指令有修改这个数据,那么在lock指令执行前也会执行写回
115、prctl可以设置运行进程的名,其实现细节应该是设置task_struct里面的cmd等结构
116、free命令显示的 -/+ buffer/cache +表示系统还有多少可用,-表示系统当前已用的,
通过向 /proc/sys/vm/drop_cache 写入不同的数值,可以强制刷回cache,但是需要注意,
当前的 共享内存和mmap shared page,都是基于tmpfs实现,且 tmpfs不可以刷回,所以,
不是所有cache都可以回收。
117、使用多线程程序观察到虚拟内存很高,为什么?
(tips: glibc从2.10版本开始引入了一个MALLOC_ARENA_MAX参数来申请thread_local的arena空间,
arena的数量在64位系统下默认为2*cpu cores,对应的内存空间大小为 2*cpu cores * arena size,
arena size为 64M;
可以通过设置MALLOC_ARENA_MAX环境变量或者通过mallopt函数来控制这一行为)
118、在/proc/$PID/task目录下可以看到当前进程下各个线程的详细信息
119、SIGSEGV信号如果是由进程自己触发,则信号信息中的pid为0
120、NUMA与SMP相比,个人认为最大的区别在于拓扑结构上的差异,这些差异带来了
跨node内存访问延迟(QPI访问),cache一致性等等的问题。
(tips:从UMA到NUMA,有三个问题需要解决
1、内存的非一致性访问组织
2、CPU点对点互连(在SMP架构下,CPU之前不需要互连,大家访问的是公共的内存池,现在
有的架构CPU内部各个core以 full mesh结构互连,以避免数据访问时的多跳问题)
3、可扩展的cache一致性协议,NUMA架构下,每个socket下CPU内部的core
都有自己独有的L3级cache,L3级cache也是oncore的)
121、vfork新建进程时,不拷贝父进程的页表,所以创建进程的速度比较快,且父进程阻塞,直到
子进程调用了execve或者 _exit(),注意在vfork创建的子进程退出时,不能使用exit,而要
使用_exit(),之所以只能使用_exit,是因为glibc库在调用exit时,会进行一些清理工作,
会访问到父进程的内存空间,而vfork创建的进程,不能直接访问父进程的数据。
122、hugepage的使用有两种方式,一种是使用系统预留的hugepage,数量由
/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages 文件内容控制,
使用前需要在上述文件中写入期望系统预留的hugepage数量,然后在mmap等调用中显示的传入MAP_HUGETLB参数。
这种预留的内存空间常驻内存不会被swap,常用于和设备的DMA操作,公司里面实现的用户态文件系统和NVMe设备交互时也有采用。
123、内核会针对每一个page统计MCE(Machine Check Exception),如果超过阈值,那么会进行
soft_offline_page,即将出错的页面内容拷贝到其他物理页面,然后将出错的页面下线,
这一操作对应用透明。
MCE的log配置文件位于 /etc/mcelog/mcelog.conf
124、x64程序中,cpu的fs寄存器用于存储stack canary
125、内核回收内存空间时,可能会导致sys cpu利用率升高,对应的解决办法是查看 /proc/buddyinfo 确认是
哪一阶的内存比较紧张。然后可以通过调低vm.min_free_kbytes系统参数来以更高的频率主动触发内核的回收行为。
内核管理内存是划分Zone的,具体信息保存在 /proc/zoneinfo 。每一个Zone中都有 high,low,min三个watermark,
当某个zone中的内存水位低于low时,kswapd会被唤醒,直到水位回到high以上,
当水位低于min时,大块的内存申请可能会触发direct reclaim或者OOM。
vm.min_free_kbytes 调整的过低,那么系统回收内存的速度将会非常慢,在运行的过程中,当需要回收内存时,可能会导致死锁。
vm.min_free_kbytes 调整的过高,那么会导致OOM过于频繁,应用会异常退出。
当我们设置了 vm.min_free_kbytes后,内核会根据各个Zone的大小分别计算出min数值。
在使用free命令时,我们看到的可用内存空间不一定就可以用来申请,/proc/sys/vm/lowmem_reserve_ratio这个文件
里面定义了各个zone中保留的页面比例,当高端内存向低端内存申请内存时,需要判断 free_pages 和 min + reserved_page
的大小关系,如果小于,那么申请失败(参考mm/page_alloc.c __zone_watermark_ok函数)
应用可用内存需要减去这个数值。所以在malloc或者mmap失败时,可以查看这个参数,确认下是否配置正确。
在线上系统中,可以适当的调整这个数值来适当的增加内核主动回收频率,减少direct reclaim
126、free命令的各项数据来自于/proc/meminfo这个文件(代码在fs/proc/meminfo.c),而这个文件的内容又是来自于procfs,
其中buffer来自于sysinfo中的bufferram字段(代码在mm/page_alloc.c),这个字段又是来自于nr_blockdev_pages,即
统计devfs中inode结构中i_mapping字段映射的页面数量,一般直接读取设备时,会分配这一数据,
这也就和之前看的buffer表示块设备文件数据占用内存的说法一致。
这部分内存和普通内存的用法一样,如果写入数据,也需要刷回磁盘,如果只读,那么对应内存会被回收(干净页)
127、/var/log/messages 这个文件记录了系统中很多信息,包括系统启动,关闭,OOM,shell的操作日志等。
Ubuntu等发行版使用的是 /var/log/syslog 来记录这些信息
128、dmesg 或者上面 /var/log/messages有记录进程发生segment fault时的信息,常见的是 segfault at xxx ip xxx sp xxx error xxx
其中 ip 指向的是当前正在执行的指令,加上 at 后面的偏移量可以得到调用栈中的的caller(栈地址是从大到小,栈顶的地址小),这里记录的
地址都可以使用addr2line工具得到对应的代码行信息
error 是一个位图,记录具体的错误信息
page fault error code bits:
*
* bit 0 == 0: no page found 1: protection fault
* bit 1 == 0: read access 1: write access
* bit 2 == 0: kernel-mode access 1: user-mode access
* bit 3 == 1: use of reserved bit detected
* bit 4 == 1: fault was an instruction fetch
129、通常在不可睡眠,或不可调度的上下文中使用GFP_ATOMIC标志调用kmalloc申请内存
如果当前zone的内存水位低于min,那么GFP_ATOMIC可以使用到 min/4的量。对应的,如果使用GFP_KERNEL标志,
则可能会触发direct reclaim
PF_MEMALLOC则是kswapd在回收内存空间时申请空间,所以带这个标志的内存申请必须得到满足
可以使用对应的预留空间。
130、某个问题中,程序在异常时有一段退出逻辑,但是刚好磁盘hang,导致对应代码段没有load上来
程序没有按照预定的逻辑退出,出现问题。
这个问题有如下几个启示
(1)怎么确认代码里面的某个函数,或某几个函数在磁盘文件的哪个block
(2)内核从磁盘读取文件异常时,通常会打印带sector的日志,那么怎么和第一点的信息对应上来,
即通过sector找到对应block,在匹配到操作的文件
(3)怎么解决代码段不能load的问题(可以通过mlock来避免对应页面被换出)
131、NUMA中node是一种物理划分,表示哪些CPU core是一组,可以用numactl --hardware 看到对应的local内存的大小
而CPU Sockets表示的是插槽的数量,所以,CPU Sockets和NUMA node数量没有关系,两者可能相等,也可能不相等
132、sched_setaffinity在设置时, dest_cpu = cpumask_first_and(cpu_active_mask, new_mask),并尝试将对应的
thread迁移到目标cpu的runqueue中.
132、在使用mmap加载磁盘文件时,如果出现越界访问(例如:超过文件长度的访问),或者访问时,其他程序对文件内容
进行了截断,那么会报SIGBUS的错误。
同时,如果对READ_ONLY的区域,进行写入,则会产生SIGSEGV错误;这与常见的段错误不同;应用层程序尝试写
内核区域的内存时,也会产生SIGSEGV
133、RSS 和 PSS 和 USS
(RSS可以直观的理解为物理内存使用量,PSS在大多数场景和RSS的含义一样,但是在共享库场景,这两个
数值不一样,例如一个共享库20K,被20个进程共享,那么PSS的显示就是 1K
USS Unique Set Size则表示进程独享的内存大小)
134、通过/proc/${pid}/cgroup 可以查看对应进程归属的cgroup组,在对应的cgroup目录下可以查看memory.stat文件
确认各项数据分别使用了多少;cgroup限制的内存包括了两部分,RSS和Cache;
而操作系统的Cache包括了(page cache 、dev buffers、slab,具体数值可以通过/proc/meminfo查看);
但是需要注意cgroup统计时并不统计slab的使用量
135、cgroup内部的回收逻辑在4.19内核之前都是直接回收;但是高版本内核使用了异步回收功能
如果回收后,仍然不能满足要求,那么就会触发OOM逻辑
(在对应进程的memory cgroup目录下查看是否有 wmark* 文件来确认是否支持异步回收功能
可以搜搜 memcg异步回收相关文档)
136、在/var/log/mcelog中可以观察到最近的MCE事件
137、'Corrected patrol scrub error'
(tips:Demand scrubbing is the ability to write corrected data back to the memory once a correctable error is detected on a read transaction. Patrol scrubbing proactively searches the system memory, repairing correctable errors. It prevents accumulation of single-bit errors)
// 其他
1、内核和用户空间通信都有哪些方法?
2、服务器1U 2U 中的 U 表示什么?
(tips:U是高度单位,大约 4.45 cm)
3、CDP技术介绍?
(tips:持续数据持久化,通过内核层的hook来保证数据的安全性)
4、InfiniBand的带宽能达到多少? Optic Fabric带宽能达到多少?
(tips:200G,400G)
5、什么是 公网下沉?
(在一台机器上同时部署两张网卡,一张网卡配置公网IP,另一张配置内网ip)
6、 SLC MLC TLC QLC 分表表示什么规格的SSD?
7、内核代码可以使用 -O0 编译吗?为什么?
(tips:代码中内置了一些需要编译优化的代码片段,在-O0级别下编译会报错)
8、__attribute__((noinline)) 标识有什么作用?
9、什么是 DAS NAS SAN?
10、IP SAN 的概念?
(tips:运行iSCSI协议的存储)
11、衡量文件系统性能的工具有哪些?
(tips:FFSB,PostMark,IOZone,fio工具)
12、冯诺依曼体系结构的缺点有哪些?
(tips:1、未考虑CPU和内存之间速度的差异
2、未考虑内存隔离
3、和其他组件缺少交互
上述几个缺陷在Intel CPU中分别通过 寄存器/Protect Ring/中断 等方法解决)
// shell
1、怎么样使alias永久生效?
4、怎样确定一个shell 命令是builtin的?
(tips:使用type命令查看)
5、怎样让系统生成core 文件?
(tips:ulimit -c unlimited,同时还要关注/proc/sys/kernel/core_pattern是否为空)
6、怎样定制core文件命名规则?
(tips:/proc/sys/kernel/core_pattern)
7、Ubuntu系统不再使用/var/log/messages来记录系统事件,现在使用/var/log/syslog来替代
8、在core文件中一般不会记录memory-mapped I/O pages,有时coredump file size会比VIRT值还大
,有可能是内存中的数据swap到了磁盘
9、core file在生成时,具体dump哪些内容受到 /proc/${pid}/coredump_filter 影响,
这个文件的内容是 16 进制的,具体每一bit的涵义参考man 5 core
10、/proc/${pid}/task/${thread_id}/stack 可以看到一个进程下的各个线程的内核栈
11、/proc/${pid}/smaps 可以看到进程使用的内存区域的详细信息,排查问题时有用