摘自:看完这些面试必问的Linux小知识,我保证你面试后会来给我的文章一键三连
作者:万里羊
发布时间:2021-04-09 21:55:23
网址:https://blog.csdn.net/weixin_44895651/article/details/115532107
作为一名以后想从事嵌入式Linux工程师的大学生,那么Linux肯定是得学习的。如果要从事C++后台或者服务器运维相关的工作那么Linux肯定也是一个必备的工具啦!既然作为工作中需要接触的工具那么在面试过程中就一定会问到,关于Linux的基本命令、Linux的基本组件、进程间通信、线程间同步…都有可能被问到。尽管面试考察的方面很多,但是经过大量的面试就会发现有很多问题面试官是会百问不厌的。
往期推荐:
经过笔试和多轮技术面试我居然败给了HR面?
面试官说:我们不要连Android TP驱动流程都不知道的人
文章目录
- Linux——系统篇
- Linux是什么?
- Unix和Linux有什么区别?
- Linux系统的组成部分?
- Linux内核的组成部分?
- 内存管理单元MMU有什么作用?
- 常见的操作系统进程调度策略有哪些?
- I/O子系统层次结构
- 逻辑地址、线性地址、物理地址、总线地址、虚拟地址的区别?
- 操作系统的内存一般有哪几种方式,各有什么优缺点?
- 用户空间和内核通信的方式有哪些?
- 调用API read()/write()时,内核具体做了那些事情?
- 系统调用的作用?
- Boot loader、Linux内核、根文件系统三者之间的关系?
- Bootloader的启动过程分为那两个阶段?
- Linux——人机交互篇
- Linux常用命令
- Shell脚本
- GCC、GDB、makefile
- makefile
- Linux ——进程线程篇
- 进程间通信
- 线程间同步机制
- 线程与进程的区别
- 什么是死锁?产生死锁的原因是什么?
- 死锁的四个必要条件是什么?
- 死锁的处理方法?
- 如何预防死锁?
- Linux——网络篇
- 网络基础知识
- TCP编程
- 网络高频面试题汇总
Linux——系统篇
Linux是什么?
简单的来说Linux就是一套开源的和自由传播的基于Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。简单的来说就是和windows、Mac OS比较像的一种多任务、多用户的操作系统!
Unix和Linux有什么区别?
Linux和Unix都是功能强大的操作系统,都是应用广泛的服务器操作系统,有很多相似之处,甚至有一部分人错误地认为Unix和Linux操作系统是一样的,然而,事实并非如此,以下是两者的区别。
-
开源性
Linux是一款开源操作系统,不需要付费,即可使用;Unix是一款对源码实行知识产权保护的传统商业软件,使用需要付费授权使用。 -
跨平台性
Linux操作系统具有良好的跨平台性能,可运行在多种硬件平台上;Unix操作系统跨平台性能较弱,大多需与硬件配套使用。 -
可视化界面
Linux除了进行命令行操作,还有窗体管理系统;Unix只是命令行下的系统。 -
硬件环境
Linux操作系统对硬件的要求较低,安装方法更易掌握;Unix对硬件要求比较苛刻,安装难度较大。 -
用户群体
Linux的用户群体很广泛,个人和企业均可使用;Unix的用户群体比较窄,多是安全性要求高的大型企业使用,如银行、电信部门等,或者Unix硬件厂商使用,如Sun等。
相比于Unix操作系统,Linux操作系统更受广大计算机爱好者的喜爱,主要原因是Linux操作系统具有Unix操作系统的全部功能,并且能够在普通PC计算机上实现全部的Unix特性,开源免费的特性,更容易普及使用!
Linux系统的组成部分?
Linux系统由 boot loader、Linux kernel 、Linux Shell、Linux应用程序组成。
Linux内核的组成部分?
(1)第一种分类方式:内存管理子系统、进程管理子系统、文件管理子系统、I/O管理子系统
(2)第二种分类方式:进程调度(SCHED)、进程间通信(IPC)、内存管理(MMU)、虚拟文件系统(VFS)、网络接口(NET)
内存管理单元MMU有什么作用?
内存管理单元的主要作用是内存映射、内存分配和回收、内存保护、内存扩充。
常见的操作系统进程调度策略有哪些?
先来先服务、短进程优先、高响应比优先、时间片轮转、多级反馈队列、最高优先权优先。
I/O子系统层次结构
从上至下依次是用户层I/O软件,设备独立性软件,设备驱动程序,中断处理程序
逻辑地址、线性地址、物理地址、总线地址、虚拟地址的区别?
地址 | 简介 |
---|---|
逻辑地址 | 与内存段相关的偏移地址部分。例如,在C语言获取指针变量的值,就是逻辑地址,不和绝对的物理地址相关 |
线性地址 | 线性地址=逻辑地址+基地址 |
物理地址 | 如果启动了分页机制,那么线性地址使用页表项变换后就是物理地址。如果没有启用分页机制,那么线性地址就是物理地址。 |
总线地址 | x86下的I/O地址,ARM下的物理地址。 |
虚拟地址 | MMU虚拟出来的地址 |
操作系统的内存一般有哪几种方式,各有什么优缺点?
- 分页存储管理:优点是不需要连续的内存空间,且内存利用率高(只有很小的页内碎片);缺点是 不易于实现内存共享与保护。
- 分段存储管理:优点是易于实现段内存共享和保护;缺点是每段都需要连续的内存空间,且内存利 用率较低(会产生外部碎片)。
- 段页式存储管理:优点是不需要连续的内存空间,内存利用率高(只有很小的页内碎片),且易于 实现段内存共享和保护;缺点是管理软件复杂性较高,需要的硬件以及占用的内存也有所增加,使得执 行速度下降。
用户空间和内核通信的方式有哪些?
系统调用API | 用户空间进程通过系统调用进入内核空间,访问指定的内核空间数据 |
---|---|
驱动程序 | 用户空间进程可以使用封装后的系统调用接口访问驱动设备节点,和运行在内核空间的驱动程序通信 |
copy_to_user()、copy_from_user() | 在驱动程序中调用的接口,实现用户空间和内核空间的数据拷贝操作,应用于实时性要求不太高的项目中 |
procfs | 是一种特殊的文件系统,是Linux内核信息的抽象文件接口,大量内核中的信息以及可调用的参数都被作为常规文件映射到这个目录树中,用户可以直接通过echo或cat这样的命令对系统信息进行修改和查询。 |
共享内存mmap | 在代码调用接口,实现内核空间与用户空间的地址映射,在实时性要求很高的项目中为首选 |
netlink | 用户进程使用标准的socket API就可以使用netlink提供的强大功能 |
调用API read()/write()时,内核具体做了那些事情?
用户进程调用read()/write()后进入内核空间-> 调用内核的sys_read()/sys_write()函数 -> 内核函数进一步调用fop.read()/fop.write()指向的函数,也就是驱动程序里具体的读写函数。
系统调用的作用?
为应用程序提供访问硬件的同一接口,以至于应用程序不必关心具体的硬件操作细节。
为系统内核提供保护,保证系统的稳定和安全,因为**系统调用还规定了用户进程进入内核的具体方式以及所能访问的数据范围**。
Boot loader、Linux内核、根文件系统三者之间的关系?
系统上电,就执行Bootloader来初始化处理器及其外设,将系统的软硬件环境带到一个合适的状态
Boot loader传递给Linux 内核 bootcmd和boot targs这两个比较重要的参数,让Linux内核知道从内存中那个地方读取相关的设备树,系统镜等文件,然后执行Linux内核。
Linux内核完成初始化之后就挂载某个文件系统作为根文件系统。
Bootloader的启动过程分为那两个阶段?
- 第一个阶段是汇编阶段,完成一些依赖于CPU体系结构的初始化,并执行第二阶段的代码。
- 第二阶段是C语言的,进一步完成硬件的初始化,并建立内存映射,并将内存和根文件系统读取到内存中,然后启动内核
Linux——人机交互篇
Linux常用命令
在博主之前的文章中有整理了相关的Linux常用命令可以查看史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!这篇文章,这篇文章覆盖了绝大部分的Linux命令!目前已经有1000+点赞,6000+收藏。这里面需要重点关注的命令就是关于**Linux用户、Linux进程管理、文件查找**这些是面试官最喜欢问的问题也是最容易记混淆的知识!既然是最容易记混淆的那么就需要重点关注整理一下!
命令 | 作用 | 说明 |
---|---|---|
useradd -m -g 组 新建用户名 | 添加新用户 | - m 自动创建用户家目录 - g 指定用户所在的组,负责会建立一个和同名的组 |
passwd | 设置用户密码 | 如果是普通用户,直接用passwd可以修改自己的账户密码 |
userdel -r 用户名 | 删除用户 | -r 选项会自动删除家用户目录 |
cat /etc/passwd | grep 用户名 | 确认用户信息 | 新建用户后,用户信息会保存在/etc/passwd文件中 |
命令 | 作用 | 说明 |
---|---|---|
ps -aux | 查看进程的详细信息 | - a 显示终端上的所有进程 - u 显示进程的详细状态 - x 显示没有控制终端的进程 |
ps -ef | grep -列出需要的进程 | 配合管道查看相关的进程的详细信息 | |
pstree | 通过显示进程的树状图来展示进程间的关系 | 如果指定了pid,那么树的根就是该pid |
top | 监控系统不同进程所使用的资源信息 | |
nice <优先值> <进程名> - 通过给定的优先值启动一个程序 | 设置改变进程的优先级 | 普通用户只能设置0~20,越小优先级越高 |
renice -n -g - 改变指定进程的优先值 | 通过改变指定用户和组来改变进程优先级 | |
kill | 用于发送信号来结束进程 | 可以通过-9参数来执行 |
netstat -nap | grep xxx | 查看进程号为xxx的端口占用号 |
命令 | 作用 | 说明 |
---|---|---|
find <指定目录> <指定条件> <指定动作> | 查找指定目录下的指定文件,并对文件进行相关操作 | 条件参数可以是 - name按照名字进行查找 |
grep | grep允许对文本进行模式查找 | - n显示匹配行及行号 - v显示不包含匹配文本的所有行(相当于取反) - i 忽略大小 |
Shell脚本
用户界面和命令行这个另外开发的程序,Linux下这个命令行的程序就叫Shell,其是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。
博主在之前学习Shell脚本的时候已经整理的比较详细了,这里就把链接给贴出来啦!
- Shell基本概念
- Shell变量和程序语句
- Shell函数调用以及变量的作用域
GCC、GDB、makefile
- 预处理:引入头文件、进行宏替换、处理条件编译指令、去除注释、添加行号。
- 编译:进行语法分析等,并生成汇编代码.s。
- 汇编:将汇编代码转成二进制代码.o(目标文件)。
- 链接:将有关的目标文件彼此连接为可执行代码。分为静态链接(将库文件代码搬迁到可执行文件 中,后缀是.a)和动态链接(在执行的时候转到库文件代码执行,后缀是.so)。
之前也有整理关于代码的编译还有调试相关的文章,可以戳链接进入文章代码从编译到运行经历了什么?
makefile
makefile从入门到放弃——博主吐血整理的笔记
makefile的基本条件就是目标和依赖!
Linux ——进程线程篇
进程间通信
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程间交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供这种机制称为进程间通信!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2DMiFYSH-1617975383512)(C:\Users\lenovo-pc\AppData\Roaming\Typora\typora-user-images\image-20210409204514616.png)]
-
管道
项目 通信方式 特点 无名管道(内存文件) 半双工通信 数据只能单向流动,只能在有亲缘关系的进程间使用(父子进程) 有名管道(FIFO文件,借助文件系统) 半双工通信 允许在没有亲缘关系的进程间使用,是先进先出的通信方式 -
共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段内存由一个进程创建,但是多个进程可以访问。共享内存是最快的IPC方式,他是针对其他进程间通信方式运行效率低而专门设计的。
-
消息队列:消息队列是有消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限制等缺点。
-
套接字:适用于不同机器间进程通信,在本地可作为两个进程间通信的方式。
-
信号:用于通知接收进程某个时间已经发生,比如按下ctrl+C就是信号
-
信号量:信号量就是一个计数器,可以用来控制多个进程对共享资源的访问。常用一种锁的机制,实现进程、线程的临界区的同步及互斥访问。
线程间同步机制
- POSIX无名信号量(基于内存的信号量):可以用于进程间同步
- POSIX有名信号量:线程进程都适用
- 初始化、P操作(申请资源)、V操作(释放资源)
- 互斥锁+条件变量:只能用于线程间同步
线程与进程的区别
调度:线程是调度的基本单位;进程是拥有所有资源的基本单位。
并发性:一个进程内多个线程可以并发;多个进程可以并发
拥有资源:进程拥有独立的地址空间;线程不拥有系统资源。
系统开销:线程创建销毁只需要处理PC值,状态码,通用寄存器,线程栈和栈指针即可;进程创建和线程需要分配及销毁task_struct结构。
关于线程与进程我也有整理相关的博客:
-
1、进程简介
-
2、线程&线程间同步
-
3、Unix间线程通信
-
4、System V间通信
-
5、并发与竞争
什么是死锁?产生死锁的原因是什么?
死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程将无法向前推进。
原因:①系统资源不足。②资源分配不当。③进程推进的顺序不合适。
死锁的四个必要条件是什么?
互斥条件:一个资源每次只能被一个进程使用,其他进程只能等待。
请求与保持条件:进程已经获得至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时该进程被阻塞,但对已获得资源依然保持不放。
不可剥夺条件:进程所获得的资源不能被其他进程剥夺,只能被自己释放。
循环等待条件:若干进程形成首尾相接循环等待资源的关系。
注意:以上四个条件缺一不可。
死锁的处理方法?
(1)预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件。
(2)避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁。
(3)检测和解除死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉。
如何预防死锁?
(1)破坏“请求与保持条件”:
-
①静态分配,即每个进程在开始执行时就申请它所需要的全部资源
-
②动态分配,即每个进程在申请所需要的资源时它本身不占用系统资源。
(2)破坏“不可剥夺条件”:一个进程在阻塞等待期间,其占有的资源被隐式释放后被其他进程使用,而阻塞等待的资源只有获得所有需要的资源才能重新启动。
(3)破坏“循环等待条件”:采用资源的有序分配,将所有资源进行编号,紧缺的资源采用比较大的编号,一个进程只有获得较小编号的资源才可以申请较大编号的资源。
Linux——网络篇
网络基础知识
借鉴之前整理的博客:网络基础知识
TCP编程
借鉴之前整理的博客:网络编程——TCP
网络高频面试题汇总
借鉴之前博客整理的面试题掌握了这些面试题,离大厂的距离更近一步!
不积小流无以成江河,不积跬步无以至千里。而我想要成为万里羊,就必须坚持学习来获取更多知识,用知识来改变命运,用博客见证成长,用行动证明我在努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,记得“点赞” “评论” “收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。