thread accounting in libpthread
David Xu
davidxu at freebsd.org
Sat Feb 19 05:34:58 PST 2005
I have run your program, here is the result:
...
thread 04: countup
thread 00: countup
thread 01: countup
--------------------
thread 00: 553150
thread 01: 562367
thread 02: 553351
thread 03: 532770
thread 04: 542718
--------------------
It is fair scheduling. I run it under console and no other programs are
eating CPU
time, note that I didn't run it under X11 terminal.
David Xu
Kazuaki Oda wrote:
> Daniel Eischen wrote:
>
>> On Sat, 19 Feb 2005, Kazuaki Oda wrote:
>>
>>
>>> And while looking at thr_kern.c, I've had one more question.
>>> In kse_switchout_thread, after calling thr_accounting thread is placed
>>> at the tail of run queue or at the head of it according to
>>> thread->slice_usec.
>>> But in kse_check_completed, thread is just placed at the tail of run
>>> queue.
>>> Is there any reason why thread is not placed at the head of run
>>> queue in
>>> case of thread->slice_usec != -1?
>>>
>>
>>
>> Because it already blocked and we don't want to needlessly
>> switch out a currently running thread that hasn't used its
>> quantum.
>>
>>
>>
>
> Blocked? I think that completed threads are *not* blocked and they
> are ready
> to run except for suspended. And, kse_check_completed could be called
> after
> calling kse_wait. In this case there is currently no running thread.
>
> The reason why I am researching libpthread is that the attached
> program shows
> --------------------
> thread 00: 55666
> thread 01: 1161
> thread 02: 1112
> thread 03: 1112
> thread 04: 55494
> --------------------
> on xterm on my UP machine. This is a unexpected result. It seems to
> me that
> libpthread does unfair scheduling. But on SMP machine that program shows
> expected result and on console too...
>
>
> --------------------
> Kazuaki Oda
>
>------------------------------------------------------------------------
>
>#include <sys/types.h>
>#include <sys/uio.h>
>#include <err.h>
>#include <pthread.h>
>#include <stdio.h>
>#include <stdlib.h>
>#include <unistd.h>
>
>#define NTHREADS 5
>#define BUFSZ 128
>
>void *func(void *arg);
>
>typedef struct {
> int id;
>} funcarg;
>
>int stop = 0;
>long counts[NTHREADS];
>
>int main(void)
>{
> pthread_t tids[NTHREADS];
> funcarg *arg;
> int rval;
> int i;
>
> for (i = 0; i < NTHREADS; i++) {
> if ((arg = malloc(sizeof(funcarg))) == NULL)
> err(1, "malloc");
> arg->id = i;
> if ((rval = pthread_create(&tids[i], NULL, func, arg)) != 0)
> errc(1, rval, "pthread_create");
> }
>
> sleep(10);
>
> stop = 1;
>
> for (i = 0; i < NTHREADS; i++) {
> if ((rval = pthread_join(tids[i], NULL)) != 0)
> errc(1, rval, "pthread_join");
> }
>
> printf("--------------------\n");
> for (i = 0; i < NTHREADS; i++)
> printf("thread %02d: %ld\n", i, counts[i]);
> printf("--------------------\n");
>
> return 0;
>}
>
>void *func(void *arg)
>{
> char buf[BUFSZ];
> int id;
> int n;
>
> id = ((funcarg *)arg)->id;
> free(arg);
>
> while (!stop) {
> counts[id]++;
> n = snprintf(buf, sizeof(buf), "thread %02d: countup\n", id);
> write(STDOUT_FILENO, buf, n);
> }
>
> return NULL;
>}
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>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