Rhel

任務狀態 PA 指的是什麼?

  • April 24, 2020

我正在研究 RHEL 7.4 的故障轉儲。它將某些任務狀態顯示為 PA。對於命令 -crash> ps | grep sample

- 31718  31717   3  ffff8806873a6eb0  **PA**   0.0   42260   8040  sample  
- 32027  32025   3  ffff880462cf1fa0  **PA**   0.0   42260   8036  sample
- 32148  32146   5  ffff88081b75eeb0  **PA**   0.0   42260   8036  sample
- 32620  32618   0  ffff8802b1469fa0  **PA**   0.0   42260   8036  sample

沒有任何幫助頁面討論此任務狀態的詳細資訊。

  • 誰能告訴我 PA 指的是什麼任務狀態?
  • 有關崩潰實用程序中提到的所有程序狀態的任何連結或詳細資訊?
crash> help ps |grep PA

- the task state (RU, IN, UN, ZO, ST, TR, DE, SW, WA, PA).**

狀態指停放狀態。此狀態僅對 3.9 到 3.13 之間的核心有效。根據手冊頁:

state  %c
                   One of the following characters, indicating process
                   state:

                   R  Running

                   S  Sleeping in an interruptible wait

                   D  Waiting in uninterruptible disk sleep

                   Z  Zombie

                   T  Stopped (on a signal) or (before Linux 2.6.33)
                      trace stopped

                   t  Tracing stop (Linux 2.6.33 onward)

                   W  Paging (only before Linux 2.6.0)

                   X  Dead (from Linux 2.6.0 onward)

                   x  Dead (Linux 2.6.33 to 3.13 only)

                   K  Wakekill (Linux 2.6.33 to 3.13 only)

                   W  Waking (Linux 2.6.33 to 3.13 only)

                   P  Parked (Linux 3.9 to 3.13 only)

這種狀態也稱為不間斷睡眠。有關更多詳細資訊,請參閱連結。

http://people.redhat.com/anderson/crash_sources/task.c

char *
task_state_string(ulong task, char *buf, int verbose)
{
long state;
int exclusive;
int valid, set;

if (_RUNNING_ == TASK_STATE_UNINITIALIZED) 
   initialize_task_state();

if (verbose)
   return task_state_string_verbose(task, buf);

if (buf)
   sprintf(buf, verbose ? "(unknown)" : "??");

state = task_state(task);

set = valid = exclusive = 0;
if (valid_task_state(_EXCLUSIVE_)) {
   exclusive = state & _EXCLUSIVE_;
   state &= ~(_EXCLUSIVE_);
}

if (state == _RUNNING_) {
   sprintf(buf, "RU"); 
   valid++;
}

if (state & _INTERRUPTIBLE_) { 
   sprintf(buf, "IN"); 
   valid++; 
   set++;
}

if (state & _UNINTERRUPTIBLE_) {
   if (valid_task_state(_NOLOAD_) &&
       (state & _NOLOAD_))
       sprintf(buf, "ID");
   else
       sprintf(buf, "UN");
   valid++; 
   set++;
}

if (state & _ZOMBIE_) {
   sprintf(buf, "ZO"); 
   valid++; 
   set++;
}

if (state & _STOPPED_) {
   sprintf(buf, "ST"); 
   valid++; 
   set++;
}

if (valid_task_state(_TRACING_STOPPED_) &&
   (state & _TRACING_STOPPED_)) {
   sprintf(buf, "TR"); 
   valid++; 
   set++;
}

if (state == _SWAPPING_) {
   sprintf(buf, "SW"); 
   valid++; 
   set++;
}

if ((state & _DEAD_) && !set) {
   sprintf(buf, "DE"); 
   valid++; 
   set++;
}

if (state == _PARKED_) {
   sprintf(buf, "PA"); 
   valid++;
}

if (state == _WAKING_) {
   sprintf(buf, "WA"); 
   valid++;
}

if (state == _NEW_) {
   sprintf(buf, "NE");
   valid++;
}

if (valid && exclusive) 
   strcat(buf, "EX");

return buf;

}

引用自:https://unix.stackexchange.com/questions/521340