大家好,这里是小缺,一名对嵌入式软件开发充满热情的探索者。这一篇文章内容是进程概述
1.1 进程的定义
进程:
- 进程是一个动态的概念,它是程序在操作系统中的一个执行实例,具有自己的生命周期和状态。
- 进程在执行时会分配内存、打开文件、创建套接字等,并且可以与其他进程通信。
- 进程的状态包括运行、就绪、等待、暂停等,这些状态反映了进程的执行进度和系统资源的使用情况。
- 进程是操作系统进行资源分配和调度的基本单位,每个进程都有唯一的进程标识符(PID)。
那么进程和程序有什么区别呢,让我们也来看看程序的定义
程序:
- 程序是一个静态的概念,它是一系列指令和数据的集合,通常存储在磁盘或其他非易失性存储介质上。
- 程序是被动的,它本身不执行任何操作,只有在被加载到内存并由操作系统创建进程后,它才会变得活跃并执行任务。
- 程序没有生命周期,它不会自己启动或结束,需要通过操作系统或其他程序来启动。
简而言之,程序是代码和数据的集合,而进程是程序在运行时的实体。进程是程序的执行过程,它包含了程序的代码和数据,以及程序执行时的上下文信息。进程是操作系统管理的最小单位,而程序是静态的,需要通过进程来执行。
只要程序运行,此时就是进程,程序每运行一次,就会创建一个进程
在linux系统中,进程是管理事务的基本单元。 进程拥有自己独立的处理环境和系统资源(处理器、存储器、I/O设备、数据、程序)。
1.2 进程的状态及转换
进程整个生命周期可以简单划分为三种状态:
就绪态:
- 进程已经准备好运行,它已经分配到了除CPU时间片之外的所有必要资源,如内存空间、文件描述符等。
- 进程正在等待操作系统的调度器选择它来执行,一旦获得CPU时间片,进程就可以从就绪态转移到执行态。
- 就绪态的进程通常存储在就绪队列中,等待操作系统的调度。
执行态:
- 进程正在CPU上执行,它拥有CPU时间片,可以执行指令和操作数据。
- 进程在执行态期间,可以进行I/O操作、请求系统调用等,但这些操作可能会导致进程从执行态转移到等待态或就绪态。
- 执行态是进程生命周期中最活跃的状态,进程在此状态下完成其主要功能。
等待态:
- 进程因某些原因暂时无法继续执行,它必须等待某个事件或资源变得可用。
- 这些原因可能包括等待I/O完成、等待用户输入、等待特定系统资源等。
- 在等待态中,进程通常被移出CPU,放入等待队列中,直到它等待的事件发生或资源变得可用,然后可能被操作系统调度器重新放回就绪队列。
进程的调度进制:
时间片轮转,上下文切换
多进程不是说一个进程执行完再执行另一个进程,而是交替执行的,一个进程执行一 段时间,然后下一个进程在执行一段时间,当一个进程的时间片用完后,它会被暂时挂起,操作系统会将CPU的控制权交给下一个进程。这个过程会不断重复,直到所有进程都完成它们的工作。
这种执行方式使得每个进程都有机会运行,即使有些进程的执行时间比其他进程长。操作系统通过调度器来管理进程的执行顺序和时间片的分配,确保每个进程都有公平的执行机会。这种机制也允许用户同时运行多个程序,提高了系统的响应性和效率。
总之,多进程环境下的执行是并发的,而不是顺序的。操作系统通过时间片轮转的方式,使得每个进程都能在有限的时间内运行,从而实现了多任务并行处理的能力。
进程三个状态的转换关系
1.3 进程控制块
进程控制块就是用于保存一个进程信息的结构体,又称之为PCB,你可以把它想象成一个档案袋,里面装着关于进程的所有信息。
当操作系统创建一个新进程时,它会为这个进程分配一块内存空间,并在这个空间里创建一个PCB。这个PCB就像是进程的身份证,里面记录了进程的各种信息,比如进程的ID、状态、优先级、程序计数器(记录了进程下一步要执行的指令地址)、寄存器集合(存储了进程的当前状态)、内存管理信息、账户信息、I/O状态信息等等。
操作系统通过PCB来跟踪进程的执行情况,决定何时给进程分配CPU时间片,以及如何调度进程。
在Linux操作系统中,PCB的具体实现是通过一个叫做task_struct
的结构体来完成的。这个结构体包含了进程的所有信息,它位于Linux内核源代码中的一个特定文件里。这个文件通常位于内核源代码的某个目录下,比如/usr/src/linux-headers-4.4.0-176-generic/include/linux/sched.h
。在这个文件中,task_struct
结构体通常在1500行或者1300行左右的位置。
PCB结构体中的部分数据
- 调度数据 进程的状态、标志、优先级、调度策略等。
- 时间数据 创建该进程的时间、在用户态的运行时间、在内核态的运行时间等。
- 文件系统数据 umask掩码、文件描述符表等。 内存数据、进程上下文、进程标识(进程号)