Java NIO

advertisement
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
Download