一、Linux常用命令
| 命令 | 功能 | 补充 |
|---|---|---|
| cd | 切换目录 | - |
| ls -lht | 查看文件大小 | du -sh * :可查看文件/文件夹大小 |
| vim | 编辑文件 | :% s / old / new / g :将整个文件old替换为new |
| move | 移动文件或目录,或更改名称 | - |
| mv | 重命名或移动目录 | - |
| tail | 查看(正更新)文件尾部 | - |
| sed | 处理文本,具体有增删、替换打印等动作 | - |
| ps | 显示进程状态 | ps -aux | grep tomcat 查看所有tomcat进程 |
| top | 显示进程信息,如CPU、内存占用率 | top -u userId、top -p PID |
| netstat | 观察端口 | - |
| df | 显示磁盘使用 | - |
| lsof | 进程打开文件(夹)信息 | - |
| kill | 杀死端口 | kill -9 PID、sudo kill 3068 |
1、Linux查看内存占用【判断进程死循环(*2)】、端口占用、IP地址,用什么命令行发信号?
- 内存:
top、ps aux | more - 端口:
sudo lsof -i: testPort、netstat -ap | grep testPort - IP:
ip addr show / ifconfig - 发信号:
kill
2、Linux运行命令方式?
| 方式 | 具体 | 补充 |
|---|---|---|
| sh | sh test.sh | 无需执行权限 |
| ./ | ./test | 要执行权限 |
| . | . test.sh、source test.sh | 目录增加至Linux path,要执行权限。 |
3、进程启动方式
system()、exec()、fork()。
二、进程
1、进程、线程、协程概念及差异
2、进程间通信种类(*12)
- 方式:管道(匿名管道、有名管道)、消息队列、信号量、信号、共享内存、套接字。
追问1:最快的是哪种?(*2)怎么实现?
- (1)共享内存。
- (2)不能直接共享,要映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
3、进程和线程的通信方式对比?(*4)
| 进程通信 | 线程通信 | |
|---|---|---|
| 简介 | 数据和地址空间的独立性决定其通信比较复杂,要通过操作系统。 | 多线程共享地址空间和数据空间,所以可以直接通信,而不必通过操作系统 – 即内核调度。 |
| 方式 | 管道 消息队列 信号量 信号 共享内存 套接字 | [ 重点 ] 锁机制(互斥锁、条件变量、读写锁) 信号量机制(Semophore) 信号机制(Signal) |
三、内存
1、分段分页含义?
分段:分配连续完整的内存,然后将虚拟内存地址映射为物理内存地址的方法。
分页:分段导致外部内存碎片和交换空间太大,为了让交换写入数据更少,出现了内存分页。和分段相比,分页把(虚拟/物理)整块内存切成一段段固定尺寸的大小内存存储单元,减少了内存碎片的大小。
追问1:为什么分段?(*2)
分段引入主要扩大了内存地址,程序地址不再需要原始硬编码,程序调试更简便。
把虚拟地址空间的虚拟内存组织成一些长度可变的内存块单元。
追问2:为什么分页?(*2)
分段内存碎片太大,因此提出了分页,用大小相同的页替换大小不同的段。
- 划分颗粒度更小,然后通过映射将虚拟地址映射为物理地址,映射关系是通过页表实现的。最后将逻辑上连续线性地址转换为可不连续的物理地址,。
2、虚拟内存和物理内存(*6)理解、作用、联系?
虚拟内存地址(Virtual Memory Address):指令里用到的内存地址。
定义的虚拟地址空间是连续,使程序编写难度降低。因为每个进程都提供了一个一致的、私有的、连续完整的地址空间,让每个进程都产生了一种自己在独享主存的错觉。
物理内存地址(Physical Memory Address):实际在内存硬件里面的空间地址,它是真实的物理地址
追问1:什么时候进行交换?
物理内存不足时,会将最近最少频率使用的页框移出物理内存,放到存储空间(swap分区)。
追问2:不使用虚拟内存可能会出现什么问题?
- 1)进程地址空间不隔离。有Bug/恶意的程序修改其它程序的内存数据,会导致其它程序运行异常。
- 2)内存使用效率低。可能有大量的内存数据频拷贝到硬盘,释放空间给另一个程序使用,效率释放低下。
- 3)程序运行的地址不确定。当内存剩余空间满足程序要求,系统会随机分配一段连续空间,因为随机分配,所以运行地址不确定。
追问3:虚拟内存如何转换为物理地址?
页号+偏移量:通过虚拟页号找到物理内号,再加上偏移量就得到了物理内存地址。
3、地址变换高速缓冲/快表 - TLB(Translation lookaside buffer)的作用?
存储当前最可能被访问到的页表项,是部分页表项的一个副本,减少了因MMU导致的处理器性能下降。
4、用户态和内核态的含义、区别?
- 内核态:控制计算机的硬件资源,并提供上层应用程序运行的环境,特权级是
Ring0。 - 用户态:上层应用程序活动空间,执行依托于内核提供资源。特权级指令是
Ring3.
补充:CPU指令分为**特权指令和非特权指令**。特权指令从高到低分为Ring0-Ring3级。
追问1:用户态切换到内核态的方式有几种?
- 1)系统调用(软中断):用户态通过系统调用申请操作系统提供服务完成工作。
- 2)异常:执行用户态程序时发生异常会触发处理异常的内核相关程序,如缺页异常。
- 3)外围设备(硬)中断:当外围设备完成用户请求操作,向CPU发出中断信号,这时CPU会转去执行对应处理程序。
如果先前执行指令是用户态下,自然切换到内核态,如硬盘读写完成,系统切换到读写中断处理程序执行后续操作。
追问2:系统调用是什么?
操作系统中的最小功能单位。让上层应用通过接口访问内核,提供资源。
四、调度(进程、内存)

