{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

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

Java_oldboyJava_oldboy 回答0 收藏1
收藏问题

2条回答

Cciradih

Cciradih

回答于2022-06-27 17:11

首先,Linux多线程和多进程的作用其实作用都差不多,主要是为了完成并发任务。

其次,我们再来看看什么是进程,什么是线程,以及它们之间的关系。

线程是执行体,用来执行我们写的代码或指令,多个线程可以同时执行。

进程是容器,包含了线程执行所需要的一切系统资源,线程只能在进程空间中执行,进程中可以包含多个执行线程,但只有一个主线程,我们代码中包含main函数的线程也就是进程中的主线程。

进程本身是不活跃的,在Linux中,如果进程中的所有执行线程都已经退出,而父进程没有捕获子进程结束的信号,此时该进程则会变为僵尸进程,该进程不占CPU时间,但会占据系统资源,如果大量存在,必定会导致系统资源被耗尽,导致死机。

通俗的比喻就是,操作系统就像一个手工作坊,进程就相当于作坊中一个个独立的工作车间,而线程就相当于车间中真正劳作的工人,没有工人的车间是无法进行生产的。

进程空间之间彼此隔离,可以说互不影响,就相当于上述手工作坊中的两个车间中都有个叫张三的人,但其中一个因为上班时间玩手机被老板开除了,而另一个车间中的张三却不会受到任何影响。(当然,这不是绝对的,Linux子进程会在创建初期共享父进程的进程空间,而vfork系统调用会导致这种共享一直存在,导致父进程中的变量修改会影响子进程数据,而fork则采用写时拷贝技术来避免了这个问题)。

由于进程的这种隔离性,进程之间共享数据和通信也变得麻烦许多,一般的技术手段就是管道,POSIX信号,System V信号,共享内存,Socket网路通信等等。

线程之间也没有进程那么麻烦,它们是共享整个进程空间的,这就像车间里要开小组会议,一个人发言的时候大家都能听到,但这又造成了另一个问题,毕竟一个车间十来号人,难免人多嘴杂,怎么保证一个人发言的中途没人插嘴呢,这就是线程同步的问题,一般的技术手段就是信号量,互斥锁,读写锁,文件锁等等。

当然,多线程中同步的问题在多进程中依然会遇到,解决办法自然也就和多线程差不多。

评论0 赞同0
  •  加载中...
doodlewind

doodlewind

回答于2022-06-27 17:11

先声明下,什么是多进程、多线程

什么是多进程?

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

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

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

什么是多线程?

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

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

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

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

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

线程与进程有什么不同?

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

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

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

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

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

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

多线程调度

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

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

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

线程的保护机制

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

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

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

评论0 赞同0
  •  加载中...

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<