【发布时间】:2010-09-25 13:44:46
【问题描述】:
线程的最佳定义是什么?什么是进程? 如果我调用一个函数,我怎么知道一个线程正在调用它或一个进程(或者我不理解它??!)。这是在多核系统(四核)中。
【问题讨论】:
-
另见进程和线程有什么区别:stackoverflow.com/questions/200469/…
线程的最佳定义是什么?什么是进程? 如果我调用一个函数,我怎么知道一个线程正在调用它或一个进程(或者我不理解它??!)。这是在多核系统(四核)中。
【问题讨论】:
来自http://wiki.answers.com/Q/What_is_the_difference_between_a_computer_process_and_thread:
单个进程可以拥有多个线程,这些线程与运行在同一进程中的其他线程共享全局数据和地址空间,因此可以轻松地对同一数据集进行操作。进程不共享地址空间,如果要共享数据,必须使用不同的机制。
如果我们将运行文字处理程序视为一个进程,那么后台发生的自动保存和拼写检查功能就是该进程的不同线程,它们都在同一数据集(您的文档)上运行。
【讨论】:
要补充的一点是多核处理器如何处理这个问题。将线程视为代码的顺序执行。
CPU 中的一个核心一次只能执行一个线程。因此,如果该线程因为程序正在等待 I/O 操作完成而被阻塞,则该进程被阻塞(非常简单的示例:Word 无响应)。多线程允许我们同时执行多个代码路径。 “同一时间”有点谎言,因为在一个核心中一次实际上只能执行一个线程,但 CPU 会为每个线程分配一小部分时间,所以看起来好像所有这些线程都在同一时间执行同时。 Word 中的拼写检查器就是一个很好的例子。
如果您有多个内核,唯一的区别是在 N 核 CPU 中,您可以同时执行 N 个线程。为了简化很多,线程属于哪个进程并不重要。更简单地说,您预计性能会提高 N 倍。 :-D
【讨论】:
在我所知道的每一个现代操作系统中,所有东西都在一个线程中运行,该线程在一个进程中运行。 操作系统可以跟踪多个进程,每个进程可以托管任意数量的线程。所以所有代码都在一个线程内执行和在一个进程内(因为线程在一个进程中运行)。
两者的主要区别在于每个进程都有自己的虚拟地址空间。单独的进程无法访问彼此的数据、文件句柄或其他任何东西,并且基本上不知道其他进程的存在。
另一方面,进程中的每个线程共享相同的地址空间,因此所有线程都可以检查或修改彼此的数据,调用相同的函数以及其他一切。
通常(但不总是)一个程序由一个进程和多个线程组成。
【讨论】:
一个进程由一个或多个线程组成(大多数环境默认为一个)。不过,进程可以创建额外的线程。
就像前面的答案所说,每个进程都有自己的内存空间(每个进程都可以有一个指向 0x12345 的指针,每个进程的内存位置具有不同的值),而进程的所有线程实际上都指向确切的相同的内存位置,因为它们都在相同的内存空间中。
当调用一个函数时,它几乎总是在调用者运行的同一个线程上被调用。在 Objective-C 中,有例外(performSelectorOnMainThread),其他语言也可能有,但只有在特殊情况下才需要这种功能。
【讨论】:
从用户的角度来看,主要区别在于线程彼此共享内存,而进程不共享。这意味着您可以轻松地在线程之间共享数据,而进程需要某种操作系统调用才能做到这一点。
有人称这是线程的好处,但在多个控制线程之间共享数据充满了危险,因此可以说进程导致代码更可靠。
还有很多其他功能,特别是如果您是操作系统人员。
【讨论】: