面试题总结 ---Linux篇 1.请你谈谈const是什么它的作用是什么const用来修饰变量、指针、函数参数、函数返回值、类成员函数表示只读不能被修改在编译期做检查。const 用于限定只读编译阶段校验防止误修改。① 修饰变量变量只读定义时初始化② 修饰指针分清常量指针和指针常量const int * p ; //指针指向的内容不可以修改指针本身可以修改int *const p ; //指针本身不能修改指针指向的内容可以修改③ 修饰函数形参保护传入数据不被修改④ 修饰类成员函数承诺该函数不修改对象成员 void exit() const2.什么是进程间的共享内存通信原理是什么操作系统在物理内存开辟一块内存多个进程通过系统调用把这块物理内存映射到自己的虚拟地址空间。进程读写直接操作物理内存数据不需要在内核缓冲区和用户缓冲区之间拷贝所以速度最快。缺点本身不带同步互斥机制需要我们自己加信号量 / 互斥锁保护防止并发读写冲突。3.共享内存的使用流程是什么shmget创建/ 获取共享内存段得到 shmidshmat挂载把共享内存映射到当前进程虚拟地址返回起始地址进程直接读写这块内存shmdt卸载断开映射不删除内存shmctl控制删除共享内存段所有进程 detach 之后才真正销毁4.shmdt 和 shmctl 的区别是什么shmdt 会让当前进程断开共享内存和虚拟地址空间的映射不会打删除标记其他的进程还是可以对这个共享内存进行创建和搭载的shmctl会给这块共享内存打上“待删除”的标记不会立马释放这块内存但是等其他的进程shmdt和这块内存脱离映射的时候这块内存会被释放但是shmctl一旦打上待删除的标记其他的进程就没有办法再搭载这块共享内存了。5.共享内存的生命周期共享内存不属于任何一个进程就算创建它的进程退出了它还在直到调用 shmctl 删除或者系统关机共享内存才会被释放。6.什么是进程间通信因为每个进程都有自己的虚拟地址空间相互隔离不能直接进行读写ipc就是一套让不同进程之间可以进行交流同步信息的机制。7.信号量的作用是什么做同步资源计数意思就是内核会把共享内存进行划分为了防止有超过划分数量的进程来访问共享内存内核创建了信号量只有拿到这个计数器的进程才能访问共享内存没有拿到信号量的进程要在共享内存外阻塞等待。8.什么是二元信号量二元信号量就是os将共享内存划分成了一块信号量对应的计数器的个数是一二元信号量的本质就是琐。9.同步和异步的区别是什么同步的意思就是需要进程主动去调用函数如read,sem_wait等事件/数据到达发生才能继续往后走不达到这种情况就卡再这里。异步的意思是信号的到来不需要进程主动去等待、查询。进程正常运行信号随时可能突然抵达打断当前正在执行的代码转而执行信号处理函数。10.什么是信号信号也是进程间通信方式的一种但是信号这种通信能力很弱只能携带少量数据如信号数字不能传递大块数据进程a可以调用kill通知进程bA 进程可以调用kil了出事了你处理一下。这就是进程间的消息传递所以归类为 IPC。11.既然共享内存最快是不是所有场景都优先用共享内存不是。共享内存没有自带同步互斥多进程读写会出现竞态必须搭配信号量增加开发复杂度。如果只是简单少量单向数据传输管道开发更简单稳定。12.什么是域间socket?Unix 域 socket 是本机的进程间通信方式通过内核 socket 文件完成通信不走网卡数据只在内核内存流转。API 和网络 socket 一样性能高于本机 TCP。它的特色是可以在进程之间传递文件描述符。13.有名管道和域间套接字的区别FIFO 仅仅是一个单向的字节流通道半双工Unix 域 socket 是一套完整套接字通信支持全双工、面向连接还可以传递 fd能力比 FIFO 强很多。14.如果两个进程一个采集数据、一个绘图你选什么 IPC为什么我选择共享内存信号量的方式采集进程进行读绘图进程进行写这样大数据传递可以减少拷贝并且信号量可以控制读写同步防止读到半帧脏数据。15.进程处理信号的三种方式忽略执行优先级更高的事件、默认处理执行系统默认的处理方式、捕获执行自定义的函数16.什么是volatile关键字17.volatile 在多线程里有用吗在 C11 之前多线程下只能防止编译器缓存但是无法防止 CPU 乱序执行C11 之后多线程一般用std::atomic不推荐 volatile 做多线程同步。volatile 更多用于嵌入式、硬件寄存器场景。18.什么是可重入函数什么是不可重入函数可重入函数指函数被中断后再次调用不会出错只使用局部栈变量不使用全局、static 变量。 不可重入函数使用静态 / 全局共享变量一旦中途被打断再次调用数据会错乱。在 Linux 中信号是异步触发的信号处理函数内部只能调用可重入信号安全的函数如果调用不可重入函数容易造成程序崩溃、数据异常。可重入函数和线程安全没有关系意思就是函数是线程安全的是要靠加琐的和它是不是可重入函数没有关系而线程安全的函数也不一定就是可重入函数19.什么是线程线程是进程更细粒度的划分进程将自己的代码进行划分分给多个线程这些线程共享进程的虚拟地址空间、页表的资源在 Linux 系统中线程是用进程模型模拟实现的内核不单独设计 TCB 线程控制块线程和进程统一使用task_struct结构体描述。同一个进程里的多个线程各自拥有一份独立的task_struct这些task_struct共享进程的虚拟地址空间仅拷贝必要私有信息线程 ID、线程状态、优先级、独立栈与上下文。内核复用进程原有的调度、等待队列、切换逻辑不需要单独为线程开发一套新机制降低开发和维护成本。