一,进程介绍
-
定义:进程是计算机中运行中的程序的实例。它包含了程序的代码、数据以及程序运行时所需的各种资源,如内存空间、CPU时间等。
-
特征:
- 动态性:进程是动态创建、执行和销毁的。
- 并发性:在多道程序环境下,多个进程可以同时存在并相互竞争执行。
- 独立性:每个进程拥有独立的地址空间和资源,相互之间不受影响。
- 随机性:由于进程的并发执行,进程的执行顺序和时间是不确定的。
-
状态:进程在其生命周期中会经历不同的状态,常见的包括:
- 就绪状态:进程已经准备好运行,只等待分配CPU时间。
- 运行状态:进程正在CPU上执行。
- 阻塞状态:进程因等待某些事件而暂停执行,如等待I/O完成。
- 创建和销毁状态:进程被创建或者被销毁时处于这两种特殊状态。
-
进程管理:操作系统负责对进程进行管理,包括进程的创建、调度、同步、通信、销毁等操作。进程管理的目标是有效地利用系统资源,提高系统的吞吐量和响应速度,保证系统的稳定性和安全性。
总的来说,进程是操作系统中最基本的概念之一,它使得计算机能够同时执行多个任务,实现了并发执行和资源共享,是操作系统中的核心组成部分。
进程是动态的,程序是静态的
进程创建是操作系统中的一个重要操作,涉及到多个步骤。以下是典型的进程创建过程:
-
申请空间: 当用户或系统请求创建新进程时,操作系统首先需要为新进程分配所需的内存空间。这包括进程控制块(PCB)和程序执行所需的内存空间(代码段、数据段、堆栈等)。
-
复制地址空间: 如果是通过fork()系统调用创建子进程(在类Unix系统中常见),则操作系统会复制父进程的地址空间给子进程。这包括代码段、数据段、堆和栈等。在Windows系统中,使用CreateProcess()函数来创建新进程时,会显式指定新进程的地址空间信息。
-
加载程序: 操作系统需要将要执行的程序加载到新进程的地址空间中。这涉及将程序的可执行文件从磁盘或其他存储介质中读取到内存,并将其放置在新进程分配的内存空间中。
-
初始化: 操作系统需要对新进程进行初始化,包括设置进程的状态、寄存器等初始值。这确保了进程在开始执行时具有正确的环境和状态。
-
设置上下文: 操作系统需要为新进程设置上下文信息,包括进程标识符(PID)、优先级、文件描述符等。这些信息在进程执行期间用于管理和调度进程。
-
建立 PCB: 操作系统会创建新进程的进程控制块(PCB),并将其加入系统的进程表中。PCB中包含了进程的各种属性和状态信息,供操作系统管理和调度。
-
将进程加入调度队列: 最后,操作系统将新进程标记为就绪状态,并将其加入到适当的调度队列中。当系统调度到该进程时,它开始执行其代码,从而完成进程的创建过程。
总的来说,进程创建是一个复杂的过程,涉及到内存管理、程序加载、状态初始化、上下文设置等多个方面。操作系统需要确保创建的进程能够在系统中正确执行,并与其他进程进行适当的交互。
这里所说的PID可以在任务管理器里面轻松的看到
二,进程状态的转换
进程状态之间的转换通常由操作系统内核管理,其中包括从就绪态到运行态、运行态到就绪态、运行态到阻塞态、以及阻塞态到就绪态的转换:
-
就绪态到运行态:
当一个进程处于就绪态时,它已经准备好执行,但还没有获得CPU资源。当操作系统的调度器选择了该进程作为下一个要执行的任务,并且分配了CPU资源给该进程时,该进程会从就绪态转换为运行态,开始执行其指令。 -
运行态到就绪态:
当一个进程处于运行态时,它正在执行其指令并占用CPU资源。如果发生了一些需要暂停该进程执行的事件,比如等待IO操作完成,此时进程会从运行态转换为就绪态。在这种情况下,操作系统会将该进程暂停执行,并将其放回就绪队列中,等待下一次被调度执行。 -
运行态到阻塞态:
在运行态时,如果一个进程发起了需要等待某些事件完成的操作,比如IO操作,此时该进程会从运行态转换为阻塞态。在进入阻塞态后,该进程不再占用CPU资源,而是等待特定的事件发生。例如,如果一个进程发起了读取文件的操作,但文件尚未准备好,进程将进入阻塞态,直到文件准备就绪。 -
阻塞态到就绪态:
当一个进程处于阻塞态时,等待的事件发生后,操作系统会将其从阻塞态转换为就绪态。在这个过程中,进程不再被阻塞,可以重新被调度执行。一旦进程处于就绪态,它就可以在接下来的调度中获得CPU资源并开始执行。
这些状态之间的转换是操作系统进行进程管理和调度的基础,确保了系统资源的合理分配和进程的正常执行。
三,子进程
子进程是在操作系统中由父进程创建的新进程。在大多数操作系统中,包括Windows、Linux和macOS,进程可以创建其他进程作为其子进程。子进程与父进程类似,它们可以执行独立的任务,但是它们是由父进程派生出来的。通常情况下,子进程可以继承父进程的一些属性,如文件描述符、环境变量等,但也可以有自己独立的属性和状态。在多任务环境中,子进程的创建和管理对于并发执行任务和资源管理至关重要。
子进程通常可以继承父进程的一些资源,包括但不限于以下内容:
-
文件描述符:子进程可以继承父进程打开的文件描述符,这意味着子进程可以读取或写入相同的文件或网络套接字。
-
环境变量:子进程可以继承父进程的环境变量,这些变量通常包含了执行环境的一些配置信息。
-
控制终端:在一些情况下,子进程可能会继承父进程的控制终端,这取决于操作系统和终端设置。
-
信号处理:子进程可以继承父进程对信号的处理方式。
-
进程组和会话:子进程可能会加入到与父进程相同的进程组或会话中,这取决于操作系统的设置和父进程的行为。
但是,子进程也可以有自己独立的资源,例如:
-
内存空间:子进程通常会有自己独立的内存空间,不会与父进程共享内存。
-
进程标识符(PID):每个进程都有唯一的PID,子进程会有自己独立的PID。
-
文件描述符表:子进程会继承父进程的文件描述符表的拷贝,但它们是独立的,修改一个进程的文件描述符表不会影响其他进程。
总的来说,子进程通常会继承父进程的一些资源,但也会有自己独立的资源。
作为一个Java工程师了解到这里其实已经差不多了,有更佳想了解深入的可以 学习wangdao操作系统的书,里面有详细介绍什么是进程和线程。
扩展的讲一下,目前的操作系统都是线程是调度的基本单位,进程作为拥有资源的基本单位 如果有感兴趣这句话的,我后期会专门介绍一下这句话的意思