当前位置: 首页 > 图灵资讯 > 技术篇> 线程中的守护者—守护线程

线程中的守护者—守护线程

来源:图灵教育
时间:2023-04-09 09:39:32

守护线程(即daemon thread),它是一个服务线程,是一个特殊的后台操作过程,用于执行特定的系统任务。许多保护过程在系统指导下启动,并运行直到系统关闭。其他的只在需要时启动,并在任务完成后自动结束。准确地说,它是为其他线程服务的

防护过程是一个在后台运行而不受任何终端控制的过程。Unix操作系统有许多典型的保护过程(其数量是根据需要或20—50不等),它们在后台运行,执行不同的管理任务。用户将保护过程独立于所有终端,因为当保护过程从一个终端开始时,其他用户可以使用同一个终端。比如用户从一个终端开始后退出保护过程,然后另一个人登录到这个终端。在使用终端的过程中,用户不希望后者收到任何关于保护过程的错误信息。同样,由终端输入的任何信号(如中断信号)都不应影响以前在终端启动的任何保护过程的运行。虽然服务器后台很容易操作(只要shell命令执行)&最后,用户也应该做一些工作,这样程序本身就可以在不依赖任何终端的情况下自动进入后台。

保护过程没有控制终端,所以在某些情况下,管理员处理的一般报告信息和紧急信息都需要以某种方式输出。Syslog 函数是输出这些信息的标准方法,它发送信息 syslogd 守护进程。

只要当前在JVM的例子中,仍然有一个非保护线程没有结束,所有的保护线程都在工作;保护线程像保护者一样保护线程的安全。只有当最后一个非保护线程结束时,保护线程才会与JVM一起结束工作。Daemon的功能是为其他线程的运行提供方便的服务。保护线程最典型的应用是 GC (垃圾回收器),是一个非常称职的守护者。

以下是创建保护线程的步骤:

(1)创建子过程,终止父过程

由于保护过程脱离控制终端,首先创建子过程,终止父过程,使程序在shell终端产生了运行完成的错觉。之后,所有的工作都在子过程中完成,用户可以在shell终端中执行其他命令,使程序以僵尸过程的形式运行,并在形式上与控制终端分离。

(2)在子过程中创建新会话

这一步是创建保护过程中最重要的一步,在这里使用系统函数setsid。

setsid函数用于创建一个新的会话,并担任会话组的组长。调用setsid丁三个功能:让过程摆脱原会话的控制,让过程摆脱原过程组的控制,让过程摆脱原始控制终端的控制。

在调用fork函数时,子过程完全复制了父过程的会话期(session,是一个或多个进程组的集合)、过程组、控制终端等。,虽然父亲的过程已经退出,但原来的会话期、过程组、控制终端等并没有改变。因此,这并不是真正意义上的独立。setsid函数可以使过程完全独立,从而脱离所有其他过程的控制。

(3)改变工作目录

使用fork创建的子过程也继承了父亲过程的当前工作目录。由于当前目录所在的文件系统在运行过程中无法卸载,因此将当前工作目录改为其他路径,如“/”或“/tmp”等等。chdir是改变工作目录的常见函数。

(4)重置文件创建掩码

文件创建掩码是指屏蔽文件创建时的相应位置。因为使用fork函数的新子过程继承了父亲过程的文件创建代码,给子过程中使用文件带来了很多麻烦。因此,将文件创建代码设置为0可以大大提高保护过程的灵活性。设置文件创建代码的函数是umask,通常使用umask(0)。

(5)关闭文件的描述符

fork的新子过程将从父亲过程中继承一些已打开的文件。这些打开的文件可能永远不会被读写,但它们消耗相同的系统资源,可能导致文件系统无法卸载。

守护线程的运行方式有两种:

1.独立运行的保护过程

独立运行的守护过程由独立运行的守护过程组成 init 脚本负责管理,所有独立操作的脚本都在/etc/rc.d/init.d/目录下。系统服务是独立运行的保护过程,包括 syslogd 和 cron 等。服务器监控器在特征端口等待客户端的连接。如果客户端有连接请求,则在保护过程中创建子服务器响应连接,主服务器继续监控。保持多个子服务器池等待下一个客户端的请求。

2.由 xinetd 管理的守护过程

从保护过程的概念可以看出,系统运行的每一项服务都必须运行保护过程来监控某个端口连接,这通常意味着资源的浪费。为了解决这个问题,介绍了Linux“网络守护过程服务程序服务程序”的概念。CentOS 6.4使用的网络保护过程是xinted(eXtendedInterNET services daemon)。

xinetd可以同时监控多个指定端口。在接受用户请求时,它可以根据用户请求的不同端口启动不同的网络服务流程来处理这些用户请求。xinetd可以被视为管理启动服务的管理服务器。它决定将客户请求交给程序,然后启动相应的保护程序。

守护线程是当之无愧的守护者。只有当最后一个非守护线程结束时,守护线程才会停止工作。事实上,有很多这样的守护者在守护我们的生活。当我们都停止工作时,他们开始守护这座城市,让我们的生活更美好。我们正在掌握守护线程的知识java多线程中学的学习也会百尺竿头,更进一步!