进程、线程与协程

进程、线程和协程是计算机科学中的重要概念,用于描述执行计算任务的不同方式。它们的主要区别如下:

  1. 进程(Process):进程是操作系统中的一个独立执行单元,具有独立的内存空间和系统资源。一个进程可以包含多个线程。进程之间相互隔离,每个进程有自己的地址空间和文件描述符,不同进程之间的通信需要使用特定的机制,如管道、套接字等。进程之间的切换开销相对较大。

  2. 线程(Thread):线程是进程内的一个执行流,共享同一进程的内存空间和系统资源。多个线程可以同时执行不同的任务,每个线程有自己的栈和局部变量,但共享进程的全局变量和堆内存。线程之间的切换相对于进程要快得多,因为线程共享了大部分上下文信息。

  3. 协程(Coroutine):协程是一种用户级的轻量级线程,由程序控制而非操作系统调度。协程可以在特定的时间点挂起、恢复和切换执行。不同于线程的抢占式调度,协程是协作式调度,需要显式地在代码中插入切换点。协程之间的切换开销非常小。协程通常用于处理高并发、高吞吐量的任务,如网络编程、事件驱动编程等。

总结来说,进程是操作系统分配资源的基本单位,线程是进程内的执行流,而协程是由程序控制的用户级线程。进程之间相互隔离,线程共享同一进程的资源,而协程通过显式的切换点实现协作式调度。不同的场景和需求可能会选择不同的执行模型来实现并发和并行的任务处理。

进程

特点

  1. 独立性:每个进程都是独立的,拥有自己的地址空间、内存、文件描述符和其他系统资源。进程之间彼此隔离,互不干扰。

  2. 并发执行:操作系统可以同时运行多个进程,通过分配 CPU 时间片给各个进程,实现并发执行。

  3. 互相通信:进程之间可以通过进程间通信(IPC)机制进行数据交换和共享资源,例如管道、信号、共享内存等。

  4. 生命周期:进程的生命周期包括创建、执行、等待、终止等阶段。进程可以被其他进程创建、终止或等待。

  5. 状态:进程可以处于运行态、就绪态、阻塞态等不同的状态,根据操作系统的调度算法进行状态切换。

每个进程都由操作系统分配一个唯一的进程标识符(PID),可以通过 PID 来唯一标识和管理进程。

操作系统通过进程调度器来分配 CPU 时间片给不同的进程,根据调度算法决定哪个进程获得执行。进程可以通过系统调用或中断请求操作系统提供的服务和资源。

进程是操作系统中的核心概念,它使得操作系统能够同时运行多个任务,并提供了资源管理和任务调度的基础。

进程的控制状态PCB

PCB 是进程存在的唯一标识,这意味着一个进程的存在,必然会有一个 PCB,如果进程消失了,那么 PCB 也会随之消失。PCB中包含以下信息:

  • 进程描述信息:进程标识符:标识各个进程,每个进程都有一个并且唯一的标识符

  • 进程控制和管理信息:进程当前状态,如 new、ready、running、waiting 或 blocked 等;进程优先级:进程抢占 CPU 时的优先级;

  • 资源分配清单:有关内存地址空间或虚拟地址空间的信息,所打开文件的列表和所使用的 I/O 设备信息。

  • CPU 相关信息:CPU 中各个寄存器的值,当进程被切换时,CPU 的状态信息都会被保存在相应的 PCB 中,以便进程重新执行时,能从断点处继续执行。

进程上下文切换

在操作系统中,进程上下文切换是指从一个正在运行的进程切换到另一个就绪态的进程,使得另一个进程可以继续执行。上下文切换发生的时候,操作系统会保存当前进程的状态(上下文),进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源

进程上下文切换的过程包括以下步骤:

  1. 保存当前进程的上下文:操作系统会保存当前进程的寄存器状态、程序计数器和其他相关寄存器的值,以及进程的堆栈指针等信息。

  2. 切换到目标进程:操作系统根据调度算法选择下一个要执行的进程,并加载该进程的上下文。这包括恢复目标进程的寄存器状态、程序计数器和堆栈指针等。

  3. 更新内核数据结构:操作系统会更新内核的进程控制块(PCB)等数据结构,记录进程切换的相关信息。

  4. 执行目标进程:操作系统将控制权转移到目标进程,使其开始执行。

进程上下文切换是操作系统实现进程调度和并发执行的重要机制。它允许多个进程在一个处理器上交替执行,实现并发性和共享资源。然而,上下文切换也会带来一定的开销,包括保存和恢复进程的上下文、更新数据结构等,因此需要在性能和响应性之间进行权衡。优化上下文切换的方式包括减少切换次数、减少上下文保存的数据量等。

