![]() |
1
1233
进程和线程都是独立的执行序列。典型的区别是(同一进程的)线程在共享内存空间中运行,而进程在单独的内存空间中运行。 我不确定您可能指的是什么“硬件”和“软件”线程。线程是操作环境特性,而不是CPU特性(尽管CPU通常具有使线程高效的操作)。 Erlang使用术语“进程”,因为它不公开共享内存多道程序设计模型。称它们为“线程”意味着它们有共享的内存。 |
![]() |
2
691
过程
螺纹
在这里的msdn上找到这个:
|
![]() |
3
253
过程:
线程:
|
![]() |
4
101
首先,让我们看看理论方面。您需要从概念上理解流程是什么,以理解流程和线程之间的区别以及它们之间共享的内容。 我们有以下部分 2.2.2经典螺纹模型 在里面 Modern Operating Systems 3e 塔嫩鲍姆:
他继续说:
下一步,他提供了下表:
让我们来处理 hardware multithreading 问题。传统上,CPU支持单个执行线程,通过单个程序计数器和一组寄存器来维护线程的状态。但是如果有缓存丢失怎么办?从主内存中获取数据需要很长时间,而当这发生时,CPU只是处于空闲状态。所以有人想基本上有两组线程状态(PC+寄存器),这样另一个线程(可能在同一进程中,也可能在不同进程中)可以在另一个线程等待主内存时完成工作。这个概念有多个名称和实现,例如超线程和 Simultaneous Multithreading (简称SMT)。 现在让我们看看软件方面。基本上有三种方法可以在软件方面实现线程。
实现线程所需要的只是保存CPU状态和维护多个堆栈的能力,在许多情况下,这可以在用户空间中完成。用户空间线程的优点是超快速的线程切换,因为您不必陷入内核中,并且能够按您喜欢的方式调度线程。最大的缺点是无法进行阻塞I/O(这将阻塞整个进程及其所有用户线程),这是我们首先使用线程的一个重要原因。使用线程阻塞I/O在许多情况下大大简化了程序设计。 内核线程的优点是除了将所有调度问题留给操作系统之外,还能够使用阻塞I/O。但每个线程切换都需要捕获到内核中,这可能相对较慢。但是,如果您因为I/O阻塞而切换线程,这并不是真正的问题,因为I/O操作可能已经将您困在内核中了。 另一种方法是将这两种方法结合起来,使用多个内核线程,每个线程都有多个用户线程。 回到术语问题,你可以看到一个过程和一个执行线程是两个不同的概念,你选择使用哪个术语取决于你在说什么。关于“轻量级过程”这个术语,我个人并不认为它的意义所在,因为它并不能真正传达正在发生的事情以及术语“执行的线程”。 |
![]() |
5
68
关于并发编程的更多解释
记住普通人, 在计算机上,打开Microsoft Word和Web浏览器。我们叫这两个 过程 . 在Microsoft Word中,您键入一些内容,它将自动保存。现在,您将看到编辑和保存是并行进行的——在一个线程上进行编辑,在另一个线程上进行保存。 |
![]() |
6
44
被盗 here . |
![]() |
7
24
进程是代码、内存、数据和其他资源的集合。线程是在进程范围内执行的代码序列。您可以(通常)在同一进程中同时执行多个线程。 |
![]() |
8
22
|
![]() |
9
18
|
![]() |
10
17
过程:
例子:
线程:
例子:
|
![]() |
11
12
进程和线程都是独立的执行序列。典型的区别是(同一进程的)线程在共享内存空间中运行,而进程在单独的内存空间中运行。 过程 是正在执行的程序。它有文本部分,即程序代码、当前活动(由程序计数器的值和处理器寄存器的内容表示)。它还包括包含临时数据(如函数参数、返回地址和局部变量)的过程堆栈,以及包含全局变量的数据部分。进程还可以包括堆,堆是在进程运行时动态分配的内存。 螺纹 线程是CPU利用率的基本单位;它包括线程ID、程序计数器、寄存器集和堆栈。它与属于同一进程的其他线程共享其代码段、数据段和其他操作系统资源,如打开的文件和信号。 --从操作系统中提取 |
![]() |
12
10
线程和进程都是操作系统资源分配的原子单位(即,有一个并发模型描述了CPU时间如何在它们之间划分,以及拥有其他操作系统资源的模型)。不同之处在于:
上面的格雷格·休吉尔对“过程”这个词的二郎含义是正确的,并且 here 有人讨论了Erlang为什么可以做轻量级的流程。 |
![]() |
13
9
试图回答有关Java世界的问题。 进程是程序的执行,但线程是进程中的单个执行序列。一个进程可以包含多个线程。线程有时称为 轻量级过程 . 例如: 例1: JVM在单个进程中运行,而JVM中的线程共享属于该进程的堆。这就是为什么几个线程可以访问同一个对象的原因。线程共享堆并有自己的堆栈空间。这就是一个线程对一个方法及其局部变量的调用如何使线程免受其他线程的攻击。但是堆不是线程安全的,必须同步才能保证线程安全。 例2: 程序可能无法通过读取击键来绘制图片。程序必须充分注意键盘输入,如果一次无法处理多个事件,则会导致故障。这个问题的理想解决方案是同时无缝地执行一个程序的两个或多个部分。线程允许我们这样做。这里画图是一个过程,读键是一个子过程(线程)。 |
![]() |
14
9
Difference between Thread and Process? 进程是应用程序的执行实例,线程是进程内的执行路径。此外,一个进程可以包含多个线程。重要的是要注意,一个线程可以做一个进程可以做的任何事情。但是,由于一个进程可以由多个线程组成,因此一个线程可以被视为一个“轻量级”进程。因此,一个线程和一个进程之间的本质区别是每个线程用来完成的工作。线程用于小任务,而进程用于更重的任务,基本上是应用程序的执行。 线程和进程之间的另一个区别是,同一进程中的线程共享相同的地址空间,而不同的进程不共享。这使得线程可以读取和写入相同的数据结构和变量,也有助于线程之间的通信。过程间通信,也称为IPC,或过程间通信,非常困难且资源密集。
|
![]() |
15
7
从面试官的角度来看,基本上我只想听到三件主要的事情,除了显而易见的事情,比如一个过程可以有多个线程:
如果你想要更多,斯科特·兰厄姆的回答几乎涵盖了一切。 所有这些都是从操作系统的角度来看的。不同的语言可以实现不同的概念,如任务、轻量级线程等等,但它们只是使用线程(Windows上的光纤)的方法。 没有硬件和软件线程。有硬件和软件 例外情况 和 中断 或用户模式和内核 螺纹 . |
![]() |
16
7
以下是我从其中一篇文章中得到的信息 The Code Project . 我想它清楚地解释了所有需要的东西。
|
![]() |
17
7
http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html
|
![]() |
18
6
|
![]() |
19
6
过程 :正在执行的程序称为进程 螺纹 :thread是一种功能,根据“一个与另一个”的概念与程序的另一部分一起执行,因此thread是进程的一部分。 |
![]() |
20
5
来自嵌入式世界,我想补充一点,流程的概念只存在于“大”处理器中( 台式CPU,ARM Cortex A-9 )具有MMU(内存管理单元)和支持使用MMU的操作系统(如 Linux )带小型/老式处理器和微控制器和小型RTOS操作系统( 实时操作系统 )例如freertos,没有MMU支持,因此没有进程,只有线程。 螺纹 可以访问彼此的内存,并且它们是由操作系统以交错方式安排的,因此它们看起来是并行运行的(或者使用真正并行运行的多核)。 过程 另一方面,生活在由MMU提供和保护的虚拟内存的私人沙盒中。这很方便,因为它可以:
|
![]() |
21
5
|
![]() |
22
4
在用包含多线程的Python(解释语言)构建算法时,我惊讶地发现,与我以前构建的顺序算法相比,执行时间没有任何提高。为了理解这个结果的原因,我做了一些阅读,相信我学到的内容提供了一个有趣的上下文,从中可以更好地理解多线程和多进程之间的区别。 多核系统可以运行多个执行线程,因此Python应该支持多线程。但python不是编译语言,而是解释语言 一 . 这意味着必须解释程序才能运行,并且在程序开始执行之前,解释程序不知道该程序。然而,它所知道的是Python的规则,然后动态地应用这些规则。然后,Python中的优化必须主要是解释器本身的优化,而不是要运行的代码。这与编译语言(如C++)形成对比,并对Python中的多线程产生了影响。具体来说,python使用全局解释器锁来管理多线程。 另一方面,编译语言是编译好的。程序是“完全”处理的,首先根据其语法定义对其进行解释,然后映射到语言不可知的中间表示,最后链接到可执行代码中。这个过程允许对代码进行高度优化,因为编译时代码都是可用的。在创建可执行文件时定义了各种程序交互和关系,并可以做出关于优化的可靠决策。 在现代环境中,python的解释器必须允许多线程,这必须是安全和高效的。这就是解释语言和编译语言之间的区别进入画面的地方。解释器不得干扰来自不同线程的内部共享数据,同时优化使用处理器进行计算。 正如在前面的文章中所指出的,进程和线程都是独立的顺序执行,主要的区别在于内存在进程的多个线程之间共享,而进程隔离它们的内存空间。 在python中,通过全局解释器锁防止不同线程同时访问数据。它要求在任何Python程序中,任何时候只能执行一个线程。另一方面,可以运行多个进程,因为每个进程的内存与任何其他进程都是独立的,并且进程可以在多个核心上运行。 一 唐纳德·克努斯对计算机程序设计艺术中的解释程序有很好的解释:基本算法。 |
![]() |
23
4
尝试从Linux内核的操作系统视图回答它
程序在启动到内存中时会变成一个进程。一个进程有自己的地址空间,这意味着在内存中有不同的段,例如用于存储编译代码的.text段,.bss用于存储未初始化的静态或全局变量等。每个进程都有自己的程序计数器和用户spcae。
堆栈
. 在内核中,每个进程都有自己的内核堆栈(由于安全问题,它与用户空间堆栈分离)和一个名为
对于线程,它们驻留在一个进程中,并与其他资源共享父进程的地址空间,这些资源可以在线程创建期间传递,例如文件系统资源、共享挂起的信号、共享数据(变量和指令),因此使线程更轻,从而允许更快的上下文切换。在内核中,每个线程都有自己的内核堆栈以及
|
![]() |
24
4
|
![]() |
25
3
同一进程中的线程共享内存,但每个线程都有自己的堆栈和寄存器,并且线程将特定于线程的数据存储在堆中。线程从不独立执行,因此与进程间通信相比,线程间通信要快得多。 进程从不共享相同的内存。当子进程创建时,它会复制父进程的内存位置。进程通信是通过使用管道、共享内存和消息解析来完成的。线程之间的上下文切换非常缓慢。 |
![]() |
26
2
它们几乎一样…但关键的区别在于线程是轻量级的,而在上下文切换、工作负载等方面,进程是很重的。 |
![]() |
27
2
最佳答案 过程: 过程基本上是一个正在执行的程序。它是一个活动实体。 一些操作系统使用术语“任务”指正在执行的程序。 进程总是存储在主存储器中,也称为主存储器或随机存取存储器。 因此,过程被称为活动实体。如果机器重新启动,它就会消失。 多个进程可以与同一个程序相关联。 在多处理器系统上,可以并行执行多个进程。 在单处理器系统中,虽然没有实现真正的并行性,但是应用了一种进程调度算法,并且将处理器调度为一次执行一个进程,从而产生一种并发的假象。 示例:执行“计算器”程序的多个实例。每个实例都被称为一个过程。 线程: 线程是进程的一个子集。 它被称为_轻量级进程_,因为它类似于实际进程,但在进程上下文中执行,并共享内核分配给进程的相同资源。 通常,一个进程只有一个控制线程“一次执行一组机器指令”。 进程也可以由多个执行线程组成,这些线程同时执行指令。 多线程控制可以利用多处理器系统上的真正并行性。 在单处理器系统中,应用了一种线程调度算法,处理器被调度为一次运行一个线程。 在一个进程中运行的所有线程共享相同的地址空间、文件描述符、堆栈和其他与进程相关的属性。 由于进程的线程共享相同的内存,因此将对共享数据的访问与进程同步具有前所未有的重要性。 参考文献 https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread |
![]() |
28
1
示例1:JVM在单个进程中运行,而JVM中的线程共享属于该进程的堆。这就是为什么几个线程可以访问同一个对象的原因。线程共享堆并有自己的堆栈空间。这就是一个线程对一个方法及其局部变量的调用如何使线程免受其他线程的攻击。但是堆不是线程安全的,必须同步才能保证线程安全。 |
![]() |
29
1
将流程视为一个所有权单元或任务所需的资源。进程可以有内存空间、特定的输入/输出、特定的文件和优先级等资源。 线程是一个可调度的执行单元,或者简单地说,是一系列指令的执行进度。 |
![]() |
30
1
工艺和螺纹的区别如下:
|
![]() |
user107586 · 如何处理等待句柄不会导致无限循环? 5 月前 |
![]() |
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 5 月前 |
![]() |
BenjiFB · C#内存缓存:在一次操作中追加到列表? 5 月前 |
![]() |
András Takács · Python多线程问题 9 月前 |
|
András Takács · Python多线程错误 9 月前 |