【问题标题】:Thread and Process线程和进程
【发布时间】:2010-09-25 13:44:46
【问题描述】:

线程的最佳定义是什么?什么是进程? 如果我调用一个函数,我怎么知道一个线程正在调用它或一个进程(或者我不理解它??!)。这是在多核系统(四核)中。

【问题讨论】:

标签: multithreading process


【解决方案1】:

来自http://wiki.answers.com/Q/What_is_the_difference_between_a_computer_process_and_thread

单个进程可以拥有多个线程,这些线程与运行在同一进程中的其他线程共享全局数据和地址空间,因此可以轻松地对同一数据集进行操作。进程不共享地址空间,如果要共享数据,必须使用不同的机制。

如果我们将运行文字处理程序视为一个进程,那么后台发生的自动保存和拼写检查功能就是该进程的不同线程,它们都在同一数据集(您的文档)上运行。

【讨论】:

    【解决方案2】:

    要补充的一点是多核处理器如何处理这个问题。将线程视为代码的顺序执行。

    CPU 中的一个核心一次只能执行一个线程。因此,如果该线程因为程序正在等待 I/O 操作完成而被阻塞,则该进程被阻塞(非常简单的示例:Word 无响应)。多线程允许我们同时执行多个代码路径。 “同一时间”有点谎言,因为在一个核心中一次实际上只能执行一个线程,但 CPU 会为每个线程分配一小部分时间,所以看起来好像所有这些线程都在同一时间执行同时。 Word 中的拼写检查器就是一个很好的例子。

    如果您有多个内核,唯一的区别是在 N 核 CPU 中,您可以同时执行 N 个线程。为了简化很多,线程属于哪个进程并不重要。更简单地说,您预计性能会提高 N 倍。 :-D

    【讨论】:

      【解决方案3】:

      在我所知道的每一个现代操作系统中,所有东西都在一个线程中运行,该线程在一个进程中运行。 操作系统可以跟踪多个进程,每个进程可以托管任意数量的线程。所以所有代码都在一个线程内执行在一个进程内(因为线程在一个进程中运行)。

      两者的主要区别在于每个进程都有自己的虚拟地址空间。单独的进程无法访问彼此的数据、文件句柄或其他任何东西,并且基本上不知道其他进程的存在。

      另一方面,进程中的每个线程共享相同的地址空间,因此所有线程都可以检查或修改彼此的数据,调用相同的函数以及其他一切。

      通常(但不总是)一个程序由一个进程和多个线程组成。

      【讨论】:

        【解决方案4】:

        一个进程由一个或多个线程组成(大多数环境默认为一个)。不过,进程可以创建额外的线程。

        就像前面的答案所说,每个进程都有自己的内存空间(每个进程都可以有一个指向 0x12345 的指针,每个进程的内存位置具有不同的值),而进程的所有线程实际上都指向确切的相同的内存位置,因为它们都在相同的内存空间中。

        当调用一个函数时,它几乎总是在调用者运行的同一个线程上被调用。在 Objective-C 中,有例外(performSelectorOnMainThread),其他语言也可能有,但只有在特殊情况下才需要这种功能。

        【讨论】:

        • 在我熟悉的所有语言(以及大多数开发人员使用的语言)中,所有函数都在调用函数的同一线程上执行。如果有问题的函数碰巧衍生出一个新线程或将方法调用发送到不同的线程,那与您所说的不同。
        【解决方案5】:

        从用户的角度来看,主要区别在于线程彼此共享内存,而进程不共享。这意味着您可以轻松地在线程之间共享数据,而进程需要某种操作系统调用才能做到这一点。

        有人称这是线程的好处,但在多个控制线程之间共享数据充满了危险,因此可以说进程导致代码更可靠。

        还有很多其他功能,特别是如果您是操作系统人员。

        【讨论】:

          猜你喜欢
          • 2010-09-15
          • 2011-01-21
          • 1970-01-01
          • 1970-01-01
          • 2017-02-02
          • 1970-01-01
          • 2016-08-10
          相关资源
          最近更新 更多