manu@portia.Stanford.EDU (Manu Thapar) (10/18/89)
Should the context swith time for threads be less than the context switch time for tasks in Mach ? Some time back I used the following program to measure the context switch time for threads and tasks. The program uses locks to force context switches. The same program was used to measure the context switch time for threads and tasks. To measure the CS time for threads, the program was compiled with the "threads library" i.e. "cc locks.c -lthreads -lmach". To measure the CS time for tasks, the program was compiled with the "task library" i.e. "cc locks.c -ltask_threads -lmach". The loop forces 100,000 (50,000 x 2) context switches and takes around 90 sec to complete for BOTH -- threads as well as tasks. This results in the context switch time for threads and tasks being the same -- around 900 micro secs. The measurements were done on a VAX8350. I presume each thread has its own 'proc' structure and user structure and the context switch is done by swapping the PCB's for the threads. Is this done by swtch() in locore.c as it is done in Unix ? I had thought (seems wrongly) that one of the reasons threads were considered "lightweight" was that the context switch time between related threads was less than between related tasks. Comments ? Manu. ---------------------------------------- #include <stdio.h> #include <cthreads.h> #define NUM_LOOP 50000 cthread_t new_thread; mutex_t lock_1, lock_2; /* the initialization is done by the following function */ init() { cthread_init(); lock_1 = mutex_alloc(); lock_2 = mutex_alloc(); } /* * This function resumes the other thread blocked on that threads * lock and then blocks on its own lock util it is resumed by the * the other thread. This function may be used to measure the * context switch time for threads when there is only one CPU in * the system. */ flip_locks() { mutex_t my_lock, his_lock; int i; cthread_t my_id; my_id = cthread_self(); if (my_id != new_thread) { my_lock = lock_1; his_lock = lock_2; } else { my_lock = lock_2; his_lock = lock_1; } for (i=0; i<NUM_LOOP; i++) { mutex_lock(my_lock); mutex_unlock(his_lock); } } main() { init(); new_thread = cthread_fork(flip_locks); flip_locks(); }