从【操作系统】的角度一文说明白【进程】

128 阅读3分钟

进程

在我们的计算机上,我们通常不会只运行一个程序,更多时候,是N个程序同时在running。

每一个程序,我们可以简单地理解为一个进程

每一个进程,都需要自己私有的静态数据操作指令,所以,我们需要给每一个进程单独分配一块虚拟CPU来存放和执行这些静态数据操作指令

在这里,我们就可以给进程下一个定义了:

进程,是指物理CPU上分配的一块虚拟CPU,能让私有的静态数据指令在这块虚拟的地方被操作。

一台电脑上有1块物理CPU(当然其实不止,但是为了简化,我们默认仅1块),理论上可以分配成无限多个虚拟CPU, 也就是说,可以创建许多的进程

Time sharing机制

现在我们假设已经把一块物理CPU分配成了N个虚拟CPU,每一个虚拟CPU对应了一个进程

举个例子,用户在电脑上可以一边使用word写东西,一边使用QQ音乐放音乐,一边使用wechat聊天。

这里的word,qq音乐和wechat分别对应的是进程A,B和C。

这3个进程看起来是同步的,但实际上这是一个错觉,真实的情况是运行A一段时间,再运行B一段时间,再运行C一段时间,再返回运行A。这个形式就叫做Time sharing机制

但是这种机制,会面临2个问题——性能控制权

性能

我们希望能最大限度地提高性能,那么,我们的进程就必须运行在CPU上而非磁盘上,但是,问题也就出来了

  1. 如何保证CPU上的进程只乖乖访问自己私域的数据,而不去染指其他私域的数据呢? 为了解决这个问题,操作系统设计了2个模式:
  • 用户模式:进程在用户模式下运行时,其操作会受到限制。例如,它不能直接访问某些关键的系统资源(如内存管理寄存器、I/O 设备等),如果尝试执行一些受限制的操作,硬件会触发一个异常,将控制权交给操作系统。
  • 内核模式:操作系统在内核模式下运行,拥有更高的权限,可以访问所有的系统资源。当进程需要执行一些特权操作(如进行 I/O 操作、分配内存等)时,需要通过系统调用的方式进入内核模式,由操作系统来代为执行这些操作。
  1. 如何保证进程在运行一段时间之后,会乖乖地把控制权交出来给下一个进程呢?

这里使用了时钟中断。硬件上的时钟设备会周期性地产生中断脉冲(通常是毫秒级),其过程是这样的:

进程A在运行-> 触发时钟中断->进程A中断,并记录当前的上下文->控制权交还给操作系统->操作系统读取进程B的上下文->开始运行进程B。