进程和线程的区别(c++)

本文详细介绍了进程和线程的区别,包括进程的动态特征、并发性、生命周期,以及线程的意义和线程安全问题。讨论了进程的运行状态、僵尸进程、时间片概念,父子进程创建和Linux下查看进程的方法。线程作为CPU调度的基本单位,其轻量级特性使得线程在资源消耗和切换成本上较进程更低。文章还探讨了多线程同步与互斥的实现方法及其应用场景。

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

进程和线程的区别

进程 process

什么是进程

一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度运行的基本单位 进程与程序的差别

  • 进程是一个动态的概念,而程序只是一组指令。
  • 不同的进程可以执行同一个程序
  • 每个进程都有自己的生命周期
  • 进程之间存在并发性
  • 进程间会相互制约 在资源方面或者运行调度方面
  • 进程可以创建子进程,程序不能创建子程序
  • 从结构上讲,每个进程都由程序、数据和一个进程控制块(Process Control Block, PCB)组成

所以进程具有以下特征:

  1. 动态特征:进程对应于程序的运行,动态产生、消亡,在其生命周期中进程也是动态的、
  2. 并发特征:任何进程都可以同其他进程一起向前推进
  3. 独立特征:进程是相对完整的调度单位,可以获得CPU,参与并发执行
  4. 交往特征:一个进程在执行过程中可与其他进程产生直接或间接关系
  5. 异步特征:每个进程都以相对独立、不可预知的速度向前推进
  6. 结构特征:每个进程都有一个PCB作为他的数据结构

进程的运行状态

733013-20170621111849804-2044669562

运行态:进程正在运行,也即是cpu正在它身上。

就绪(等待)态:进程可以运行,已经处于等待队列中,也就是说调度类下次可能会选中它

睡眠(阻塞)态:进程睡眠了,不可运行。

各状态之间的转换方式为:(也许可能不太好理解,可以结合稍后的例子) (1)新状态->就绪态:当等待队列允许接纳新进程时,内核便把新进程移入等待队列。 (2)就绪态->运行态:调度类选中等待队列中的某个进程,该进程进入运行态。 (3)运行态->睡眠态:正在运行的进程因需要等待某事件(如IO等待、信号等待等)的出现而无法执行,进入睡眠态。 (4)睡眠态->就绪态:进程所等待的事件发生了,进程就从睡眠态排入等待队列,等待下次被选中执行。 (5)运行态->就绪态:正在执行的进程因时间片用完而被暂停执行;或者在抢占式调度方式中,高优先级进程强制抢占了正在执行的低优先级进程。 (6)运行态->终止态:一个进程已完成或发生某种特殊事件,进程将变为终止状态。对于命令来说,一般都会返回退出状态码

### C++进程线程区别 #### 定义差异 在计算机科学中,进程是指具有独立功能的程序关于某个数据集合上的一次运行活动。每个进程拥有自己独立的地址空间、内存其他资源[^3]。 相比之下,线程进程中的一部分执行路径或轻量级子过程。同一进程内的多个线程可以并发执行,并共享该进程中的大部分资源,如文件描述符堆栈等。形象地说,可以把一个进程比喻成一列火车,而各个车厢则代表其中的不同线程。 #### 资源分配方式不同 操作系统为每一个启动的新进程都提供了一套全新的虚拟地址空间以及必要的硬件上下文环境来支持其正常运作;而对于同属一个父进程下的所有子线程来说,则不需要单独为其开辟新的存储区域——它们可以直接访问并操作属于这个共同祖先的一切公共资源(除了CPU时间片之外)。因此,在创建新单元时开销较小的是线程而非整个完整的进程实例化[^4]。 #### 创建销毁成本对比 由于上述提到的原因,通常情况下建立一个新的进程要比生成一条额外的工作流耗费更多的时间计算能力。当应用程序需要频繁地发起短暂的任务处理请求时采用多线程架构往往能带来更好的性能表现。然而值得注意的是,过多数量级别的活跃状态下的工作单位也会给调度器造成较大压力从而影响整体效率。 #### 并发性通信机制上的特点 因为各自享有专属的数据区段所以跨进程间的信息交换相对复杂一些,一般通过管道(Pipe)、信号(Signal)等方式实现高效安全的消息传递服务。相反地,对于隶属于同一个家族体系内部成员之间的协作交流就简单得多:直接利用全局变量或者函数参数等形式即可完成所需的操作目标设定结果反馈流程。 ```cpp #include <iostream> #include <thread> void threadFunction(int id) { std::cout << "Thread ID, " << id << ", is running.\n"; } int main() { // Creating threads. std::thread t1(threadFunction, 0); std::thread t2(threadFunction, 1); // Joining threads to the main thread. if (t1.joinable()) t1.join(); if (t2.joinable()) t2.join(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值