乐趣区

linux下的多进程和多线程他们分别有什么作用

什么是多进程?

在计算中,进程是正在执行的计算机程序的一个实例。或者简单地说,运行程序也称为进程。

多进程意味着“在单个计算机系统中具有两个或更多个 CPU。

例如,如果计算机系统具有双核心,并且同时运行(执行)两个进程(同时),则可以通过将每个进程分配给系统的每个核心来实现。因此,这两个过程可以同时执行。换句话说,多进程可以定义为多个进程可以同时执行,而不是一个接一个地执行。在多进程中,每个进程都有不同的地址空间和资源。

什么是多线程?

进程是线程的集合。线程是一个轻量级的过程。线程执行是执行的小处理单元。

每个进程包含许多线程,所有线程共享相同的内存空间。

同一个进程中可以存在多个线程,共享内存等资源,而不同的进程不共享这些资源。

在单个处理器上,多线程通常通过时分多路复用(如多任务处理):处理器在不同的线程之间切换。

这种上下文切换通常发生得足够频繁,以至于用户感觉到线程或任务同时运行。

线程与进程有什么不同?

线程不同于传统的多任务操作系统进程:

进程通常是独立的,而线程作为进程的子集存在

进程比线程携带更多的状态信息,而进程内的多个线程共享进程状态以及内存和其他资源

进程具有独立的地址空间,而线程共享其地址空间

进程只能通过系统提供的进程间通信机制进行交互

同一进程中的线程之间的上下文切换通常比进程之间的上下文切换更快

多线程调度

操作系统通过以下两种方式之一来调度线程:

先发制人的多线程一般被认为是优越的方法,因为它允许操作系统确定何时发生上下文切换。抢占式多线程的缺点是系统可能会在不恰当的时间进行上下文切换,引起锁车队,优先级反转或其他负面影响,这可能会通过协作式多线程来避免。

另一方面,合作多线程依赖于线程自己放弃控制,一旦他们在停止点。如果线程正在等待资源变为可用状态,则会产生问题。

线程的保护机制

一个线程将共享父进程的所有全局变量和文件描述符,允许程序员在一个进程内轻松地分离多个任务。

它共享一切,除了每个线程将有自己的程序计数器,堆栈和寄存器。由于每个线程都有自己的堆栈,所以线程之间不会共享局部变量。

由于一个进程的所有线程共享相同的全局变量,所以同步访问全局变量会出现问题。例如,我们假设你有一个全局变量 X 和两个线程 A 和 B. 假设线程 A 和 B 只会增加 X 的值。当线程 A 开始执行时,它将把 X 的值复制到寄存器中并递增。在它有机会将值写回内存之前,此线程被暂停。下一个线程开始,读取第一个线程读取的相同的 X 值,递增并写回到内存。然后,第一个线程完成执行并将其值从寄存器写回到内存。在这两个线程完成之后,X 的值会按照您的预期递增 1 而不是 2。

退出移动版