Date: Wed, 24 Nov 1999 11:41:41 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: Anthony Kimball <alk@pobox.com> Cc: freebsd-arch@freebsd.org Subject: Re: Threads Message-ID: <199911241941.LAA20231@apollo.backplane.com> References: <Pine.SUN.3.91.991124134533.26314A-100000@pcnet1.pcnet.com> <199911241905.LAA20045@apollo.backplane.com> <14396.15070.190669.25400@avalon.east>
next in thread | previous in thread | raw e-mail | index | archive | help
:It would be nice to keep an eye out for the future... SMP :coscheduling of threads. I'd like to see FreeBSD become the OS of the :fastest computer in the world. Making it easy to coschedule threads :(or processes for that matter) would go a long way towards displacing :Linux in this category. Coscheduling is a fairly simple mechanism to implement. No real special cases need to be added to the scheduler itself, you simply ensure that it is 'most likely' for the threads to be scheduled together by placing them next to each other in the run queue. For example, if you have a single scheduling queue (which I really think is what we want) and the scheduler on each cpu picks off the next ready thread from the same queue, and two threads wakeup simultaniously, you can construct the queueing code such that it is highly likely that the two threads will each be (nearly) simultaniously assigned a different cpu and be able to run in parallel. Coscheduling becomes utterly trivial to accomplish if you are using a fractional fair-share scheduler with a single circular linked list of runnable (and running) threads. This is because you can insert a new thread anywhere in the list you wish without creating a hogging sleep/wakeup hogging situation. Thus you can group tasks together fairly easily, even if they have different priorities, and you can even insert special scheduling synchronization entities to handle stabilization issues. A scheduling synchronization entity is a dummy thread for which the context switch is minimal. The thread is responsible for doing special scheduling protocols for the following N threads on the list. The 'real' scheduler winds up not having to do anything special. The dummy thread doesn't really run in a real context and only runs long enough to schedule the next few entities in a special manner. Typically I implement my schedulers using the 'ret' trick. The entity going to sleep pushes whatever context needs to be saved and then pushes the 'restore' vector onto its stack, stores the stack pointer in the task, and then switches to the next task. To restore the context of the task being switched to, the scheduler simply loads the stack pointer from the task structure and issues a 'RET'. This way you can implement a number of special cases as scheduling entities (without any of the overhead) rather then within the scheduler core itself. -Matt Matthew Dillon <dillon@backplane.com> 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?199911241941.LAA20231>