一文带你理解进程

进程的定义

把一个静态的程序通过操作系统在内存中让cpu执行起来,形成了一个动态的执行过程,这个执行过程成为进程

  • 程序(Program): 静态的实体。它是一组存储在磁盘或其他存储介质上的指令和数据的集合(例如一个 .exe 文件或一个 Python 脚本文件)。

  • 进程(Process): 动态的实体。当一个程序被加载到内存中并开始执行时,它就变成了一个进程。 进程是程序的一次执行实例,它拥有运行程序所需的所有资源(内存空间、CPU时间、打开的文件、网络连接、安全属性等)同一个程序可以同时运行多次,产生多个独立的进程(例如,你可以同时打开多个记事本窗口)。

两者联系 

两者区别 

1.进程在执行过程中,要完成默写特定的功能,有些功能只有操作系统才能提供,比如读取文件,进程向操作系统发出请求,操作系统代表进程在内核执行,这个时候进程处于核心态,所以说进程有核心态,用户态

2.执行一段程序,一个进程的形式在内存中运行,而程序保存在硬盘中

3.操作系统为了管理这个进程,会引入额外的结构和状态变化,这个后面会说

进程的组成

  1. 程序的代码

    • 含义:这是进程执行的指令序列或源代码,存储在内存中。它定义了程序要执行的操作,例如计算、逻辑判断等。
    • 作用:作为进程的核心,代码决定了进程的行为和功能。没有代码,进程无法运行。
    • 示例:在一个文本编辑器的进程中,代码可能包括打开文件、编辑文本和保存文件的指令。
  2. 程序处理的数据

    • 含义:这是进程操作的数据对象,包括输入数据、输出数据、中间计算结果等。数据可以是变量、数组、结构体等。
    • 作用:数据是代码处理的对象,进程通过读取和修改数据来实现功能。它反映了程序的当前状态。
    • 示例:在一个计算器进程中,数据可能包括用户输入的数字和运算符,以及计算结果。
  3. 程序计数器中的值,指示下一条将运行的指令

    • 含义:程序计数器(Program Counter, PC)是一个特殊的CPU寄存器,保存了下一条要执行的指令在内存中的地址。
    • 作用:它控制进程的执行流程,确保指令按顺序运行或在跳转时(如函数调用)正确切换。这使进程知道从哪里继续执行。
    • 示例:在一个游戏进程中,程序计数器可能指向当前帧的渲染指令,下一条指令可能是处理用户输入。
  4. 一组通用的寄存器的当前值,堆、栈

    • 含义
      • 通用寄存器:CPU中的临时存储单元,用于保存当前计算的数据或地址(如累加器、基址寄存器)。
      • 堆(Heap):动态分配的内存区域,用于存储程序运行时创建的对象(如通过mallocnew分配的内存)。
      • 栈(Stack):后进先出(LIFO)的内存区域,用于管理函数调用、局部变量和返回地址。
    • 作用:寄存器和内存区域共同维护进程的执行上下文。寄存器提供快速访问,堆支持动态内存管理,栈处理函数嵌套和局部数据。
    • 示例:在一个Web浏览器进程中,寄存器可能存储当前标签页的状态,堆用于存储加载的网页内容,栈用于处理JavaScript函数的调用链。
  5. 一组系统资源(如打开的文件)

    • 含义:这是进程使用的操作系统管理的资源,包括文件句柄、网络连接、设备接口等(如打开的文件、套接字或打印机)。
    • 作用:这些资源使进程能与外部环境交互,例如读写文件或网络通信。操作系统负责分配和回收这些资源,确保进程安全运行。
    • 示例:在一个音乐播放器进程中,系统资源可能包括打开的音频文件、网络流媒体连接或音量控制设备。

进程的特点

一、动态性(Dynamic Nature)

定义:进程是程序的一次动态执行过程,具有生命周期(创建→运行→终止)。
核心表现

  1. 创建与销毁:进程由操作系统动态创建(如系统调用 fork()),分配资源(内存、文件句柄等),并在任务结束或异常时被终止回收资源。
  2. 状态变化:进程在执行过程中可能经历多种状态转换(就绪、运行、阻塞等),例如等待I/O操作时从运行态转为阻塞态。
    示意图关联:左侧“进程切换示意图”中的箭头体现了进程状态的动态切换(如A→B→C→D),每个程序计数器(PC)的切换对应进程状态的改变。

二、并发性(Concurrency)

定义:多个进程可同时在内存中存在,通过时间片轮转等调度策略交替占用CPU,宏观上“同时运行”。
核心表现

  1. 并发 vs 并行
    • 并发:单核CPU通过快速切换实现多进程“同时”执行(如示意图右侧时间轴上A、B、C、D交替执行)。
    • 并行:多核CPU真正同时运行多个进程(需硬件支持)。
  2. 资源复用:通过进程调度(如先来先服务、优先级调度),CPU和内存资源被高效共享,提升系统吞吐量。
    挑战:并发可能导致执行结果不确定(异步性),需同步机制(如信号量)保障正确性。

三、独立性(Independence)