进程间通信方式

在操作系统中,进程之间可以通过多种方式进行通信,以实现数据交换、共享资源和协作完成任务。常见的进程通信方式包括:

  1. 管道(Pipe):管道是一种半双工的通信方式,适用于有亲缘关系的进程间通信。它可以在父子进程或兄弟进程之间传递数据,通常用于单向通信。

  2. 命名管道(Named Pipe):命名管道是一种有名字的管道,可以在无亲缘关系的进程之间进行通信。不同于管道,命名管道可以在不同的进程间共享数据。两种管道信息都在缓存内核中,遵循先进先出的原则。

  3. 信号(Signal):信号是一种异步通信机制,用于通知进程发生了某个事件。进程可以通过发送信号给其他进程,来请求某种操作或通知其发生的事件。

  4. 共享内存(Shared Memory):共享内存是一种高效的进程间通信方式,允许多个进程直接访问同一块内存区域。进程可以通过读写共享内存来进行数据交换。

  5. 消息队列(Message Queue):消息队列是一种通过消息传递进行进程间通信的方式。进程可以将消息发送到消息队列中,其他进程可以从队列中获取消息。

  6. 信号量(Semaphore):信号量是一种用于进程同步和互斥的机制。通过对信号量的操作,进程可以控制对共享资源的访问。

  7. 套接字(Socket):套接字是一种网络编程中常用的通信方式,允许不同主机上的进程进行通信。它提供了一种标准化的接口,支持进程间的数据传输和网络通信。

这些进程通信方式各有特点,适用于不同的场景和需求。在选择进程通信方式时,需要考虑进程间的关系、数据量、性能要求和安全性等因素。

线程

线程冲突

线程冲突是指在多线程编程中,多个线程同时访问共享资源时可能引发的问题。这些问题包括数据竞争、死锁和活锁等。

  1. 数据竞争(Data Race):数据竞争是最常见的线程冲突问题。当多个线程同时访问和修改共享的数据时,如果没有适当的同步机制保证互斥访问,就可能导致数据的不一致和错误。例如,多个线程同时对同一个变量进行写操作,会导致不确定的结果。

  2. 死锁(Deadlock):死锁是指多个线程因为相互等待对方释放资源而无法继续执行的情况。当多个线程持有某些资源,并且需要等待其他线程释放它们所持有的资源时,如果形成了一个闭环等待的状态,就会导致死锁。

  3. 活锁(Livelock):活锁是指多个线程在并发执行时,由于彼此响应对方的动作而无法继续执行的情况。线程可能会反复尝试执行某个操作,但由于其他线程的干扰,无法取得进展。

解决线程冲突的常用方法包括:

  1. 互斥锁(Mutex):使用互斥锁可以实现对共享资源的互斥访问,一次只允许一个线程访问共享资源,其他线程需要等待锁释放后才能继续执行。

  2. 条件变量(Condition Variable):条件变量用于线程间的等待和通知机制,可以实现线程的等待和唤醒操作,避免了忙等待的情况。

  3. 读写锁(Read-Write Lock):读写锁允许多个线程同时读取共享资源,但只允许一个线程进行写操作。这样可以提高读操作的并发性能。

  4. 原子操作(Atomic Operation):原子操作是不可分割的操作,可以确保对共享资源的操作是原子的,避免了数据竞争问题。

  5. 同步工具(Synchronization Primitives):除了上述基本的同步机制,还有一些更高级的同步工具,如信号量(Semaphore)、屏障(Barrier)等,可以根据具体需求选择合适的工具。

正确地设计和实现线程同步机制是解决线程冲突的关键,避免数据竞争和死锁等问题的发生。同时,对于复杂的并发场景,还需要进行仔细的测试和调试,以确保线程安全性和正确性。

线程的调度分配算法

早期批处理情况:

  1. 先到先服务

  2. 短作业优先

  3. 高相应比优先

现在时间分配调度策略:

  1. 时间片轮转调度算法

  2. 优先级调度算法

  3. 多级反馈队列调度算法

线程的优缺点

线程的优点:

  • 一个进程中可以同时存在多个线程;

  • 各个线程之间可以并发执行;

  • 各个线程之间可以共享地址空间和文件等资源;

线程的缺点:

  • 当进程中的一个线程崩溃时,会导致其所属进程的所有线程崩溃(这里是针对 C/C++ 语言)

用户线程如何理解、优缺点

用户线程是基于用户态的线程管理库来实现的,那么线程控制块(*Thread Control Block, TCB*) 也是在库里面来实现的,对于操作系统而言是看不到这个 TCB 的,它只能看到整个进程的 PCB。所以,用户线程的整个线程管理和调度,操作系统是不直接参与的,而是由用户级线程库函数来完成线程的管理,包括线程的创建、终止、同步和调度等。

