14
14
15
15
很多读者抱怨计算操作系统的知识点比较繁杂,自己也没有多少耐心去看,但是面试的时候又经常会遇到。所以,我带着我整理好的操作系统的常见问题来啦!这篇文章总结了一些我觉得比较重要的操作系统相关的问题比如** 进程管理** 、** 内存管理** 、** 虚拟内存** 等等。
16
16
17
- 文章形式通过大部分比较喜欢的面试官和求职者之间的对话形式展开 。另外,Guide 哥 也只是在大学的时候学习过操作系统 ,不过基本都忘了,为了写这篇文章这段时间看了很多相关的书籍和博客。如果文中有任何需要补充和完善的地方,你都可以在 issue 中指出!
17
+ 文章形式通过大部分同学比较喜欢的面试官和求职者之间的对话形式展开 。另外,我也只是在大学的时候学习过操作系统 ,不过基本都忘了,为了写这篇文章这段时间看了很多相关的书籍和博客。
18
18
19
19
这篇文章只是对一些操作系统比较重要概念的一个概览,深入学习的话,建议大家还是老老实实地去看书。另外, 这篇文章的很多内容参考了《现代操作系统》第三版这本书,非常感谢。
20
20
@@ -27,11 +27,11 @@ head:
27
27
28
28
关于如何学习操作系统,可以看这篇回答:[ https://www.zhihu.com/question/270998611/answer/1640198217 ] ( https://www.zhihu.com/question/270998611/answer/1640198217 ) 。
29
29
30
- ## 一 操作系统基础
30
+ ## 操作系统基础
31
31
32
32
面试官顶着蓬松的假发向我走来,只见他一手拿着厚重的 Thinkpad ,一手提着他那淡黄的长裙。
33
33
34
- ### 1.1 什么是操作系统?
34
+ ### 什么是操作系统?
35
35
36
36
👨💻** 面试官** : 先来个简单问题吧!** 什么是操作系统?**
37
37
44
44
45
45
![ Kernel_Layout] ( https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/Kernel_Layout.png )
46
46
47
- ### 1.2 系统调用
47
+ ### 系统调用
48
48
49
49
👨💻** 面试官** :** 什么是系统调用呢?** 能不能详细介绍一下。
50
50
@@ -69,21 +69,21 @@ head:
69
69
- 进程通信。完成进程之间的消息传递或信号传递等功能。
70
70
- 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。
71
71
72
- ## 二 进程和线程
72
+ ## 进程和线程
73
73
74
- ### 2.1 进程和线程的区别
74
+ ### 进程和线程的区别
75
75
76
76
👨💻** 面试官** : 好的!我明白了!那你再说一下: ** 进程和线程的区别** 。
77
77
78
78
🙋 ** 我:** 好的! 下图是 Java 内存区域,我们从 JVM 的角度来说一下线程和进程之间的关系吧!
79
79
80
- ![ ] ( https://oscimg.oschina.net/oscnet/up-cd8ac705f6f004c01e0a1312f1599430ba5 .png )
80
+ ![ Java 运行时数据区域(JDK1.8 之后) ] ( https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/jvm/java-runtime-data-areas-jdk1.8 .png )
81
81
82
82
从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的** 堆** 和** 方法区 (JDK1.8 之后的元空间)** 资源,但是每个线程有自己的** 程序计数器** 、** 虚拟机栈** 和 ** 本地方法栈** 。
83
83
84
84
** 总结:** 线程是进程划分成的更小的运行单位,一个进程在其执行的过程中可以产生多个线程。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。
85
85
86
- ### 2.2 进程有哪几种状态?
86
+ ### 进程有哪几种状态?
87
87
88
88
👨💻** 面试官** : 那你再说说** 进程有哪几种状态?**
89
89
99
99
100
100
![ process-state] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/d38202593012b457debbcd74994c6292.png )
101
101
102
- ### 2.3 进程间的通信方式
102
+ ### 进程间的通信方式
103
103
104
104
👨💻** 面试官** :** 进程间的通信常见的的有哪几种方式呢?**
105
105
@@ -115,7 +115,7 @@ head:
115
115
1 . ** 共享内存(Shared memory)** :使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
116
116
1 . ** 套接字(Sockets)** : 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
117
117
118
- ### 2.4 线程间的同步的方式
118
+ ### 线程间的同步的方式
119
119
120
120
👨💻** 面试官** :** 那线程间的同步的方式有哪些呢?**
121
121
@@ -125,7 +125,7 @@ head:
125
125
1 . ** 信号量(Semaphore)** :它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
126
126
1 . ** 事件(Event)** : Wait /Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
127
127
128
- ### 2.5 进程的调度算法
128
+ ### 进程的调度算法
129
129
130
130
👨💻** 面试官** :** 你知道操作系统中进程的调度算法有哪些吗?**
131
131
@@ -139,13 +139,13 @@ head:
139
139
- ** 多级反馈队列调度算法** :前面介绍的几种进程调度的算法都有一定的局限性。如** 短进程优先的调度算法,仅照顾了短进程而忽略了长进程** 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。,因而它是目前** 被公认的一种较好的进程调度算法** ,UNIX 操作系统采取的便是这种调度算法。
140
140
- ** 优先级调度** : 为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
141
141
142
- ### 2.6 什么是死锁
142
+ ### 什么是死锁
143
143
144
144
👨💻** 面试官** :** 你知道什么是死锁吗?**
145
145
146
146
🙋 ** 我** :死锁描述的是这样一种情况:多个进程/线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于进程/线程被无限期地阻塞,因此程序不可能正常终止。
147
147
148
- ### 2.7 死锁的四个条件
148
+ ### 死锁的四个条件
149
149
150
150
👨💻** 面试官** :** 产生死锁的四个必要条件是什么?**
151
151
@@ -158,7 +158,7 @@ head:
158
158
159
159
注意,只有四个条件同时成立时,死锁才会出现。
160
160
161
- ### 2.8 解决死锁的方法
161
+ ### 解决死锁的方法
162
162
163
163
解决死锁的方法可以从多个角度去分析,一般的情况下,有** 预防,避免,检测和解除四种** 。
164
164
@@ -219,7 +219,7 @@ head:
219
219
220
220
图中 2-21 是** 进程-资源分配图** 的一个例子,其中共有三个资源类,每个进程的资源占有和申请情况已清楚地表示在图中。在这个例子中,由于存在 ** 占有和等待资源的环路** ,导致一组进程永远处于等待资源的状态,发生了 ** 死锁** 。
221
221
222
- ![ 进程-资源分配图] ( ./ images/进程-资源分配图 .jpg)
222
+ ![ 进程-资源分配图] ( https://guide-blog- images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/cs-basics/operating-system/process-resource-allocation-diagram .jpg)
223
223
224
224
进程-资源分配图中存在环路并不一定是发生了死锁。因为循环等待资源仅仅是死锁发生的必要条件,而不是充分条件。图 2-22 便是一个有环路而无死锁的例子。虽然进程 P1 和进程 P3 分别占用了一个资源 R1 和一个资源 R2,并且因为等待另一个资源 R2 和另一个资源 R1 形成了环路,但进程 P2 和进程 P4 分别占有了一个资源 R1 和一个资源 R2,它们申请的资源得到了满足,在有限的时间里会归还资源,于是进程 P1 或 P3 都能获得另一个所需的资源,环路自动解除,系统也就不存在死锁状态了。
225
225
@@ -240,15 +240,15 @@ head:
240
240
3 . ** 逐个撤销涉及死锁的进程,回收其资源直至死锁解除。**
241
241
4 . ** 抢占资源** :从涉及死锁的一个或几个进程中抢占资源,把夺得的资源再分配给涉及死锁的进程直至死锁解除。
242
242
243
- ## 三 操作系统内存管理基础
243
+ ## 操作系统内存管理基础
244
244
245
- ### 3.1 内存管理介绍
245
+ ### 内存管理介绍
246
246
247
247
👨💻 ** 面试官** : ** 操作系统的内存管理主要是做什么?**
248
248
249
249
🙋 ** 我:** 操作系统的内存管理主要负责内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存),另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情。
250
250
251
- ### 3.2 常见的几种内存管理机制
251
+ ### 常见的几种内存管理机制
252
252
253
253
👨💻 ** 面试官** : ** 操作系统的内存管理机制了解吗?内存管理有哪几种方式?**
254
254
@@ -266,7 +266,7 @@ head:
266
266
267
267
🙋 ** 我** :谢谢面试官!刚刚把这个给忘记了~
268
268
269
- ### 3.3 快表和多级页表
269
+ ### 快表和多级页表
270
270
271
271
👨💻** 面试官** : 页表管理机制中有两个很重要的概念:快表和多级页表,这两个东西分别解决了页表管理中很重要的两个问题。你给我简单介绍一下吧!
272
272
@@ -290,15 +290,15 @@ head:
290
290
291
291
#### 多级页表
292
292
293
- 引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中。多级页表属于时间换空间的典型场景,具体可以查看下面这篇文章
293
+ 引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中。
294
294
295
- - 多级页表如何节约内存: [ https://www.polarxiong.com/archives/多级页表如何节约内存.html ] ( https://www.polarxiong.com/archives/多级页表如何节约内存.html )
295
+ 多级页表属于时间换空间的典型场景。
296
296
297
297
#### 总结
298
298
299
299
为了提高内存的空间性能,提出了多级页表的概念;但是提到空间性能是以浪费时间性能为基础的,因此为了补充损失的时间性能,提出了快表(即 TLB)的概念。 不论是快表还是多级页表实际上都利用到了程序的局部性原理,局部性原理在后面的虚拟内存这部分会介绍到。
300
300
301
- ### 3.4 分页机制和分段机制的共同点和区别
301
+ ### 分页机制和分段机制的共同点和区别
302
302
303
303
👨💻** 面试官** : ** 分页机制和分段机制有哪些共同点和区别呢?**
304
304
@@ -311,13 +311,13 @@ head:
311
311
- 页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的程序。
312
312
- 分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满足用户的需要。
313
313
314
- ### 3.5 逻辑(虚拟)地址和物理地址
314
+ ### 逻辑(虚拟)地址和物理地址
315
315
316
316
👨💻** 面试官** :你刚刚还提到了** 逻辑地址和物理地址** 这两个概念,我不太清楚,你能为我解释一下不?
317
317
318
318
🙋 ** 我:** em...好的嘛!我们编程一般只有可能和逻辑地址打交道,比如在 C 语言中,指针里面存储的数值就可以理解成为内存里的一个地址,这个地址也就是我们说的逻辑地址,逻辑地址由操作系统决定。物理地址指的是真实物理内存中地址,更具体一点来说就是内存地址寄存器中的地址。物理地址是内存单元真正的地址。
319
319
320
- ### 3.6 CPU 寻址了解吗?为什么需要虚拟地址空间?
320
+ ### CPU 寻址了解吗?为什么需要虚拟地址空间?
321
321
322
322
👨💻** 面试官** :** CPU 寻址了解吗?为什么需要虚拟地址空间?**
323
323
@@ -346,9 +346,9 @@ head:
346
346
- 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。
347
347
- 不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
348
348
349
- ## 四 虚拟内存
349
+ ## 虚拟内存
350
350
351
- ### 4.1 什么是虚拟内存(Virtual Memory)?
351
+ ### 什么是虚拟内存(Virtual Memory)?
352
352
353
353
👨💻** 面试官** :再问你一个常识性的问题!** 什么是虚拟内存(Virtual Memory)?**
354
354
@@ -360,7 +360,7 @@ head:
360
360
361
361
> ** 虚拟内存** 使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如 RAM)的使用也更有效率。目前,大多数操作系统都使用了虚拟内存,如 Windows 家族的“虚拟内存”;Linux 的“交换空间”等。From:< https://zh.wikipedia.org/wiki/虚拟内存 >
362
362
363
- ### 4.2 局部性原理
363
+ ### 局部性原理
364
364
365
365
👨💻** 面试官** :要想更好地理解虚拟内存技术,必须要知道计算机中著名的** 局部性原理** 。另外,局部性原理既适用于程序结构,也适用于数据结构,是非常重要的一个概念。
366
366
@@ -377,7 +377,7 @@ head:
377
377
378
378
时间局部性是通过将近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。空间局部性通常是使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上就是建立了 “内存一外存”的两级存储器的结构,利用局部性原理实现髙速缓存。
379
379
380
- ### 4.3 虚拟存储器
380
+ ### 虚拟存储器
381
381
382
382
> ** 勘误:虚拟存储器又叫做虚拟内存,都是 Virtual Memory 的翻译,属于同一个概念。**
383
383
@@ -391,7 +391,7 @@ head:
391
391
392
392
实际上,我觉得虚拟内存同样是一种时间换空间的策略,你用 CPU 的计算时间,页的调入调出花费的时间,换来了一个虚拟的更大的空间来支持程序的运行。不得不感叹,程序世界几乎不是时间换空间就是空间换时间。
393
393
394
- ### 4.4 虚拟内存的技术实现
394
+ ### 虚拟内存的技术实现
395
395
396
396
👨💻** 面试官** :** 虚拟内存技术的实现呢?**
397
397
@@ -413,7 +413,7 @@ head:
413
413
2 . ** 缺页中断** :如果** 需执行的指令或访问的数据尚未在内存** (称为缺页或缺段),则由处理器通知操作系统将相应的页面或段** 调入到内存** ,然后继续执行程序;
414
414
3 . ** 虚拟地址空间** :逻辑地址到物理地址的变换。
415
415
416
- ### 4.5 页面置换算法
416
+ ### 页面置换算法
417
417
418
418
👨💻** 面试官** :虚拟内存管理很重要的一个概念就是页面置换算法。那你说一下 ** 页面置换算法的作用?常见的页面置换算法有哪些?**
419
419
@@ -432,7 +432,7 @@ head:
432
432
- ** LRU (Least Recently Used)页面置换算法(最近最久未使用页面置换算法)** :LRU 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。
433
433
- ** LFU (Least Frequently Used)页面置换算法(最少使用页面置换算法)** : 该置换算法选择在之前时期使用最少的页面作为淘汰页。
434
434
435
- ## Reference
435
+ ## 参考
436
436
437
437
- 《计算机操作系统—汤小丹》第四版
438
438
- [ 《深入理解计算机系统》] ( https://book.douban.com/subject/1230413/ )
0 commit comments