Emacs 窗口、框架、服务器和客户端:线程还是进程?

Emacs 窗口、框架、服务器和客户端:线程还是进程?

http://www.gnu.org/software/emacs/tour/

Emacs服务器

有些人喜欢只保留一个实例Emacs 打开并编辑其中的所有文件。这样做有几个优点:

您可以在同一缓冲区中杀死/拉出缓冲区之间的文本实例Emacs 的。 Emacs 会记住参数历史记录(您使用过的命令、打开的文件、搜索过的术语等),但仅限于每个参数历史记录实例。如果您有很多自定义项,请从新开始实例 Emacs 的速度很慢。唉,当您在 shell 中键入 emacs 来编辑文件时(或者当外部程序调用 $EDITOR 时),一个新的实例启动 Emacs。您可以使用 emacsclient 来避免这种情况,它会打开一个新的框架连接到现有的实例Emacs 的:

在您现有的实例在 Emacs 中,键入 Mx server-start。或者将 (server-start) 添加到您的 .emacs 文件中,使其在启动时自动执行此操作。要编辑文件,请在提示符下键入 emacsclient -t FILENAME。如果您使用自动调用 $EDITOR 的程序,您还可以将 $EDITOR 更改为 emacsclient -t。 (emacsclient -t 打开一个新的框架在终端上;或者,emacsclient -c 打开一个新的 X 框架.) 完成编辑后,输入 Cx Cc,这将关闭 框架

  1. 通过 Emacs 的“实例”,它与 Emacs 进程还是线程相同?
  2. 同一 Emacs 窗口下的不同缓冲区(或窗口、帧)是否是 emacs 进程的不同线程? (我猜是的)那么他们通过共享内存进行通信吗?
  3. Emacs 服务器及其客户端是不同的进程,还是同一 emacs 进程的不同线程? (我想不是,但引用同样的说法,客户端是服务器的框架,我猜框架只是同一进程的一个线程)
  4. 通常,在应用程序的服务器-客户端模型中,服务器和客户端是否作为不同的进程或线程运行?服务器和客户端之间的通信是通过共享内存还是进程间通信来完成的?

答案1

  1. 在本文中,“Emacs 实例”指的是单个进程。

  2. 不,Emacs 不会为每个打开的缓冲区保留一个线程。我当前的会话有 129 个打开的缓冲区(大约 100 个从文件打开,其他是某些从属进程的输出缓冲区 - python、ruby、elixir 解释器、wanderlust 文件夹和摘要视图、flycheck-mode语法检查器等),但只有 3 个活动线程。

  3. 主要的 Emacs 进程是服务器,每个进程都emacsclient在自己的进程中运行,通过 UNIX 域套接字与服务器进行通信。当服务器收到来自客户端的连接请求时,它会在服务器框架的新窗口中的新缓冲区中打开请求的文件。emacsclient唯一的功能是将请求的文件发送到服务器,并在完成文件缓冲区的编辑后等待服务器返回。

  4. 通常,客户端和服务器作为单独的进程运行 - 不能保证客户端和服务器位于同一网络上,更不用说同一台机器了。一些服务器启动一个新线程来处理每个传入的客户端连接(例如,可以构建 Apache 来执行此操作),但客户端是一个单独的进程,可能位于地球另一端的另一台计算机上。并注意共享内存进程间通信的一种形式,例如 UNIX 域套接字。

相关内容