Linux相关问题

Linux的面试相关问题,持续更新

一. Linux的那些命令

  • 文本处理黑魔法

    • sed
    • awk
    • grep
    • xargs
    • find
  • 系统状态查看黑魔法

    • ps
    • netstat
    • ss
    • free
    • lsof
  • 信息捕获黑魔法

    • tcpdump
  • 文件处理黑魔法

    • tail
    • more
    • less
    • ln -s

二. 线程和进程相关问题

1. 进程的那些状态

  • TASK_RUNNING: 最常见到的状态,进程正在运行中。
  • TASK_INTERRUPTIBLE: 处于休眠状态,并且此进程可以被唤醒。(被信号量、互斥锁满足、条件变量啥的唤醒)
  • TASK_UNINTERRUPTIBLE: 不可中断的休眠状态,该进程并不响应任何信号。一般是陷入到内核,并且在内核的过程不能被打断时才会出现。一般用ps命令很难看到。
  • TASK_STOP: 进程处于暂停,一般是收到了SIGSTOP信号才会进入。发送SIGCOUNT后会重新开始。
  • TASK_TRACE: 暂停,并且被跟踪。
  • TASK_ZOMBIE: 子进程被干掉,等待父进程调用wait()的时候才会收回task_struct结构。
  • TASK_DEAD: 进程被干掉。收回task_struct的前一个瞬间。

2. 进程的调度策略

老版O(1)调度策略

老版的调度策略是基于动态优先级和静态优先级来计算出最终的优先级nice值,来决定调度到谁身上的。
使用两个拉链表(就是链表的数组,一个数组下标对应一个链表)和两个bitmap分别保存运行中的Task和过期的Task。然后使用一个CPU指令找到bitmap的为1的最高位,从这个位对应的链表中取头部的那一个出来调度。
具体就不细说了,可以看深入解析Linux内核那本书。

现代CFS调度策略

不再区分脚本、交互进程、后台进程等几种类型,采用完全公平的调度方式,也不再追踪陷入睡眠状态的时间来计算动态优先级。所有可运行进程挂到红黑树上,占用CPU时间越长越靠右,调度器取最左边的进程来调度。

3. 进程和线程的区别

进程是资源占有的基本单元。
线程是调度的基本单元。
Linux线程很多实现都是clone出来的进程,只不过通过几个VM参数让多个线程共享资源。

4. fork的时候发生了什么

  • 给子进程创建一个内核栈
  • 生成一个新的PID
  • 复制内存空间、打开的文件描述符、挂起的信号、锁等

父子进程采用copy-on-write技术,在需要修改内存之前双方都是共享进程内存空间,等到真的需要修改的时候吗,才会真的执行内存空间的复制。

5. vfork和fork之间的区别

  • vfork是为了fork+exec这种场景而生的,如果这种场景下复制内存空间,task_struct完全是浪费,因为马上就要载入新的程序了。所以vfork干脆省略这一步不做。
  • vfork会阻塞父进程,直到子进程退出或者调用exec系列函数。

6. 进程间通信手段?

  • 共享内存
  • unix socket
  • 消息队列
  • 具名管道/匿名管道
  • 信号
  • 信号量

7. 线程间通信/同步手段?

  • 条件变量
  • 互斥锁
  • 线程信号

8. 信号有哪些常用的?

  • SIGINT
  • SIGPIPE
  • SIGCHLD
  • SIGALRM
  • SIGSEGV
  • SIGABRT
  • SIGHUP
  • SIGQUIT

9. 具名管道怎么用?匿名管道怎么用?

10. 进程的虚拟内存空间

最高1GB给dang,阿不,内核。
剩下3GB是用户空间。
从上到下是:环境变量,栈,动态链接库,堆,BSS, DATA段,elf,保护区

11. gdb原理是什么?

直接通过gdb启动程序是启动gdb后fork出一个子进程运行目标程序,如果使用gdb调试正在运行中的程序,则是利用ptrace(PTRACE_ATTACH, pid, 0, 0)attach到目标程序上。

断点则是利用了ptrace这个系统调用,其原理就是在打断点的地址写入0xCC,运行到这个地方目标程序就会触发SIGTRAP信号,然后gdb截获这个信号,检查一下断点链表里确实有这个地址,就会认为断点命中,然后就暂停进程。

12. 如何查看运行中的进程的堆栈?

  • 利用/proc//stack查看
  • pstack命令

三. 内存分配相关问题

1. 伙伴系统

为了避免出现内存碎片,Linux内核中引入了伙伴系统算法(buddy system)。把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块。最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍。

在申请分配页框的时候就由小往大找。分裂页框。归还的时候可能自动合并连续的页框。

2. slab

特定对象的内存池。

四. CPU架构带来的相关问题

1. 64位CPU和32位CPU编程时有什么区别?

  • 虚拟内存取址范围从0~4GB扩展到了256TB,但是实际用不到这么多……吧?
  • int取值范围会不一样
  • 指针变量大小不一样
  • 字节序也会相应的出问题

你可能感兴趣的:(Linux相关问题)