Transcript Java NIO
Java NIO
Andrew Borg
Andrew Borg. The University of York.
1
This Presentation:
What NIO provides
A short “tutorial-like” introduction to NIO
On NIO and patterns for distributed systems
Why NIO is important to us:
Direct Memory Access and
Nonblocking IO in RMI
the RTSJ
Andrew Borg. The University of York.
2
This Presentation:
What NIO provides
A short “tutorial-like” introduction to NIO
On NIO and patterns for distributed systems
Why NIO is important to us
Andrew Borg. The University of York.
3
What is Java NIO?
Stands
for New IO.
Started off as a JSR under Sun’s JCP (JSR51).
“APIs for scalable I/O, fast buffered binary and
character I/O, regular expressions, charset
conversion, and an improved filesystem interface.”
Andrew Borg. The University of York.
4
How does it do it?
An API for scalable I/O operations on both files and
sockets, in the form of either asynchronous requests or
polling;
An API for fast buffered binary I/O, including the ability to
map files into memory when that is supported by the
underlying platform;
An API for fast buffered character I/O, including a simple
parsing facility based upon regular expressions and a
simple printf-style formatting facility;
Andrew Borg. The University of York.
5
…and
An API for character-set converters, including a serviceprovider interface for pluggable converters
A rich yet platform-independent set of I/O exceptions
A new filesystem interface that supports bulk access to
file attributes (including MIME content types), escape to
filesystem-specific APIs, and a service-provider interface
for pluggable filesystem implementations
Andrew Borg. The University of York.
6
JDK 1.4.x
Provides the package java.nio
This package is a subset of JSR-51. In
particular, proposed file-handling
functionality is absent
Andrew Borg. The University of York.
7
Why so long for good IO?
…Because it is hard for a platform independent
development platform to provide functionality
common to all platforms
Not all OS’ provide the same functions. IO
depends very much on the underlying OS. For
example file metadata is OS specific
Many of the IO features require native code
Andrew Borg. The University of York.
8
So what does NIO give us?
A lot – but not everything
Native code is still required – but you lose
portability
…but some of the things that could be done
before only with native code are now provided in
NIO
Andrew Borg. The University of York.
9
This Presentation:
What NIO provides
A short “tutorial-like” introduction to NIO
On NIO and patterns for distributed systems
Why NIO is important to us
Andrew Borg. The University of York.
10
The java.nio API
java.nio
java.nio.*
java.nio.charset
and java.nio.charset.spi
java.nio.channels
and java.nio.channels.spi
(java.util.regex)
Minor Changes in other packages
Andrew Borg. The University of York.
11
java.nio.*
A whole set of abstract buffers classes, all
extending the abstract class java.nio.buffer
eg: ByteBuffer, CharBuffer, DoubleBuffer,
FloatBuffer, IntBuffer, LongBuffer,
ShortBuffer
Set of methods: reset(), flip(), etc.
0 <= mark <= position <= limit <= capacity
Andrew Borg. The University of York.
12
So what is special about these
buffers?
Direct allocation to physical memory is allowed using
native methods … “if possible”
May be mapped to a file (memory-mapped files).
An implementation may use a backing array.
Different “views” for byte buffers
JNI methods
Andrew Borg. The University of York.
13
JNI functions for NIO direct buffers
jobject NewDirectByteBuffer(JNIEnv* env, void*
address, jlong capacity);
void* GetDirectBufferAddress(JNIEnv* env,
jobject buf);
jlong GetDirectBufferCapacity(JNIEnv* env,
jobject buf);
Andrew Borg. The University of York.
14
Memory and the RTSJ
The RTSJ had to think about this too.
RawMemoryAccess
VT and LT PhysicalMemory
are mapped to physical
addresses
public LTPhysicalMemory(java.lang.Object
type, long size) throws …
So what should we do; in particular for
RawMemoryAccess?
Andrew Borg. The University of York.
15
java.nio.charset
Package java.nio.charset.spi
Service-provider
classes for the
java.nio.charset package
Package java.nio.charset
Encoders
and Decoders for difference
character sets
Andrew Borg. The University of York.
16
//convert ISO-8859-1 encoded bytes in a ByteBuffer to a string in a
CharBuffer and visa versa
// Create the encoder and decoder for ISO-8859-1
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();
try {
ByteBuffer bbuf =
encoder.encode(CharBuffer.wrap("a
string"));
CharBuffer cbuf = decoder.decode(bbuf);
String s = cbuf.toString();
} catch (CharacterCodingException e)
{ }
Andrew Borg. The University of York.
17
java.nio.channels
Selector provider in .channels.spi provides the
abstract class by which the Java virtual machine
maintains a single system-wide default provider
instance
The provider provides instances of
DatagramChannel, Pipe, Selector,
ServerSocketChannel, and SocketChannel
Andrew Borg. The University of York.
18
Selector
Selectable Channel
Selectable Channel
register
Selection Key
Andrew Borg. The University of York.
19
Selectors
A selector maintains three sets of selection keys
The
key set
The selected-key set
The cancelled-key
Event driven – block for events on selection
Selection is done by select(), selectNow() and
select(int timeout). Returns the selected key set.
Andrew Borg. The University of York.
20
Selection Keys
A selection key is created each time a
channel is registered with a selector
A selection key contains two operation
sets
Interest
Set
Ready Set
Andrew Borg. The University of York.
21
Socket Channels
Only one operation is valid for
ServerSocketChannles:
SelectionKey.OP_ACCEPT
SocketChannels support connecting, reading,
and writing, so this method returns
(SelectionKey.OP_CONNECT |
SelectionKey.OP_READ |
SelectionKey.OP_WRITE)
Andrew Borg. The University of York.
22
Concurrency and NIO
Selectors are thread safe but selection
keys are not
Care must be taken to avoid deadlock
To use NIO you don’t have to be brilliant at
socket programming – but you have to
know your concurrency and race-condition
resolution strategies
Andrew Borg. The University of York.
23
Concurrency Example
Selectable Channel
If you:
(1) Add a Channel
(2) Cancel a channel
(3) Modify the interestOps
for a channel
The selector MUST be awake.
If it is blocked on a select(),
you will also block.
select()
Andrew Borg. The University of York.
24
Solving concurrency issues
Issuing a wakeUp() to nudge the selector
This
method is similar to notify() but it is a “queued”
notify
Queuing requests so that on unblocking of the
selector, all required ops are added
It is a better idea to use one thread to wait on a
selector
Andrew Borg. The University of York.
25
This Presentation:
What NIO provides
A short “tutorial-like” introduction to NIO
On NIO and patterns for distributed systems
Why NIO is important to us
Andrew Borg. The University of York.
26
A new platform for Scalable Distributed
Computing Development
Previously, distributed Java applications
were not scalable – when using RMI or
sockets
Technologies like JINI provide scalable
architectures but not scalable servers per
se – the goals are different.
Andrew Borg. The University of York.
27
Distributed Patterns with NIO
Reactor Pattern:
Implemented
in a couple of days
Most time spent on fixing concurrency
Leaders followers
Andrew Borg. The University of York.
28
NIO and ACE
Similar idea
ACE reactor pattern also includes timers. NIO
does not but includes anything that can be
described as selectable (eg. pipes)
How you implement the pattern is up to you
Andrew Borg. The University of York.
29
This Presentation:
What NIO provides
A short “tutorial-like” introduction to NIO
On NIO and patterns for distributed systems
Why NIO is important to us
Andrew Borg. The University of York.
30
DRTSJ and RMI
Seeks to extend the RTSJ with a real-time
RMI for development of Distributed RT
2 approaches – Non-distributed and
distributed thread model
The engineering of any approach is hard
Andrew Borg. The University of York.
31
TAO, ACE and RMI
We are giving a good look at TAO and
ACE and the approach taken in RTCORBA
How to migrate some aspect of these with
RMI
Andrew Borg. The University of York.
32
The problems with RMI
There is no concept of a POA
There is no way to configure an acceptance
mechanism
Real-time systems cannot allow arbitrary
threading policies
JSR 78 Custom Remote References was a step
in the right direction but was rejected
Andrew Borg. The University of York.
33
RMI and NIO
Currently it is hard (or impossible) to implement a scalable RMI
using the standard JDK
Sun’s RMI implementation creates a thread for each connection but
then tries to use those connections intelligently
Strictly speaking you only need one connection per end-point to any
endpoint
In real-time, this is not going to work
Zen developers took up Half-Sync Half-Async pattern as it is the
only thing that Java would offer
Andrew Borg. The University of York.
34
A new scalable RMI
Make use of NIO to handle connections
Use a thread-pool rather than create a
new thread for every connection
Still no application control if to be
conformant with the spec
Andrew Borg. The University of York.
35
That new scalable RMI and the
RTSJ
Scoped memory will make it hard. In particular:
How
should scoped memory be used in any
acceptance and handling pattern
How does this effect how applications would have to
be developed
Perhaps some patterns are just inappropriate in
the presence of scopes?
Andrew Borg. The University of York.
36
Conclusion
Useful and long awaited addition to Java
Will make message-passing applications
more scalable
Will make RMI implementations more
scalable
However, will still be useless for RT unless
appropriate steps are taken in RMI
Andrew Borg. The University of York.
37