C++多线程编程(2)进程

本文深入探讨了进程的概念、进程信息块、进程状态转换、优先权方案、上下文切换、进程关系、终止方式以及同步与异步执行,详细解释了操作系统如何管理和调度进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程

 

1.进程:程序被装载到内存中并准备执行。进程具备文本、数据、堆栈片段以及他们的资源。资源可以是文件、对象句柄、设备、信号量、互斥量、管道等等。操作系统管理进程及它的资源。信息保存于进程控制块或进程信息块的系统结构中,用户通过函数调用或访问数据结构即可使用此结构中包含的信息。

每个进程都有一个初始优先权。进程属性包含保存在进程信息块中部分或全部信息以及与信号、I/O和虚拟内存操作计数器、进程退出状态(进程终止的原因)和异常/调试端口(进程间通信渠道)有关的信息。

进程环境:系统+用户定义指针的集合,环境为进程设置默认信息。环境变量协助定义进程的行为。环境变量列表的创建和初始化由用户完成。一些变量具有系统初始化的默认设置。用户可以调用函数来创建和初始化特定进程的变量(局部变量)。

 

2.进程信息块:
OS/2进程结构:pid(当前进程id)、ppid(父进程id)、 module_handle(程序可执行模块句柄)、command_line(命令行参数的指针)、environment(进程环境块的指针)
Win32进程结构:hProcess(进程句柄)、hThread(线程句柄)、dwProcessID(当前进程ID)、dwThreadID(线程ID)  
环境块:
Unix:Home(指向用户初始工作目录的路径)、logname(与某进程关联的登录名)、path(查找可执行模块的路径前缀)、term(输出终端的类型)、tz(时间区的信息)、lang(地区)、lc_all(覆盖地区名)、lc_collate(核对信息的地区名)、lc_type(字符分类的地区名)、lc_monetary(货币编辑的地区名)、lc_numeric(数值编辑的地区名)、lc_time(地区日期和时间信息名)

 

3.进程状态: 进程某时某刻所处的模式或条件。它决定了将来的事件以及进程可能进入的状态。
进程状态:ready(就绪)、运行(running)、阻塞(blocked)、备用(standby)、空闲/新建(idle/new)、挂起-就绪(suspend-ready)、挂起-阻塞(suspend-blocked)、完成/终止(done-terminiated)、僵化(zomified)

ready(就绪): 分派器给进程分配了处理器。
running(运行):在处理器上执行的进程。
blocked(阻塞):在外部事件发生前不能运行。
standby(备用):从就绪队列中挑选出在处理器上运行的进程。每个处理器,每一时刻只能有一个进程处于该状态。
idle/new(空闲/新建):不可运行的新创建进程。这是进程的初始状态。
suspend-ready(挂起-就绪):进程临时从就绪队列或从处理器中删除。原因:(1)系统操作性能低下,可能会崩溃,问题被纠正后进程挂起。(2)结果不精确或不正确,用户挂进程。(3)系统可能超负荷,因而挂起进程,直到负荷达到正常水平为止。进程为了等待某对象同步化的执行而自动挂起。
suspend-blocked(挂起-阻塞):当进程等待的事件永不发生或无限延迟时,阻塞进程被挂起。
done-terminiated(完成/终止):进程完成执行并且释放了资源。
zombified(僵化):进程终止,但没有返回父进程它的退出代码。进程接受退出代码前一直处于僵化状态。

就绪(ready)、运行(running)和阻塞状态(blocked)都被看做激活状态(active state),是最常见的实现进程状态。新建(new)和空闲(idle)状态是新创建进程的初始状态(准备执行但尚不能运行)。挂起-就绪(suspend-ready)和挂起-阻塞状态(suspend-blocked)是两种挂起进程执行的非激活状态。终止进程可以再次初始化。在进程完成执行后释放它前,进程可以进入一种僵化状态。

 

4.进程状态转换:
(1)初始化:
 新建->就绪   新创建进程为可运行而且放置在就绪队列中
 就绪->备用   下一个处理器的进程
(2)分派:      分派器给就绪队列中的进程分配处理器
  就绪->运行  当前处理器处理进程
  备用->运行  下一个处理器处理进程
(3)抢占:
  备用->就绪  进程被抢占并放回到就绪队列中
(4)时间耗尽:
  运行->就绪:时间片(时间段)用完
(5)阻塞:
  运行->阻塞:运行进程由于需要I/O或等待着外部事件的发生而放弃处理器。
(6)唤醒:
  阻塞->就绪:已发生事件或I/O
(7)挂起:
  运行->挂起->就绪: 进程临时从队列删除
  就绪->挂起->就绪: 非激活
  阻塞->挂起->阻塞:  进程从阻塞状态转换到挂起状态。
(8)恢复:
  挂起->就绪->就绪:进程从挂起-就绪中删除,
  挂起->阻塞->阻塞:同时从挂起-阻塞状态转换到激活状态
