| NSPR 2.0 evolution | |
| ------------------ | |
| Phase 1- today | |
| Currently (Oct 10, 1996) NSPR 2.0 has two modes. Either _PR_NTHREAD | |
| is defined, in which case the PR_CreateThread() call always creates a | |
| native kernel thread, or _PR_NTHREAD is not defined and PR_CreateThread() | |
| always creates user level threads within the single, original process. This | |
| source code is reflected in two directories, nspr20/pr/src/threads/native, and | |
| nspr20/pr/src/threads/user. Although the PR_CreateThread() function has | |
| a paramter to specify the "scope" of a thread, this parameter is not yet | |
| used- except on solaris where it uses it to specify bound vs unbound threads. | |
| Phase 2 - next week | |
| The next step is to provide a combination of user and native threads. The | |
| idea, of course, is to have some small number of native threads and each of | |
| those threads be able to run user level threads. The number of native | |
| threads created will most likely be proportional to the number of CPUs in | |
| the system. For this reason, the specific set of native threads which are | |
| used to run the user-level threads will be called "CPU" threads. | |
| The user level threads which will be run on the CPU threads are able to | |
| run on any of the CPU threads available, and over the course of a user-level | |
| thread's lifetime, it may drift from one CPU thread to another. All | |
| user-level threads will compete for processing time via a single run queue. | |
| Creation of a CPU thread will be primarily controlled by NSPR itself or by | |
| the user running a function PR_Concurrency(). The details of PR_Concurrency() | |
| have not yet been worked out; but the idea is that the user can specify to | |
| NSPR how many CPU threads are desired. | |
| In this system, user-level threads are created by using PR_CreateThread() and | |
| specifying the PR_LOCAL_SCOPE option. LOCAL_SCOPE indicates that the thread | |
| will be under the control of the "local" scheduler. Creating threads with | |
| GLOBAL_SCOPE, on the other hand will create a thread which is under the | |
| control of the system's scheduler. In otherwords, this creates a native thread | |
| which is not a CPU thread; it runs a single thread task and never has more | |
| than one task to run. LOCAL_SCOPE is much like creating a Solaris unbound | |
| thread, while GLOBAL_SCOPE is similar to creating a Solaris bound thread. | |
| To implement this architecture, the source code will still maintain the "user" | |
| and "native" directories which is has today. However a third directory | |
| "combined" will also exist. To compile a version of NSPR which only creates | |
| native threads, the user can define _PR_NTHREAD. For exclusive user-level | |
| threads, do not define _PR_NTHREAD. To get the combined threads, define | |
| _PR_NTHREAD and _PR_USE_CPUS. | |
| Phase 3 - later than next week | |
| The goal is to eliminate the 3 directories. Once these three models are in | |
| place, the remaining work will be to eliminate the native and user thread | |
| directories for all platforms, so that the entire thread model is contained | |
| within what is today called the "combined" model. This new and glorious | |
| source code will attempt to make the "combined" model on any platforms which | |
| provide the necessary underlying native threading, but will also be | |
| capable of using exclusive user-level threads on systems which don't have | |
| native threads. | |