Android上本机线程的可能状态

Possible states for native threads on Android?

本文关键字:状态 线程 本机 Android      更新时间:2023-10-16

在Android设备上执行本地(C/c++)线程时,所有可能的线程状态是什么?它们与Java线程状态相同吗?它们是Linux线程吗?POSIX线程?

不是必需的,但是提供了可能导致线程进入每种状态的示例会给您加分。

编辑:按要求,这是动机:

我正在设计一个采样分析器的接口,在Android上使用本地C/c++代码。分析器报告将显示线程随时间的状态。我需要知道所有的状态是什么,以便a)知道我需要在视觉上区分多少种不同的状态,b)设计一种配色方案,在视觉上区分和分组理想状态和不理想状态。

我被告知Android上的本地线程只是轻量级进程。这与我对Linux的总体发现一致。引用本wiki页面:

Linux机器上的进程(包括线程)可以处于以下任何一种状态:

  • TASK_RUNNING -进程正在CPU上执行或等待执行。
  • TASK_INTERRUPTIBLE -进程被挂起(睡眠),直到某个条件为真。引发硬件中断,释放进程正在等待的系统资源,或者传递信号都是可能唤醒进程的条件(将其状态放回TASK_RUNNING)。通常阻塞IO调用(磁盘/网络)将导致任务被标记为TASK_INTERRUPTIBLE。一旦它等待的数据准备好被读取,设备就会引发一个中断,并且中断处理程序将任务的状态更改为TASK_INTERRUPTIBLE。同时,处于空闲模式(即不执行任何任务)的进程也应该处于此状态。
  • TASK_UNINTERRUPTIBLE -与TASK_INTERRUPTIBLE相似,除了向休眠进程发送信号使其状态保持不变。这种进程状态很少使用。然而,在某些特定条件下,进程必须等待直到给定事件发生而不被中断,这是有价值的。理想情况下,不会有太多任务处于这种状态。
    • 例如,当一个进程打开一个设备文件,相应的设备驱动程序开始探测相应的硬件设备时,可以使用这个状态。设备驱动程序必须在探测完成之前被中断,否则硬件设备可能处于不可预测的状态。
    • 原子写操作可能需要将任务标记为UNINTERRUPTIBLE
    • NFS访问有时会导致访问进程被标记为UNINTERRUPTIBLE因此,可以在几分之一秒内标记从磁盘读取/写入磁盘
    • 页面错误后的I/O标记进程UNINTERRUPTIBLE
    • 由于页面错误而访问的同一磁盘的I/O可能导致标记为UNINTERRUPTIBLE
    • 的进程
    • 程序员可以将任务标记为UNINTERRUPTIBLE而不是INTERRUPTIBLE
  • TASK_STOPPED -进程已停止执行;进程在接收到SIGSTOPSIGTSTPSIGTTINSIGTTOU信号后进入该状态。
  • TASK_TRACED -进程执行已被调试器停止
  • EXIT_ZOMBIE -进程执行终止,但父进程尚未发出wait4()waitpid()系统调用。操作系统不会清除僵尸进程,直到父进程发出类似wait()的调用。
  • EXIT_DEAD -最终状态:由于父进程刚刚发出wait4()waitpid()系统调用,该进程正在被系统删除。将其状态从EXIT_ZOMBIE更改为EXIT_DEAD可以避免由于其他执行线程在同一进程上执行wait()类调用而导致的竞争条件。

Edit:然而Dalvik VM Debug Monitor提供了不同的状态。从它的文档:

"线程state"必须是:

1 - running (正在执行或准备执行)
2 - sleeping (thread . sleep ())
3 - monitor (被监视器锁阻塞)
4 - waiting (in Object.wait())
5 - initializing
6 - starting
7 - native (执行本机代码)
8 - vmwait (等待虚拟机资源)

"suspended"[数据结构中的单独标志]如果线程正在运行,则为0,否则为1。

如果你设计一个系统应用程序,它必须以比普通应用程序更高级的方式与线程一起工作,我首先会检查Android上有哪些可用的API来访问线程。

答案是pthread = POSIX线程,带有pthread.h头文件,在Bionic C库中实现。这样你就有了一个起点,知道你能达到什么目标。

另一件事是Android没有实现完整的pthread接口,只有Android运行所需的子集。更多关于thread + Bionic的信息请点击这里,以及它们如何与Java和VM交互的描述请点击这里。另外,我觉得线程实际上是一个进程,因为我的代码使用setpriority(PRIO_PROCESS, gettid(), pr);设置新线程的优先级-我不记得我从哪里得到这个信息,但这是有效的。

我假设线程可能处于运行,完成或阻塞(例如等待互斥)状态,但这是我的一点有限的知识,因为我从不需要其他线程状态。

现在的问题是,如果你的应用程序实际上可以检索这些状态使用NDK中可用的API,如果有更多的状态,如果你的用户真的有兴趣知道。

无论如何,您可以从显示线程可能不完整的状态开始,如果您的用户真的关心,您可以从用户的反馈和请求中了解其他状态。

Google:

Thread.State  BLOCKED       The thread is blocked and waiting for a lock. 
Thread.State  NEW           The thread has been created, but has never been started. 
Thread.State  RUNNABLE      The thread may be run. 
Thread.State  TERMINATED    The thread has been terminated. 
Thread.State  TIMED_WAITING The thread is waiting for a specified amount of time. 
Thread.State  WAITING       The thread is waiting. 

这些状态没有很好地解释-例如,我看不出BLOCKED和WAITING之间的区别。

有趣的是,没有"RUNNING"状态-这些设备做过任何事情吗?