(9)退出:
  运行->僵化:进程完成但没有释放
  运行->终止:进程完成且释放
(10)重新初始化:
   终止->新建:进程完成,重新初始化并再次使用。


WIN32:备用状态(下一个使用处理器进程的过度状态).
       等待状态 = 阻塞和挂起状态的组合。当进程等待一个对象或对象组被设置成信号状态时,就进入此状态。当它退出时,对象处于非信号状态,但在终止时处于信号状态。一旦终止,等待进程则进入就绪状态。

 

5.进程优先权(priority scheme):决定就绪进程使用处理器的顺序。
进程被分配一个优先类(priority class)以及该类中的优先级(priority level)。系统从就绪队列中选择一个最高优先级开始。若该类中没有这样的进程,则搜索下一个较低优先权的进程。若较高优先权进程变为可用,则运行进程被抢先,即使它的时间段还没有过期也如此。进程由外部资源和系统分配优先权。子进程继承了父进程的优先权。
 
6.动态优先权方案:
高优先权进程降低为较低优先权,较低优先权进程可提升优先权
注意:大部分系统综合运用静态和动态优先权。抢先进程的优先权被降低,而等待进程的优先权被提升。

 

7.上下文切换:当一个运行进程从处理器中删除,而且系统选择另一个进程放在处理器上执行时,就发生了上下文切换。
上下文包含可执行映像(excutable image)、程序计数器(program counter)、寄存器(register)、堆栈(stack)以及用于动态和静态变量的分配内存。
发生上下文切换的情况:(1)进程的时间段用完(2)一个等待或新建进程准备就绪,而且已被选择使用处理器。(3)比运行进程较高的优先权进程变成就绪状态(4)运行进程的分配处理器发生了变化(5)运行进程发出I/O请求。

 

8.进程关系:
 当创建进程时,就分配一个地址空间。进程树结构:子进程只有一个父进程,但父进程可以有许多子进程。子进程和父进程可以访问在两种进程地址空间之外创建的共享内存区域。

 

9.进程终止:
 UNIX环境中,直到子进程返回退出代码到其父进程中时,它才能得到释放。如果父进程不能接受退出代码或由于该代码被忽略,或由于父进程过期了,那么子进程就不能被释放。进程将一直驻留内存中,直到它与另一个接受它的退出代码的进程联合为止。父进程终止前必须等待子进程的终止,如父进程不接受退出代码,那么子进程处于僵化状态,它不能继续执行,因为它已完成了执行,但不能被释放。

 

10.同步和异步进程:
 同步执行(synchronous):当父进程挂起执行,直到子进程终止为止.子进程终止返回退出代码到父进程,当父进程收到退出代码时,父进程就恢复并继续执行。父进程可以设置一个标志来指示进程的同步运行。
 异步进程(Aynchronous):当父和子进程相互独立运行(父进程被挂起),他们并发运行,继续执行直到完成。

 

11.进程映射:
  进程的3个片断:文本片断、堆栈片断、数据片断。
  进程映射:逻辑布局模型使用虚拟地址空间映射到RAM物理地址空间上。虚拟地址是相邻的,但物理地址没有必要相邻。
在UNIX环境中,如果子进程是父进程的拷贝,子进程和父进程则共享文本片断。虽然子进程由一个可执行新程序,但它是同一个进程,因此保持相同的进程ID和父ID
 
12.进程资源:
  资源(resource)是进程执行任务所使用的硬件设备和软件素材。
进程共享资源:
 (1)资源允许多个进程并发访问,或者在允许另一个进程访问前暂时只能允许单个进程的访问。(并发访问)
 (2)多进程间共享同一个处理器,但某一时刻只能有一个进程使用处理器。(连续可重用性)
 (3)排他性访问:当进程需要获取资源时,请求资源->使用资源->释放资源 以便让其他进程使用。如果资源不可用,进程必须等待,直到可用为止。一旦资源变为可用,进程就被唤醒。一些资源一旦被使用后就不能被中断,而另一些资源可以被中断。

基本资源类型3种:硬件、软件、数据。
 硬件资源为物理设备,如处理器(操纵数据和执行程序的指令),主内存和RAM(用于数据存储和读取的硬件资源),I/O设备<屏幕、键盘、鼠标称为虚拟控制台>(为进程提供与自身外部资源间相互发送或接收数据的途径)。

 数据资源:操纵数据(文件、对象和句柄)、系统数据(环境变量等)以及全局定义变量(信号量和互斥量)。

注意:为了防止数据破坏必须小心谨慎。访问共享内存应当同时避免覆盖数据。可以使用信号量、互斥量、临界区等来实现同步。内存也可以通过存在于多个进程的虚拟地址空间中而被共享(如环境变量)

 软件资源:可以是其他进程或动态链接库(dll)。库可以是针对进程的一个语句、子程序等的源代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值