用户线程的优点

  • 每个进程都需要有它私有的线程控制块(TCB)列表,用来跟踪记录它各个线程状态信息(PC、栈指针、寄存器),TCB 由用户级线程库函数来维护,可用于不支持线程技术的操作系统;

  • 用户线程的切换也是由线程库函数来完成的,无需用户态与内核态的切换,所以速度特别快;

用户线程的缺点

  • 由于操作系统不参与线程的调度,如果一个线程发起了系统调用而阻塞,那进程所包含的用户线程都不能执行了。

  • 当一个线程开始运行后,除非它主动地交出 CPU 的使用权,否则它所在的进程当中的其他线程无法运行,因为用户态的线程没法打断当前运行中的线程,它没有这个特权,只有操作系统才有,但是用户线程不是由操作系统管理的。

  • 由于时间片分配给进程,故与其他进程比,在多线程执行时,每个线程得到的时间片较少,执行会比较慢;

内核线程如何理解、优缺点

内核线程是由操作系统管理的,线程对应的 TCB 自然是放在操作系统里的,这样线程的创建、终止和管理都是由操作系统负责。

内核线程的优点

  • 在一个进程当中,如果某个内核线程发起系统调用而被阻塞,并不会影响其他内核线程的运行;

  • 分配给线程,多线程的进程获得更多的 CPU 运行时间;

内核线程的缺点

  • 在支持内核线程的操作系统中,由内核来维护进程和线程的上下文信息,如 PCB 和 TCB;

  • 线程的创建、终止和切换都是通过系统调用的方式来进行,因此对于系统来说,系统开销比较大;

轻量级线程如何理解

轻量级进程(*Light-weight process,LWP*)是内核支持的用户线程,一个进程可有一个或多个 LWP,每个 LWP 是跟内核线程一对一映射的,也就是 LWP 都是由一个内核线程支持,而且 LWP 是由内核管理并像普通进程一样被调度。在大多数系统中,LWP与普通进程的区别也在于它只有一个最小的执行上下文和调度程序所需的统计信息

LWP 与用户线程的对应关系就有三种:

  • 1 : 1,即一个 LWP 对应 一个用户线程;

  • N : 1,即一个 LWP 对应多个用户线程;

  • M : N,即多个 LWP 对应多个用户线程;

线程与进程的比较

线程与进程的比较如下:

  • 进程是资源(包括内存、打开的文件等)分配的单位线程是 CPU 调度的单位

  • 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;

  • 线程同样具有就绪、阻塞、执行三种基本状态,同样具有状态之间的转换关系;

  • 线程能减少并发执行的时间和空间开销;

对于,线程相比进程能减少开销,体现在:

  • 线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,比如内存管理信息、文件管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们;

  • 线程的终止时间比进程快,因为线程释放的资源相比进程少很多;

  • 同一个进程内的线程切换比进程切换快,因为线程具有相同的地址空间(虚拟内存共享),这意味着同一个进程的线程都具有同一个页表,那么在切换的时候不需要切换页表。而对于进程之间的切换,切换的时候要把页表给切换掉,而页表的切换过程开销是比较大的;

  • 由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了;

所以,不管是时间效率,还是空间效率线程比进程都要高。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程是操作系统资源分配和独立运行的最小单位,而线程是任务调度和系统执行的最小单位。每个进程都有独立的地址空间,一个进程崩溃不会影响其他进程;而一个进程中的多个线程共享该进程的地址空间,一个线程的非法操作会导致整个进程崩溃。此外,进程之间的上下文切换开销较大,因为每个进程有独立的代码和数据空间,而线程组共享代码和数据空间,因此线程之间的切换开销较小。 进程由共享空间和一个或多个线程组成,线程之间共享进程的内存空间。一个标准的线程线程ID、程序计数器PC、寄存器和栈组成。 进程线程的选择取决于具体的应用需求。进程具有独立的功能,适合用于执行复杂的任务,而线程可以实现任务的并行处理和资源共享。协程是一种用户态的轻量级线程,其调度完全由用户控制,适用于需要高效的协作和协调的场景。 进程线程协程的区别总结如下: - 进程是操作系统资源分配和独立运行的最小单位,线程是任务调度和系统执行的最小单位,协程是一种用户态的轻量级线程。 - 进程拥有独立的地址空间,线程共享进程的地址空间,一个进程崩溃不会影响其他进程,但一个线程的非法操作会导致整个进程崩溃。 - 进程之间的上下文切换开销较大,线程之间的切换开销较小。 - 进程适用于执行复杂的任务,线程适用于任务的并行处理和资源共享,协程适用于高效的协作和协调。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值