Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Nov 1999 21:37:39 -0800 (PST)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        Julian Elischer <julian@whistle.com>, arch@freebsd.org
Subject:   Re: Threads stuff
Message-ID:  <199911290537.VAA61862@apollo.backplane.com>
References:  <Pine.BSF.4.10.9911282059000.544-100000@current1.whistle.com> <199911290523.VAA59334@apollo.backplane.com>

next in thread | previous in thread | raw e-mail | index | archive | help
    Let me give you an example of how it would work if KSEs were the kernel
    scheduling entity instead of processes.

    (1) The UTS wants to run threads in a FIFO.

	- UTS schedules one thread at a time with the kernel.  That is,
	  it deschedules the current thread and schedules a new one.  FIFO
	  operation is achieved.

    (2) The UTS wants to run several threads in parallel

	- UTS schedules several threads at a time with the kernel.  For
	  example, the UTS can decide to schedule two threads with the
	  kernel (not deschedule the first one after scheduling the second
	  one).

	- UTS is thus able to simulate N cpu's, a 'virtual cpu environment'
	  without having to run through loops with rfork() and exit().

	- kernel memory and process 'clutter' is minimized.  There is still
	  only one process shown in the ps (or at least the base ps).

    (3) The UTS wants to simulate prioritized software interrupts using
	threads.

	- UTS simply deschedules the thread being interrupted and schedules
	  the interrupting thread, and vise-versa on return.

    (4) The UTS wants to simulate a multi-priority RR queue.

	- UTS simply schedules all threads at the highest priority all
	  at once and ensures that threads at lower priorities are 
	  descheduled.

    You see?  It's easy.  If you try to do this under a multiple-process 
    umbrella using rfork() and enforce serialization on a process-by-process
    basis, you complicate matters greatly.  For example, take the last 
    algorithm -- N equi-priority threads need to be run with maximum
    parallelism.  In the rfork() case the UTS code becomes much more complex
    then simply telling the kernel to 'go' with all N threads.  The UTS must
    manage the spread across the virtual cpu's as well and must have direct
    knowledge of the number of cpu's in the system on top of that.

    But if the KSE is the schedulable entity and the UTS is simply trying
    to simulate N cpu's (where N can be anything -- including large numbers
    like 10 or 20), the UTS simply tells the kernel to 'go' for all N
    threads and lets the kernel deal with the conversion to actual physical
    cpu's.

    Similarly, reserving a physical cpu is also trivial.  In this case just
    as trivial as reserving a 'virtual' cpu.

    A whole lot of code becomes a whole lot less complex if the KSE is
    the schedulable entity rather then the struct proc.
	
							-Matt




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199911290537.VAA61862>