碎玉零珠————计算机操作系统
并发与并行
- 并发:在一段时间内,多个任务都会被处理。但在某一时刻,只有一个任务在执行。单核处理器做到的并发,其实是利用时间片的轮转,例如有两个进程 A 和 B,A 运行一个时间片之后,切换到 B,B 运行一个时间片之后又切换到 A。因为切换速度足够快,所以宏观上表现为在一段时间内能同时运行多个程序。
- 并行:在同一时刻,有多个任务在执行。这个需要多核处理器才能完成,在微观上就能同时执行多条指令,不同的程序被放到不同的处理器上运行,这个是物理上的多个进程同时进行。
进程的状态
- 运⾏状态(Runing):该时刻进程占用 CPU;
- 就绪状态(Ready):可运行,由于其他进程处于运行状态而暂时停止运行;
- 阻塞状态(Blocked):该进程正在等待某⼀事件发生(如等待输⼊/输出操作的完成)而暂时停止运行,这时,即使给它 CPU 控制权,它也无法运行;
- 创建状态(new):进程正在被创建时的状态;
- 结束状态(Exit):进程正在从系统中消失时的状态;
进程与线程
- 进程是一个正在执行的程序的实例。每个进程有自己独立的地址空间、全局变量、堆栈、和文件描述符等资源。
- 线程是进程中的一个执行单元。一个进程可以包含多个线程,它们共享进程的地址空间和资源。
- 每个进程在独立的地址空间中运行,不会直接影响其他进程。线程共享同一个进程的内存空间、全局变量和文件描述符。
- 进程切换需要保存和恢复大量的上下文信息,代价较高。线程切换相对较轻量,因为线程共享进程的地址空间,只需要保存和恢复线程私有的数据。
- 线程的生命周期由进程控制,进程终止时,其所有线程也会终止。
特性 | 进程 | 线程 |
---|---|---|
地址空间 | 独立 | 共享 |
内存开销 | 高 | 低 |
上下文切换 | 慢,开销大 | 快,开销小 |
通信 | 需要IPC机制,开销较大 | 共享内存,直接通信 |
创建销毁 | 开销大,较慢 | 开销小,较快 |
并发性 | 低 | 高 |
崩溃影响 | 一个进程崩溃不会影响其他进程 | 一个线程崩溃可能导致整个进程崩溃 |
线程上下文切换
- 这还得看线程是不是属于同⼀个进程:
- 当两个线程不属于同⼀个进程,则切换的过程就跟进程上下文切换⼀样;
- 当两个线程属于同⼀个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据;
- 所以,线程的上下文切换相比进程,开销要小很多。
共享内存
- 允许两个或多个进程共享一个给定的内存区,一个进程写⼊的东西,其他进程⻢上就能看到。
- 共享内存是最快的进程间通信方式,它是针对其他进程间通信方式运行效率低而专门设计的。
- 缺点:当多进程竞争同一个共享资源时,会造成数据错乱的问题。
虚拟内存
- 我们实际的物理内存主要是主存,但是物理主存空间有限,所以一般现代操作系统都会想办法把一部分内存块放到磁盘中,用到的时候再装入主存,但是对用户程序而言,是不需要注意实际的物理内存的,为什么呢?因为有
虚拟内存
的机制。 - 简单说,虚拟内存是操作系统提供的⼀种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。
- 每个进程都有自己独立的地址空间,再由操作系统映射到到实际的物理内存。
- 于是,这里就引出了两种地址的概念:
为什么要使用虚拟内存?
- 程序是运行在内存中的,程序运行时会将保存在硬盘上的程复制到RAM内存(载入内存),然后CPU执行内存中的程序代码。
- 如果执行的程序占用内存很大或很多,或同时执行多个程序,就会导致内存消耗殆尽。从而导致程序执行异常或崩溃。
虚拟内存工作原理
- 当进程开始运行时,先将一部分程序装入内存,另一部分暂时留在外存;当要执行的指令不在内存时,由系统自动完成将它们调入内存的工作;当没有足够的内存时,系统自动选择部分内存(暂不执行的程序)空间,将其中原有的内容交换到磁盘上,并释放这些内存空间供其他进程使用。
- 这样做的结果使程序的运行丝毫不受影响,使程序在运行中感觉到拥有一个不受内存容量约束的、虚拟的、能够满足自己需求的存储器。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SleepyLoser's Blog!
评论
Powered By Valine
v1.5.1
v1.5.1