linux 的线程和信号
基于 NPTL 的线程库,多线程应用中的每个线程有自己独特的线程 ID,并共享同一个进程ID。应用程序可以通过调用 kill(getpid(),signo)
将信号发送到进程,如果进程中当前正在执行的线程没有阻碍此信号,则会被中断,线号处理函数会在此线程的上下文背景中执行。应用程序也可以通过调用 pthread_kill(pthread_t thread, int sig)
将信号发送给指定的线程,则线号处理函数会在此指定线程的上下文背景中执行。
java里信号掩码的集合
unblocked_sigs
|
SIGILL
SIGSEGV
SIGBUS
SIGFPE
SR_signum
SHUTDOWN1_SIGNAL(SIGHUP)
SHUTDOWN2_SIGNAL(SIGINT)
SHUTDOWN3_SIGNAL(SIGTERM)
|
vm_sigs
|
BREAK_SIGNAL (SIGQUIT)
|
allowdebug_blocked_sigs
|
SHUTDOWN1_SIGNAL(SIGHUP)
SHUTDOWN2_SIGNAL(SIGINT)
SHUTDOWN3_SIGNAL(SIGTERM)
|
SIG_BLOCK
|
NULL
|
在多线程的应用中,每个线程可以通过调用pthread_signmask()设置本线程的信号掩码,可以设置阻塞的信号,但信号SIGKILL/SIGSTOP是不能被设置成阻塞的。
在java中,每个线程都设置了在表格中的信号掩码,特别提到的是vm_sigs,这是只有一个quit 的信号结合,当没有设置启动参数 -Xrs (=ReduceSignalUsage)的时候,其他的线程设置成阻塞的,除了vm thread。
Java里信号处理的函数
在linux里可以设置进程级别的信号的处理函数,在内核中信号值及进程针对该信号的处理函数建立了映射关系,主要有2个函数来设置信号处理函数:signal(),sigaction()。函数具体可以参考http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
在java 里,下面的2个函数是用于设置信号处理的函数
void os::Linux::set_signal_handler(int sig, bool set_installed)
void* os:signal(int signal_number, void* handler)
- 函数set_signal_handler设置了信号的处理函数signalHandler
- 函数os:signal是允许外部直接设置信号处理函数
- 以下程序片段可以看到当每个java 线程起来的时候,对信号SIGSEGV ,SIGPIPE,SIGBUS,SIGILL,SIGFPE,SIGXGSZ,使用了专门的处理函数signalHandler在signalhandler 调用了JVM_handler_linux_signal 而该函数在不同的架构下是不一样的,x86架构下的定义在os_linux_x86.cpp中。
- 对信号SIGQUIT源码中并没有看到处理函数,实际上当java虚拟机启动Signal Dispatcher 线程的时候,程序里调用了os::signal(SIGNBREAK,os::user_handler()) (os.cpp os::signal_init())(该线程在打开-Xrs的时候是不启动的)
下面的源码是java里面定义的os:user_handler
在函数的末尾调用了os:signal_notify,从而和os::signal_wait 对应起来,关于signal dispatcher 的具体实现可以参考笔者的另一篇博客(http://blog.csdn.net/raintungli/article/details/7034005)。
signal dispatcher 线程通过sem_wait会在等待,当进程接到信号SIGQUIT的时候,只有vm thread会被中断(见上面分析),而进入UserHandler 函数,通过调用 os::signal_notify 去通告signal dispatcher 线程,让 signal dispatch 线程去处理信号。
在信号设计里,因为信号中断是在内核态调用的,内核调用了线程注入了自己的信号函数,一般只允许在该函数里处理简单的事物,所以在java里面专门设计了处理信号后续的线程(signal dispatcher),接受到信号的线程通过信号函数notify到处理信号的线程(signal dispatcher ),最后由该线程做后续的事情。比如线程dump
关于信号中断的内核态和用户态的如何嵌入,可以参考(Linux内核信号处理机制介绍)
分享到:
相关推荐
"Linux系统聊天室":这意味着聊天室不仅在Linux环境下运行,还可能利用了Linux特有的特性,如信号、套接字选项或者特定的系统调用来优化性能或实现特定功能。 【压缩包子文件的文件名称列表】:CH08 由于没有具体...
在Linux操作系统环境下,RS485通信的实现是通过编程来控制硬件接口,以便设备之间能够进行双向、长距离的数据传输。下面将详细讲解基于Linux的RS485通信原理、实现步骤以及相关知识点。 1. **RS485通信标准** ...
Java应用程序在Linux平台上的性能优化是一个复杂而重要的主题,尤其是在高并发和大规模数据处理的场景下。Java线程堆分析是定位和解决性能问题的有效工具,它提供了关于应用程序线程状态和执行路径的详细信息。 ...
总的来说,Java文本转语音服务是一个涉及多方面技术的领域,包括自然语言处理、音频信号处理和人工智能。开发者需要对这些技术有一定的理解,并利用合适的库和工具来创建满足需求的TTS应用。同时,不断地测试和优化...
同时,Linux下的进程管理,如使用`ps`查看进程,`kill`发送信号终止进程,以及`nohup`和`&`后台运行命令,对于运行Java服务是必不可少的。 Linux还提供了强大的网络工具,如`netstat`用于查看网络连接状态,`...
Linux操作系统中,停止运行中的Java服务可以通过多种方式实现,其中包括使用kill命令来发送信号给进程。Java服务经常被用作Web服务器或者应用服务,而Linux环境下,进程管理对于运维人员来说是一项基本技能。本文将...
在"rockchip-wiegand.c"文件中,开发者已经实现了针对韦根协议的Linux驱动程序,这通常是基于字符设备驱动模型,通过中断处理或轮询方式来读取和发送韦根信号。 "rockchip-wiegand.ko"是一个内核模块,它是驱动程序...
在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程共享数据或交换信息的一种机制。本文将深入探讨如何利用消息队列这一IPC机制实现进程间的双向通信。消息队列允许进程异步地发送和接收...
在Java编程语言的支持下,这类工具能够跨平台运行,适用于Windows、Mac OS X以及Linux等多种操作系统。Java语音聊天工具通常涉及到多个关键的技术领域,包括网络编程、音频处理、多线程、数据传输协议等。 首先,...
【Java实现Linux下双守护进程】的目的是为了提高服务器程序的稳定性和自动化管理。在Linux系统中,守护进程(Daemon)常驻后台运行,用于监控并管理其他服务,确保其正常运行。Java环境下,由于Java程序运行在JVM上...
5. **信号处理**:在Linux中,可以发送不同的信号(如SIGINT, SIGTERM, SIGKILL)来控制进程的行为。Windows下,使用`/F`参数强制结束进程。 6. **异常处理**:执行命令时可能会出现各种异常,如命令找不到、权限...
在Linux操作系统中,Shell编程是一种强大的工具,它允许用户通过编写脚本来自动化日常任务,提高工作效率。Shell脚本是用Shell解释器(如bash、sh等)执行的文本文件,通常用于系统管理、文件操作、程序调用等多种...
Linux下使用GTK开发的俄罗斯方块游戏是一款利用GTK图形库在GNOME桌面环境中构建的经典娱乐应用。GTK(GIMP Toolkit)是用于创建图形用户界面的一个强大的开源工具包,广泛应用于Linux和其他类UNIX系统中。本项目是...
《JAVA_Linux面试专题23道》的PDF文件包含了多个关于Java和Linux面试的重要知识点。以下是其中几个关键点的详细解释: 1. **Linux内核锁**: - **自旋锁**:自旋锁是一种用于保护临界区的同步机制,它不允许持有锁...
在Linux操作系统中,调用扫描仪进行图像扫描通常涉及到SANE(Scanner Access Now Easy)协议。SANE是一个开放源码的API,它提供了一个统一的接口来访问各种扫描仪设备,无论它们是本地连接的还是网络上的。这篇文档...
在IT行业中,管理和控制服务的自动化是至关重要的,特别是在服务器维护和微服务架构中。本文将详细介绍如何使用Shell脚本来启动和停止Java服务,适用于包括SpringBoot在内的各种Java应用程序。 首先,让我们理解...
在Java中,使用HttpURLConnection或Apache HttpClient可以实现网络请求,再通过图像处理库,如Java2D或JavaFX,将收到的瓦片拼接成完整的地图。 此外,为了提升用户体验,电子地图程序可能需要集成定位功能。Java...
在Linux系统中,使用C#进行音量控制和监听音量变化可能会涉及到多个技术层面,包括跨平台.NET框架(如Mono或.NET Core)、Linux音频框架(如ALSA或PulseAudio)以及进程间通信(IPC)来接收音量变化的通知。...
在 Linux 中,守护进程可以使用 C 语言编程来实现,通过 fork 和 setsid 函数来创建守护进程。 fork 函数创建一个新进程,而 setsid 函数将进程从其父进程中分离出来,使其成为一个独立的会话期。同时,守护进程也...
在IT行业中,掌握C语言、Linux系统程序设计、Java编程以及Android开发是至关重要的技能,这些技术广泛应用于软件开发、操作系统、服务器管理、移动应用等多个领域。以下是对这些知识点的详细解析: 1. C语言:作为...