|
Unless specified otherwise, the information in this chapter applies to both HP-UX PA-RISC and HP-UX Itanium® Processor Family systems.
The HP-UX 11 and 11i operating systems support kernel threads. Each kernel thread is scheduled to run independently which can result in multiple threads running in parallel on multiple processors. The current JVM for HP-UX 11.0 and 11i uses the POSIX 1003.1x Kernel Threads API to access thread support on HP-UX 11.0 and 11i. The libpthread libraries (for PA-RISC and for Itanium) are in /usr/lib.
Previously, the HP-UX 10.20 operating system supported a user-threads package known as DCE or CMA threads. The user-threads package in the JVM for HP-UX 10.20 was known as "green" threads and was similar to but not the same as CMA threads. With CMA or green threads, you could create more than one thread in a user's environment. However, the user threads in a single process could not run on two processors at the same time.
For additional information on threads, read ThreadTime: The Multithreaded Programming Guide by Scott J. Norton and Mark DiPasquale, and Programming with POSIX® Threads by David R. Butenhof. Other information on threads can be found with the "search" link at the HP documentation website.
For information on how to write multi-threaded applications, read Allen Holub's book "Taming Java™ Threads".
Dynamic thread local storage (TLS) support
HP Integrity:
Dynamic thread local storage is fully supported on all HP Integrity (Itanium) systems, beginning with SDK Version 1.4.1.05.
HP9000 PA-RISC:
Currently, the dynamic loader used by shl_load does not support dynamically loading a shared library containing TLS when the library was not included in the link line. For example, you may need to load a library dynamically that contains TLS (such as libjvm.sl) by using shl_load or dlopen, without having linked your application against it. This might be the case if your application uses plug-ins.
To obtain the LD_PRELOAD_ONCE functionality, you need to install the HP-UX patch (or the HP-UX patch that supersedes it) shown below.
HP-UX 11.00 systems, install HP-UX patch PHSS_28869
HP-UX 11.11 systems, install HP-UX patch PHSS_28871
HP-UX 11.23 PA systems do not need a HP-UX patch.
For more information on LD_PRELOAD_ONCE functionality and its limitations, read the man page for dld.sl after you have installed the HP-UX patch.
Thread scheduling issues on HP-UX 11.0 and 11i
Due to security restrictions in HP-UX 11.0 and 11i, if the JVM is not running as a process having privilege PRIV_RTSCHED, then all Java™ threads within that JVM will execute at the same priority regardless of the priorities set by the programmer via java.lang.Thread.setPriority(). If the JVM is running as a user with PRIV_RTSCHED, Java™ thread priorities will be mapped into the range of priorities offered by the SCHED_TIMESHARE policy (see rtsched(2) for details).
Because threads from different processes, perhaps executing on behalf of different users, are competing for the same computational resources, the HP-UX scheduler adjusts the priorities of threads to prevent a high-priority, compute-bound thread from locking out lower priority threads. This adjustment of priorities is a requirement for a multi-user system. However, the Java™ language assumes a scheduling policy where thread priorities are only changed explicitly by the programmer. The JVM uses the HP-UX scheduler and thus the priorities of Java™ threads may change based on their CPU utilization.
Thread stack size limits
The default stack size for Java™ 1.4x 64-bit mode JVM- created threads is 1MB. On PA-RISC 32 and 64-bit systems, the default stack size is 64KB. Therefore, if you are using C language main programs that attach with JNI, you will want to adjust the stack size to avoid overflows. For details and workarounds to avoid stack overflows in the main (primordial) thread and non-main threads, refer to "Main/primordial thread stack size limits" and "Non-Main/primordial thread stack size limits" in the JNI chapter.
Developing hybrid applications
Developers who produce hybrid applications where the application entry point is in a language other than Java, for example a C language main, need to link their applications with the libpthread.sl library (PA-RISC) and the libpthread.so library (IPF) in order to use the JVM. Failing to link with libpthread.sl or libpthread.so will result in a run-time failure when the JVM is loaded.
When building native method implementations to be used with the kernel-threaded JVM, sources must be compiled with the following additional command-line options:
-DNATIVE -D_POSIX_C_SOURCE=199506L
Additionally, hybrid applications must link with the pthread library using -lpthread on the link line.
The Java™ Native Interface documentation in "Using JNI" also includes a section describing how developers of hybrid applications can take advantage of the kernel-threaded JVM along with a description of the compiler and linker options necessary to build the application.
Java™ and all Java-based trademarks and logos are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. Hewlett-Packard is independent of Sun Microsystems, Inc.
|