Threads stuck in kserel state

Julian Elischer julian at elischer.org
Tue Jun 24 07:37:51 UTC 2008


Saradhi Kothapalli wrote:
> Hi
> 
> I am running FreeBSD 5.4 on my machine. When i run mpd on it, i see it stuck
> in kserel state.
> I have written a sample thread program to check whether its an mpd problem
> or not.
> 
> Observations on the Sample test program:
> 
> I have created only one thread from the process, but the top output shows
> total 3 entries.

yes

The thread you started in sleeping in ttyin.
the thread library greated a background thread to handle signal 
delivery (ksesig).
When the main thread did ttyin, it blocked, so a third thread was 
created to make sure that if any other work had to be done there was a 
thread to do it. that third thread is waiting for more work to appear,
and in kserel (kse-release).

> Even when the thread has finished i see 2 entries that to one in kserel and
> other in ksesig state.
> 
> Is the main process stuck in "kserel" state or is it an expected behavior?
> Is it because of KSE the other thread is shown in top output? Is the state
> "ksesig" signifies that it is waiting for an event to occur?
> 
> 
> Thanks in advance for the help.
> 
> Regards
> Saradhi
> 
> 
> The Sample Test program:
> 
> #include <stdio.h>
> #include <pthread.h>
> #include <pdel/structs/structs.h>
> #include <pdel/structs/type/array.h>
> #include <pdel/util/typed_mem.h>
> #include <pdel/util/pevent.h>
> #include <pdel/util/paction.h>
> #include <pdel/util/ghash.h>
> #include <unistd.h>
> 
> pthread_mutex_t mutex;
> 
> static void
> startFn(void * arg)
> {
>     printf("\n *** Thread Start Function *** \n");
>     getchar();
>     return;
> }
> 
> static void
> endFn(void * arg, int done)
> {
>     printf("\n *** Thread End Function *** \n");
>     getchar();
>     return;
> }
> 
> static void
> thrStart()
> {
>     struct paction * thr;
>     uint32_t temp;
> 
>     if ( paction_start(&thr, &mutex, startFn, endFn, &temp) == -1 )
>     {
>         printf("\n *** Failed to start thread *** \n ");
>         getchar();
>     }
>     return ;
> }
> 
> int main()
> {
> 
>     int ret = pthread_mutex_init(&mutex, NULL);
>     if ( ret != 0 )
>     {
>         printf("\n *** Mutex initialization Failed *** \n");
>         return -1;
>     }
> 
>     printf("\n *** calling thread start *** \n ");
>     getchar();
> 
>     thrStart();
> 
>     for ( ; ; )
>     {
>         sleep(1);
>     }
>     return 0;
> }
> 
> THE TOP OUTPUT WITH THREAD DISPLAY TURNED ON:
> 
> When the thread is in existence (both during start and end function):
> -----------------------------------------------------------------------------------------------------
> 
> 18387 root      20    0  3384K  1760K ksesig   0:00  0.00%  0.00% thrd
> 18387 root      20    0  3384K  1760K kserel   0:00  0.00%  0.00% thrd
> 18387 root       5    0  3384K  1760K  ttyin    0:00  0.00%  0.00% thrd
> 
> After the thread execution is completed (the for loop):
> ---------------------------------------------------------
> 18387 root      20    0  3384K  1752K ksesig   0:00  0.00%  0.00% thrd
> 18387 root      20    0  3384K  1752K kserel   0:00  0.00%  0.00% thrd
> _______________________________________________
> freebsd-threads at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-threads
> To unsubscribe, send any mail to "freebsd-threads-unsubscribe at freebsd.org"



More information about the freebsd-threads mailing list