什么是进程?什么是线程?

一、前言

简而言之,一个程序至少有一个进程,一个进程至少有一个线程

二、进程(Process)

1. 定义与组成
  • 定义: 进程是操作系统中资源分配的基本单位,是程序在计算机上运行的一个实例。
  • 组成:
    • 地址空间: 每个进程有独立的虚拟地址空间,包含代码段、数据段、堆和栈等。
    • 进程控制块(PCB): 存储有关进程状态的信息,如进程 ID、寄存器状态、调度信息等。
    • 文件描述符表: 存储进程打开的文件及其状态。
2. 资源与隔离
  • 独立的地址空间: 每个进程在独立的虚拟地址空间中运行,保证进程间的数据不会互相干扰。
  • 资源隔离: 进程拥有独立的内存和资源,进程间不会直接共享资源,这有助于提高系统的稳定性和安全性。
3. 开销
  • 创建和销毁开销: 创建进程涉及分配新的地址空间、初始化数据结构等,开销较大。销毁进程时,系统需要回收资源。
  • 上下文切换: 切换进程需要保存和恢复进程的状态,涉及到大量的上下文切换开销。
4. 进程间通信(IPC)
  • 机制: 进程间通信可以通过管道(pipes)、消息队列(message queues)、共享内存(shared memory)、信号量(semaphores)等机制实现。
  • 开销: IPC 机制的开销较大,因为涉及到进程间的同步和数据传输。
5. 进程创建与销毁
  • 创建: 通常通过 fork() 系统调用创建子进程。fork() 会复制父进程的地址空间和资源到子进程。
  • 销毁: 进程可以通过 exit() 终止自身,父进程可以通过 wait() 等待子进程的终止。

6.优缺点

优点:

  • 顺序程序的特点:具有封闭性和可再现性;
  • 程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提高了系统的效率和系统的资源利用率。 

缺点:

  • 操作系统调度切换多个线程要比切换调度进程在速度上快的多。而且进程间内存无法共享,通讯也比较麻烦。
  • 线程之间由于共享进程内存空间,所以交换数据非常方便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

三、线程(Thread)

1. 定义与组成
  • 定义: 线程是进程内的一个执行单元,线程间共享同一进程的资源。
  • 组成:
    • 寄存器: 每个线程有自己的寄存器集。
    • : 每个线程有独立的执行栈,用于存储函数调用和局部变量。
    • 线程局部存储: 用于存储每个线程独立的数据。
2. 资源与共享
  • 共享资源: 同一进程内的线程共享进程的地址空间、文件描述符、全局变量等。这使得线程间的数据交换更加高效。
  • 隔离: 线程之间没有独立的地址空间,因此它们对数据的修改是直接的,这可能导致竞争条件(race conditions)等问题。
3. 开销
  • 创建和销毁开销: 线程的创建和销毁开销相对较小,因为线程共享进程的资源,不需要分配新的地址空间。
  • 上下文切换: 线程的上下文切换比进程的上下文切换开销小,因为线程共享同一进程的状态。
4. 线程间通信
  • 机制: 线程间通信通常利用共享内存进行,因为它们共享同一个地址空间。同步机制如互斥锁(mutexes)和条件变量(condition variables)用于协调线程间的操作。
  • 开销: 线程间的通信开销较小,主要由于资源共享和轻量级的同步机制。
5. 线程创建与销毁
  • 创建: 通常通过线程库(如 POSIX 线程库 pthread)创建新线程。pthread_create() 用于启动新线程。
  • 销毁: 线程可以通过 pthread_exit() 终止自身,或由其他线程调用 pthread_join() 等待其终止。

6.优缺点

优点:

  • 1)它是一种非常"节俭"的多任务操作方式。

  在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。

  • 线程间方便的通信机制,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;
  • 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;
  • 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

 缺点: 

  • 调度时, 要保存线程状态,频繁调度, 需要占用大量的机时;
  • 程序设计上容易出错(线程同步问题)。

四、主要区别总结

进程线程
地址空间每个进程有独立的地址空间线程共享同一进程的地址空间
资源共享进程之间资源隔离,通信需要 IPC 机制线程共享资源,通信通过共享内存进行,效率更高
创建与销毁开销
上下文切换
崩溃影响进程崩溃不会影响其他进程线程崩溃可能影响同一进程中的其他线程

五、实际应用场景

  • 进程: 适用于需要高隔离性的应用,例如多个不同的服务(如数据库、web 服务器)运行在独立的进程中,以避免彼此影响。
  • 线程: 适用于需要并发处理的应用,如网络服务器、计算密集型任务等,通过多线程实现高效的任务处理和响应。
  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值