Java 进程和线程之间的区别

Java 进程和线程之间的区别,java,multithreading,process,Java,Multithreading,Process,今天面试的时候有人问我一个问题。首先,他们询问如何提供同步 在线程之间。然后他们问如何在进程之间提供同步,因为我告诉他们,每个进程内部的变量不能与其他进程共享,所以他们要求我解释两个进程如何相互通信以及如何提供同步 它们之间,以及在何处声明共享变量?现在面试结束了,但我想知道答案,有人能解释一下吗?谢谢。同步只适用于线程,它不适用于Java中的进程。它们没有跨进程工作的实用工具,因为这些进程不共享任何需要同步的状态。一个进程中的变量与另一个进程中的变量的数据不同从系统的角度来看,线程由其“状态”

今天面试的时候有人问我一个问题。首先,他们询问如何提供同步 在线程之间。然后他们问如何在进程之间提供同步,因为我告诉他们,每个进程内部的变量不能与其他进程共享,所以他们要求我解释两个进程如何相互通信以及如何提供同步
它们之间,以及在何处声明共享变量?现在面试结束了,但我想知道答案,有人能解释一下吗?谢谢。

同步只适用于线程,它不适用于Java中的进程。它们没有跨进程工作的实用工具,因为这些进程不共享任何需要同步的状态。一个进程中的变量与另一个进程中的变量的数据不同

从系统的角度来看,线程由其“状态”和“指令指针”定义

指令指针(eip)包含要执行的下一条指令的地址

线程“状态”可以是:由该线程管理的寄存器(eax、ebx等)、信号、打开的文件、代码
、堆栈
、数据(变量、数组等)以及堆

进程是一组共享其“状态”一部分的线程:它可能是代码数据。 希望我能回答你的问题;)

编辑: 进程可以通过IPCs(进程间通信)进行通信。共有3种机制:共享内存消息队列。进程之间的同步可以通过信号量进行


线程同步可以通过互斥体来实现(pthread\u mutex\u lock、pthread\u mutex\u unlock等)

要在两个进程之间通信,我想您可以使用ServerSocket和Socket来管理进程同步。您将绑定到特定端口(获取锁),如果进程已经绑定,则可以连接到套接字(块),并等待服务器套接字关闭

private static int KNOWN_PORT = 11000;//arbitrary valid port
private ServerSocket socket;
public void acquireProcessLock(){
   socket = new ServetSocket(KNOWN_PORT);
   INetAddress localhostInetAddres = ...
   try{
      socket.bind(localhostInetAddres );
   }catch(IOException failed){
      try{
       Socket socket = new Socket(localhostInetAddres ,KNOWN_PORT);
       socket.getInputStream().read();//block
      }catch(IOException ex){ acquireProcessLock(); } //other process invoked releaseProcessLock()
   }
}
public void releaseProcessLock(){
  socket.close();
}
不确定这是否是最好的方法,但我认为值得考虑。

我认为面试官可能没有使用正确的术语。一个进程在它自己的空间中运行,并且已经在单独的回答中提到,您必须使用特定于操作系统的机制在进程之间进行通信。这称为进程间通信的IPC

使用套接字是一种常见的做法,但效率可能非常低,具体取决于您的应用程序。但是如果使用纯Java,这可能是唯一的选择,因为套接字是普遍支持的

共享内存是另一种技术,但它是特定于操作系统的,需要特定于操作系统的调用。您必须为Java应用程序使用类似JNI的东西来访问共享内存服务。共享内存访问是不同步的,因此您可能必须使用信号量来同步多个进程之间的访问


类Unix系统提供多个IPC Mechansim,使用哪一个取决于应用程序的性质。共享内存可能是有限的资源,因此它可能不是最好的方法。谷歌搜索这个主题提供了大量有用的技术细节信息。

查看Terracotta的文档,了解如何解决这个问题(字节码操作、维护putfield/getfield级别Java语言规范的语义等)

我认为进程可以通过第三方进行通信:文件或数据库…

进程是虚拟内存空间、代码、数据和系统资源的集合。线程是要在进程内串行执行的代码。处理器执行线程,而不是进程,因此每个应用程序至少有一个进程,一个进程总是至少有一个执行线程,称为主线程。除主线程外,进程还可以有多个线程。在引入多线程执行之前,应用程序都被设计为在单个执行线程上运行


当一个线程开始执行时,它将继续执行,直到它被终止或被具有更高优先级的线程(通过用户操作或内核的线程调度程序)中断为止。每个线程可以运行单独的代码段,或者多个线程可以执行相同的代码段。执行同一代码块的线程保持独立的堆栈。进程中的每个线程共享该进程的全局变量和资源

最简单的答案是,进程意味着一个正在执行的程序,而程序只不过是函数的集合。 其中,线程是进程的一部分,因为所有线程都是函数。 换句话说,我们可以说一个进程可能有多个线程。 始终操作系统为进程分配内存,并且该内存分配给该进程的线程。操作系统不为线程分配内存。

进程:

  • 进程只不过是一个正在执行的程序
  • 每个进程都有自己的内存地址空间
  • 流程用于重量级任务,即基本上是应用程序的执行
  • 流程之间的通信成本很高
  • 从一个进程切换到另一个进程需要一些时间来保存和加载寄存器、内存映射等
  • 过程是操作系统方法
线程:

  • 线程是轻量级的子进程
  • 线程共享相同的地址空间
  • 线程之间的通信成本很低

注意:每个线程至少需要一个进程。

在一句话中,进程是