There are several interactions with the OpenVMS operating system
that should be noted:
- Like system service calls, pagefault waits are also
thread-synchronous. When a thread incurs a "hard" pagefault
(one which involves reading the page from disk), an upcall is
performed and the thread is placed in a blocked state. DECthreads
schedules another thread to run in its place. When the pagefault
resolution is complete, another upcall occurs and DECthreads
schedules it to run at its next opportunity. It is possible for
multiple threads to take faults on the same page at approximately
the same time. Each of them is blocked in turn, and they are all
unblocked when the page becomes valid.
- Most OpenVMS system services would not be able to tolerate
being called by multiple threads concurrently. Therefore,
calls to OpenVMS system services are serialized, by means of a
mechanism called the inner mode semaphore. If a second
thread attempts to call a system service while another thread
is in the middle of calling a system service, the second thread
will be blocked by an upcall until the first thread completes its
service call.
- DECthreads timeslicing has changed slightly under
OpenVMS Alpha Version 7.0. Prior to Version 7.0, the DECthreads
timeslicer was implemented using an OpenVMS timer. This caused
a DECthreads scheduler AST to be delivered to the process at
regular wall-clock time intervals. While running on wall-clock
time was a necessary evil (in order to be able to interrupt
system service blocks), this timeslice mechanism had several
drawbacks. In Version 7.0, timeslicing is implemented by means
of an upcall that is delivered after the thread has consumed a
sufficient amount of CPU time. Thus, when no threads are running,
no timeslicing takes place.