五、IO模型
1、五种IO模型是什么?
| IO模型 | 含义 | 问题 |
|---|---|---|
| BIO | 应用程序进程在发起IO调用后至内核执行IO操作返回结果之前,发起系统调用的线程一直处于等待状态。 | 用户进程被阻塞,浪费性能 |
| NIO | 进程在发起IO调用后至内核操作返回结果之前,若发起系统调用不会等待,而是立即返回。 | 频繁轮询导致无效系统调用。并发量大时,浪费严重。 |
| IO多路复用之select/poll | 内核提供系统调用,支持一次查询多个系统调用的可用状态。 | 本质是内核存在无效循环遍历。 1)内核和用户空间存在大量数据拷贝。 2)内核空间遍历无效IO状态。 |
| IO多路复用之epoll | 基于事件驱动实现,变被动为主动。 | IO第一阶段 – 数据准备是阻塞的。 |
| SIGIO | 在IO执行的数据准备阶段,不会阻塞用户进程。 | IO第二阶段 - 数据从内核复制到用户空间,用户进程还被阻塞。 |
| AIO | 用户进程发出系统调用后立即返回,内核等待数据准备完成,然后将数据拷贝到用户进程缓冲区,再发信号告诉用户进程IO操作执行完毕。 | - |



追问1、同步和异步的区别是什么?
同步:调用端一直等待服务端响应,直到返回结果;
异步:调用端调用后不会立刻返回,不会等待服务端响应。服务端通过通知机制或回调函数来通知客户端。
追问2、阻塞和非阻塞的区别是什么?
阻塞:服务端返回结果之前,客户端线程会被挂起,此时线程不可被CPU调度,线程暂停运行。
非阻塞:在服务端返回前,函数不会阻塞调用端线程,而会立刻返回。

2、select、poll、epoll区别?
| Select | Poll | Epoll | |
|---|---|---|---|
| 操作方式 | 遍历 | 遍历 | 回调 |
| 底层实现 | 数组 | 链表 | 哈希表,红黑树-双向链表 |
| IO效率 | 线性遍历,时间复杂度 O ( n ) O(n) O(n) | 同select | 事件通知方式。 每当fd就绪,系统注册回到函数就会调用,将就绪fd放到rdllist(),时间复杂度O(1) |
| 最大连接数 | 1024(x86)或2048(x64) | 无上限 | 无上限 |
| fd拷贝 | 每次调用都把fd集合从用户拷贝到内核空间 | 同select | 调用epoll_ctl拷贝进内核并保存,之后每次epoll_wait不拷贝 |
| 触发方式 | 水平触发 | 水平触发 | EPOLLT(默认)模式是水平触发; EPOLLET(高速)模式是边缘触发(一次) |
六、其他
1、CPU执行模型
取指-译码-计算-回写
七、参考
1、【操作系统】Linux常用基础
2、【操作系统】进程间通信
3、【操作系统】虚拟页和物理页
4、【操作系统】用户态和内核态
5、【操作系统】IO模型
6、【操作系统】I/O多路复用网络模型
7、大厂面试爱问的「调度算法」,20 张图一举拿下
8、Linux下做性能分析6:理解一些基础的CPU执行模型
本文详细探讨了Linux操作系统,包括常用命令如查看内存占用、端口和IP地址,以及进程通信和内存管理。讲解了进程、线程、协程的区别,重点解析了进程间通信的十二种方式,尤其是共享内存的实现。还涵盖了虚拟内存和物理内存的原理,以及用户态和内核态的切换与作用。此外,文章还讨论了IO模型和调度策略。

3万+

被折叠的 条评论
为什么被折叠?