定义:每个进程拥有独立的地址空间和系统资源(内存、文件等),互不干扰。
核心表现

  1. 内存隔离:进程通过页表(Page Table)和MMU(内存管理单元)实现虚拟地址到物理地址的独立映射,一个进程无法直接访问其他进程的内存。
  2. 资源独立:操作系统为每个进程分配独立的文件描述符、环境变量等资源,进程崩溃不会影响其他进程(如Chrome浏览器多标签页独立进程设计)。
    示意图关联:右侧时间轴中A、B、C、D的独立执行线段,体现了进程各自推进的独立性。

四、制约性(Constraint)

定义:进程因共享资源或协作任务而产生互斥或同步关系。
核心表现

  1. 互斥(Mutual Exclusion)
    • 临界资源(如打印机、共享变量)一次仅允许一个进程访问。
    • 通过信号量(Semaphore)互斥锁(Mutex) 实现(例如P/V操作)。
  2. 同步(Synchronization)
    • 协作进程需按特定顺序执行(如生产者-消费者模型)。
    • 通过条件变量(Condition Variable)屏障(Barrier) 协调执行顺序。
      挑战:制约不当可能导致死锁(Deadlock)或竞态条件(Race Condition)。

进程控制块

 

一、进程标识信息

核心作用:唯一标识进程身份与归属关系,实现权限控制和进程树管理。

  1. 本进程标识符(PID)

    • 定义:操作系统分配给进程的唯一非负整数标识(如Linux中PID范围通常为1~32767)。
    • 功能:通过getpid()系统调用获取当前PID,用于进程调度、资源分配和信号传递。
    • 唯一性:进程终止后PID可被回收重用,但同一时刻PID全局唯一。
  2. 父进程标识符(PPID)

    • 定义:记录创建该进程的父进程PID(如Shell启动程序时,Shell为父进程)。
    • 功能:支持进程树管理(pstree命令可查看层级关系),父进程通过wait()回收子进程资源,避免僵尸进程。
  3. 用户标识符(UID)

    • 权限控制:分为实际用户ID(启动进程的用户)和有效用户ID(决定文件访问权限),通过setuid()可修改权限。
    • 安全机制:例如SUID程序(如passwd)运行时,有效用户ID临时提升为root以修改系统文件。

二、处理机状态信息保存区

核心作用:保存进程被中断时的CPU现场,确保切换后能恢复执行。

  1. 用户可见寄存器

    • 数据/地址寄存器:存储运算中间结果和内存地址(如EAX、EBX)。
    • 示例:进程计算a = b + c时,b、c的值暂存于寄存器,切换时需保存至PCB。
  2. 控制和状态寄存器

    • 程序计数器(PC):指向下一条待执行指令地址,中断时保存PC值确保恢复后继续执行。
    • 程序状态字(PSW):包含标志位(如进位标志CF、零标志ZF),记录算术运算结果和CPU状态。
      示例:若进程执行除法时除数为0,PSW溢出标志触发异常处理。
  3. 栈指针(Stack Pointer)

    • 功能:指向当前栈顶地址,保存函数调用链、局部变量及中断现场。
    • 场景:系统调用时,内核栈保存用户栈指针以切换执行上下文。

三、进程控制信息

核心作用:管理进程资源、调度策略及协作机制。

  1. 调度和状态信息

    • 进程状态:就绪(等待CPU)、运行(占用CPU)、阻塞(等待I/O)等。
    • 调度参数:优先级(实时进程优先于普通进程)、时间片长度(如Linux默认100ms)。
    • 队列指针:指向就绪队列/阻塞队列中的下一个PCB,实现调度器高效遍历。
  2. 进程间通信(IPC)信息

    • 通信机制:信号量、消息队列、共享内存的标识符存储于PCB。
    • 示例:进程A向进程B发送消息时,内核通过B的PCB定位其消息队列缓冲区。
  3. 存储管理信息

    • 内存结构:记录页表/段表基址(如x86的CR3寄存器),实现虚拟地址转换。
    • 隔离保障:各进程页表独立,防止越界访问(如进程无法读写其他进程的0x08048000地址)。
  4. 进程所用资源

    • 文件描述符表:记录打开的文件句柄(如fd 0/1/2对应stdin/stdout/stderr)。
    • 资源清单:I/O设备、信号量、定时器等资源标识符,进程终止时由内核统一回收。
  5. 数据结构连接信息

    • 组织方式
      • 链表:同状态PCB组成队列(如就绪链表、阻塞链表)。
      • 索引表:按状态建立哈希表加速查找(较少用)。
    • 亲属关系:父进程PCB记录子进程链表指针,支持wait()遍历子进程。

进程生命周期

1.NULL -> 创建状态:一个新进程被创建时的第一个状态;


2.创建状态 -> 就绪状态:当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态,这个过程是很快的;


3.就绪态 -> 运行状态:处于就绪状态的进程被操作系统的进程调度器选中后,就分配给 CPU 正式运行该进程;


4.运行状态 -> 结束状态:当进程已经运行完成或出错时,会被操作系统作结束状态处理;


5.运行状态 -> 就绪状态:处于运行状态的进程在运行过程中,由于分配给它的运行时间片用完,操作系统会把该进程变为就绪态,接着从就绪态选中另外一个进程运行;


6.运行状态 -> 阻塞状态:当进程请求某个事件且必须等待时,例如请求 I/O 事件;


7.阻塞状态 -> 就绪状态:当进程要等待的事件完成时,它从阻塞状态变到就绪状态;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值