线程崩了,进程会有影响吗?

本文探讨了C/C++和Java中线程崩溃对进程的影响,强调了操作系统通过信号机制来管理进程崩溃。C/C++中线程非法访问内存可能导致进程崩溃,而Java因虚拟地址空间隔离和JVM的信号处理避免了进程崩溃。
摘要由CSDN通过智能技术生成
  • C/C++ 语言里,线程崩溃后,进程也会崩溃

  • Java 语言里却不会

  • 线程崩溃,进程一定崩溃吗

    • 一般来说如果线程是因为非法访问内存引起的崩溃,那么进程肯定会崩溃

    • 为什么系统要让进程崩溃呢

      • 主要是因为在进程中,各个线程的地址空间是共享的,既然是共享,那么某个线程对地址的非法访问就会导致内存的不确定性,进而可能会影响到其他线程,这种操作是危险的,操作系统会认为这很可能导致一系列严重的后果,于是干脆让整个进程崩溃

  • 进程是如何崩溃的-信号机制简介

    • 那么线程崩溃后,进程是如何崩溃的呢,这背后的机制到底是怎样的,答案是信号

    • 发 kill 信号必须具有一定的权限,否则任意进程都可以通过发信号来终止其他进程,那显然是不合理的,实际上 kill 执行的是系统调用,将控制权转移给了内核(操作系统),由内核来给指定的进程发送信号

    • 发个信号进程怎么就崩溃了呢

      • CPU 执行正常的进程指令

      • 调用 kill 系统调用向进程发送信号

      • 进程收到操作系统发的信号,CPU 暂停当前程序运行,并将控制权转交给操作系统

      • 调用 kill 系统调用向进程发送信号(假设为 11,即 SIGSEGV,一般非法访问内存报的都是这个错误)

      • 操作系统根据情况执行相应的信号处理程序(函数),一般执行完信号处理程序逻辑后会让进程退出

      • 注意上面的第五步,如果进程没有注册自己的信号处理函数,那么操作系统会执行默认的信号处理程序(一般最后会让进程退出),但如果注册了,则会执行自己的信号处理函数,这样的话就给了进程一个垂死挣扎的机会,它收到 kill 信号后,可以调用 exit() 来退出,但也可以使用 sigsetjmp,siglongjmp 这两个函数来恢复进程的执行

    • 如何让正在运行的 Java 工程的优雅停机?

      • JVM 自己定义了信号处理函数,这样当发送 kill pid 命令(默认会传 15 也就是 SIGTERM)后,JVM 就可以在信号处理函数中执行一些资源清理之后再调用 exit 退出。

    • 为什么线程崩溃不会导致JVM进程崩溃

      • 现代操作系统为了保护进程之间不受影响,所以使用了虚拟地址空间来隔离进程,进程的寻址都是针对虚拟地址,每个进程的虚拟空间都是一样的,而线程会共用进程的地址空间。

      • stackoverflow 是怎么发生的呢?

        • 进程每调用一个函数,都会分配一个栈桢,然后在栈桢里会分配函数里定义的各种局部变量。

        • 例子

          • 假设现在调用了一个无限递归的函数,那就会持续分配栈帧,但 stack 的大小是有限的(Linux 中默认为 8 M,可以通过 ulimit -a 查看),如果无限递归很快栈就会分配完了,此时再调用函数试图分配超出栈的大小内存,就会发生段错误,也就是 stackoverflowError。

      • 既然 StackoverflowError 或者 NPE 都属于非法访问内存, JVM 为什么不会崩溃呢?

        • 因为 JVM 自定义了自己的信号处理函数,拦截了 SIGSEGV 信号,针对这两者不让它们崩溃。

  • 为什么发生了 StackoverflowError 和 NPE 这两个非法访问内存的错误,JVM 却没有崩溃。

    • 原因其实就是虚拟机内部定义了信号处理函数,而在信号处理函数中对这两者做了额外的处理以让 JVM 不崩溃,另一方面也可以看出如果 JVM 不对信号做额外的处理,最后会自己退出并产生 crash 文件 hs_err_pid_xxx.log(可以通过 -XX:ErrorFile=/var/log/hs_err.log 这样的方式指定),这个文件记录了虚拟机崩溃的重要原因。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值