October 21, 2001
Last week we posted an article
on how Multitasking and Multithreading can better utilize
a computer's processing potential. We asked several questions
about multithreading, such as does it require dual processors
or can multithreading occur if just one processor is present.
Below we post some of the informative and thoughtful responses
we received. We would like to also pose another question,
about making a program multithreaded under Mac OS X; How much
work is it as a percentage of over-all application development?
If you have information in regards to this or any feedback
on the issue of OS X performance please either e-mail
us, or use this link
to post your thoughts on our bulletin board.
I just thought I'd give you some clarifications regarding your article
on multithreading and multitasking in OS X.
First of all, Mac OS 9 does multitasking as well; it's a variant called
cooperative multitasking. The difference is that with preemptive
multitasking (which Unix, BeOS, newer Windows versions...) the kernel
(or more properly, the scheduler, which is part of the kernel) gives CPU
time to a process, and then takes it away a certain amount of time
later. This means that all processes will get some time (it doesn't
guarantee that all processes will get ENOUGH time, because you're still
dividing up a finite pie; too many processes can still bog down any
With cooperative multitasking, there is no scheduler; each process runs
until it hands control over to the next process in the queue. This means
that a poorly behaved program may never hand control over, and can
monopolize the machine.
However, this has some interesting side-effects: for a single purpose
(i.e. crunching SETI data, perhaps?) that doesn't rely on multiple
processes interacting, a cooperatively multitasking system can be faster
than a preemptively multitasking system. This is because there isn't the
overhead of a scheduler. For most uses, though, a preemptively
multitasking system is superior.
If processes are different paths of execution in an operating system,
then threads are different paths of execution in an application. In
other words, threads are to a process what processes are to an entire
system. Just as two different processes (even if non-threaded) can be
run on each of two different processors on a multiprocessor system (thus
gaining some advantage on an MP system even with non-MP-aware apps), two
different threads within a process can each run on a different
processor. This is what it means for an application to be MP-aware.
Note that programming threads is quite tricky, and requires some
sophisticated techniques for making sure the two threads don't step on
each others' memory. Why is this? Because in OS X (like any Unix) while
two processes are separated in memory, and can't access each other's
memory, two threads are NOT separated in memory, and can easily step on
each other and cause hard-to-fix bugs.
Another note - Mac OS 9 also has multithreading; that is, any
application can have several threads. Thus, a multithreaded application
(like Photoshop) can be MP-aware in OS 9 as well. However, thread
programming is not as easy in 9 as in X.
So, is there any advantage to multithreading on a single-processor
system? Yes! Even if there's only one processor, a well-written
multithreaded application can have major advantages. To take a simple
example, look at the Finder in Mac OS 8 and later. You can do multiple
copies at once - that's an example of threading; the 'copy' facility (or
subroutine) is reentrant (can be called several times in parallel) and
is a separate thread (making it possible to do other things in the
Finder while a copy is going on). Compare this to the System 6 Finder,
which was not multithreaded.
Basically, good application design includes taking parts of your program
that may take a lot of CPU time (or may simply need to run for a while
even if they're not CPU-bound, because they're waiting for network
transactions or something), and making them separate threads so they can
go off and work by themselves, without making the entire application
unresponsive. It's just like how a multitasking OS (cooperative or
preemptive) is useful even on a single-processor system :-)
I just wanted to give you a quick, and simple, answer to your question
about multithreading. I'm sure plenty of people have already answered you,
but just in case, I wanted to throw in my 2 cents... :)
Basically, multithreading is breaking a large, complex, program into many
different pieces that can run concurrently, or even independently. An
example would be a web browser that is able to load pages in two windows at
once, or even able to load and display all the graphics on a single page,
System 7 introduced multithreading, but it was poorly implemented and was
hamstrung by the parent applications' reliance on cooperative scheduling.
Threads could only execute within the parent application, so IE could load
2 pages at once, but if another application took the processor, all the IE
threads would stall until it got the processor back.
Mac OS X introduces finer granularity to multithreading. Now the kernel
itself is multithreaded, and all programs execute as at least one
thread. Even if there is only ONE processor, the multiple threads allow
the system to do many things, in many different programs, at once.
Multithreaded applications (including the kernel) can be divided for
execution among available processors, but the kernel can also move single
threaded applications between processors. So if you have 2 single threaded
programs running, one can run on the first processor while the second
executes on the second processor.
I hope I put that in straight forward enough terms. Thanks for the article.
With so many people spouting buzzwords these days, it's nice to have
someone explain them to the unwashed masses. :)
Computing & Communications
Can multithreading occur if only one processor is present?
Yes. Multithreaded code runs independently of how many processors
are present. (It will run faster on multi-CPU machines though).
Here is the basic model: At any given time there is a collection of
threads and processes "running" on the computer. Threads and
processes are almost the same (the main difference is that a group of
threads can easily share data whereas processes each have their own
separate data space).
Within the OS there is a component called the scheduler. The
scheduler decides how much time each process and each thread will get
to run before switching to the next process or thread. On a machine
with multiple CPUs, the scheduler also decides which CPUs run which
threads or processes. Usually the scheduling is done to balance the
threads and processes across CPUs so that you don't have one CPU
handling tons of work while the other CPUs sit idle. (If there is
only one thread or process that is doing lots of work, though, then
you will have one CPU doing lots of work while the others sit there
doing not much.)
On a single-CPU machine, all the threads and processes have to (of
course) run only on one CPU. The scheduler schedules all of them for
that one CPU, but it still switches among different threads and
processes giving each one its own time slice in which to run.
Nicholas Coult, Ph.D.
Assistant Professor, Department of Mathematics, Augsburg College
...the reason dual processors make no difference 90% of the time is simple,
the application in question is not written to be multithreaded. OSX
does allow "load balancing" - ie it can run 2 separate applications at
100% load each on 2 chips, but it cannot make an unthreaded application
multithreaded by magic. The same situation pertains under Windows 2000.
If Apple cannot persuade developers to write multithreaded applications
for OSX, then MP Macs won't have much of a future. Power applications
that benefit from dual chips now include Cinema 4D (raytracing only)
Adobe Premiere (excellent load balancing) Adobe Photoshop (full-on
multithreading) Discreet Combustion (multithreading) Discreet Cleaner 5
(marginal multi-threading) etc.
An application that shows excellent scalability for benchmarking puposes
is the Distributed.net client, dnetc. Visit their website for some very
impressive MP G4 achievements.
Adrian CC Thomas