ibm-information-center/dist/eclipse/plugins/i5OS.ic.rzab6_5.4.0.1/asynchi0.htm

220 lines
14 KiB
HTML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en-us" xml:lang="en-us">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="security" content="public" />
<meta name="Robots" content="index,follow" />
<meta http-equiv="PICS-Label" content='(PICS-1.1 "http://www.icra.org/ratingsv02.html" l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) "http://www.rsac.org/ratingsv01.html" l gen true r (n 0 s 0 v 0 l 0) "http://www.classify.org/safesurf/" l gen true r (SS~~000 1))' />
<meta name="DC.Type" content="concept" />
<meta name="DC.Title" content="Asynchronous I/O" />
<meta name="abstract" content="Asynchronous I/O APIs provide a method for threaded client server models to perform highly concurrent and memory efficient I/O." />
<meta name="description" content="Asynchronous I/O APIs provide a method for threaded client server models to perform highly concurrent and memory efficient I/O." />
<meta name="DC.Relation" scheme="URI" content="aconcepts.htm" />
<meta name="DC.Relation" scheme="URI" content="../apis/gskstartinit.htm" />
<meta name="DC.Relation" scheme="URI" content="../apis/gskstartrecv.htm" />
<meta name="DC.Relation" scheme="URI" content="../apis/gskstartsend.htm" />
<meta name="DC.Relation" scheme="URI" content="../apis/createiocompletionport.htm" />
<meta name="DC.Relation" scheme="URI" content="../apis/destroyiocompletionport.htm" />
<meta name="DC.Relation" scheme="URI" content="../apis/waitforiocompletion.htm" />
<meta name="DC.Relation" scheme="URI" content="../apis/startaccept.htm" />
<meta name="DC.Relation" scheme="URI" content="../apis/startsend.htm" />
<meta name="DC.Relation" scheme="URI" content="../apis/startrecv.htm" />
<meta name="DC.Relation" scheme="URI" content="../apis/postiocompletion.htm" />
<meta name="DC.Relation" scheme="URI" content="xasynchi0.htm" />
<meta name="DC.Relation" scheme="URI" content="designrec.htm" />
<meta name="DC.Relation" scheme="URI" content="xcodesigns.htm" />
<meta name="DC.Relation" scheme="URI" content="xsignals.htm" />
<meta name="copyright" content="(C) Copyright IBM Corporation 2001, 2006" />
<meta name="DC.Rights.Owner" content="(C) Copyright IBM Corporation 2001, 2006" />
<meta name="DC.Format" content="XHTML" />
<meta name="DC.Identifier" content="asynchi0" />
<meta name="DC.Language" content="en-us" />
<!-- All rights reserved. Licensed Materials Property of IBM -->
<!-- US Government Users Restricted Rights -->
<!-- Use, duplication or disclosure restricted by -->
<!-- GSA ADP Schedule Contract with IBM Corp. -->
<link rel="stylesheet" type="text/css" href="./ibmdita.css" />
<link rel="stylesheet" type="text/css" href="./ic.css" />
<title>Asynchronous I/O</title>
</head>
<body id="asynchi0"><a name="asynchi0"><!-- --></a>
<!-- Java sync-link --><script language="Javascript" src="../rzahg/synch.js" type="text/javascript"></script>
<h1 class="topictitle1">Asynchronous I/O</h1>
<div><p>Asynchronous I/O APIs provide a method for threaded client server
models to perform highly concurrent and memory efficient I/O.</p>
<p>In previous threaded client/server models, typically two I/O models have
prevailed. The first model dedicated one thread per client connection. The
first model consumes too many threads and can incur a substantial sleep and
wake up cost. The second model minimizes the number of threads by issuing
the <span class="apiname">select()</span> API on a large set of client connections and
delegating a readied client connection or request to a thread. In the second
model, you must select or mark on each subsequent select, which can cause
a substantial amount of redundant work.</p>
<p>Asynchronous I/O and overlapped I/O resolve both these dilemmas by passing
data to and from user buffers after control has been returned to the user
application. Asynchronous I/O notifies these worker threads when data is available
to be read or when a connection has become ready to transmit data. </p>
<div class="section"><h4 class="sectiontitle">Asynchronous I/O advantages</h4><ul><li>Asynchronous I/O uses system resources more efficiently. Data copies from
and to user buffers are asynchronous to the application initiating the request.
This overlapped processing makes efficient use of multiple processors and
in many cases improves paging rates because system buffers are freed for reuse
when data arrives.</li>
<li>Asynchronous I/O minimizes process/thread wait time.</li>
<li>Asynchronous I/O provides immediate service to client requests.</li>
<li>Asynchronous I/O decreases the sleep and wake up cost on average.</li>
<li>Asynchronous I/O handles "bursty application" efficiently.</li>
<li>Asynchronous I/O provides better scalability.</li>
<li>Asynchronous I/O provides the most efficient method of handling large
data transfers. The fillBuffer flag on the <span class="apiname">QsoStartRecv()</span> API
informs the operating system to acquire a large amount of data before completing
the Asynchronous I/O. Large amounts of data can also be sent with one asynchronous
operation.</li>
<li>Asynchronous I/O minimizes the number of threads that are needed.</li>
<li>Asynchronous I/O optionally can use timers to specify the maximum time
allowed for this operation to complete asynchronously. Servers close a client
connection if it has been idle for a set amount of time. The asynchronous
timers allow the server to enforce this time limit. </li>
<li>Asynchronous I/O initiates secure session asynchronously with the <span class="apiname">gsk_secure_soc_startInit()</span> API.</li>
</ul>
<div class="p">
<div class="tablenoborder"><table cellpadding="4" cellspacing="0" summary="" width="100%" frame="border" border="1" rules="all"><caption>Table 1. Asynchronous I/O APIs</caption><thead align="left"><tr><th valign="top" width="50%" id="d0e71">Function</th>
<th valign="top" width="50%" id="d0e73">Description</th>
</tr>
</thead>
<tbody><tr><td valign="top" width="50%" headers="d0e71 "><span class="apiname">gsk_secure_soc_startInit() </span></td>
<td valign="top" width="50%" headers="d0e73 ">Starts an asynchronous negotiation of a secure session,
using the attributes set for the SSL environment and the secure session. <div class="note"><span class="notetitle">Note:</span> This
API only supports sockets with address family AF_INET or AF_INET6 and type
SOCK_STREAM. </div>
</td>
</tr>
<tr><td valign="top" width="50%" headers="d0e71 "><span class="apiname">gsk_secure_soc_startRecv()</span></td>
<td valign="top" width="50%" headers="d0e73 ">Starts an asynchronous receive operation on a secure
session. <div class="note"><span class="notetitle">Note:</span> This API only supports sockets with address family AF_INET
or AF_INET6 and type SOCK_STREAM. </div>
</td>
</tr>
<tr><td valign="top" width="50%" headers="d0e71 "><span class="apiname">gsk_secure_soc_startSend()</span></td>
<td valign="top" width="50%" headers="d0e73 ">Starts an asynchronous send operation on a secure
session. <div class="note"><span class="notetitle">Note:</span> This API only supports sockets with address family AF_INET
or AF_INET6 and type SOCK_STREAM. </div>
</td>
</tr>
<tr><td align="left" valign="top" width="50%" headers="d0e71 "><span class="apiname">QsoCreateIOCompletionPort()</span></td>
<td align="left" valign="top" width="50%" headers="d0e73 ">Creates a common wait point for completed
asynchronous overlapped I/O operations. The <span class="apiname">QsoCreateIOCompletionPort()</span> function
returns a port handle that represents the wait point. This handle is specified
on the <span class="apiname">QsoStartRecv()</span>, <span class="apiname">QsoStartSend()</span>, <span class="apiname">QsoStartAccept()</span>, <span class="apiname">gsk_secure_soc_startRecv()</span>, or <span class="apiname">gsk_secure_soc_startSend()</span> functions to initiate
asynchronous overlapped I/O operations. Also this handle can be used with <span class="apiname">QsoPostIOCompletion()</span> to
post an event on the associated I/O completion port.</td>
</tr>
<tr><td align="left" valign="top" width="50%" headers="d0e71 "><span class="apiname">QsoDestroyIOCompletionPort()</span></td>
<td align="left" valign="top" width="50%" headers="d0e73 ">Destroys an I/O completion port.</td>
</tr>
<tr><td align="left" valign="top" width="50%" headers="d0e71 "><span class="apiname">QsoWaitForIOCompletionPort()</span></td>
<td align="left" valign="top" width="50%" headers="d0e73 ">Waits for completed overlapped I/O operation.
The I/O completion port represents this wait point.</td>
</tr>
<tr><td valign="top" width="50%" headers="d0e71 "><span class="apiname">QsoStartAccept()</span></td>
<td valign="top" width="50%" headers="d0e73 ">Starts an asynchronous accept operation. <div class="note"><span class="notetitle">Note:</span> This
API only supports sockets with address family AF_INET or AF_INET6 and type
SOCK_STREAM. </div>
</td>
</tr>
<tr><td align="left" valign="top" width="50%" headers="d0e71 "><span class="apiname">QsoStartRecv()</span></td>
<td align="left" valign="top" width="50%" headers="d0e73 ">Starts an asynchronous receive operation.
<div class="note"><span class="notetitle">Note:</span> This API only supports sockets with address family AF_INET or AF_INET6
and type SOCK_STREAM. </div>
</td>
</tr>
<tr><td align="left" valign="top" width="50%" headers="d0e71 "><span class="apiname">QsoStartSend()</span></td>
<td align="left" valign="top" width="50%" headers="d0e73 ">Starts an asynchronous send operation. <div class="note"><span class="notetitle">Note:</span> This
API only supports sockets with the AF_INET or AF_INET6 address families with
the SOCK_STREAM socket type.</div>
</td>
</tr>
<tr><td align="left" valign="top" width="50%" headers="d0e71 "><span class="apiname">QsoPostIOCompletion()</span></td>
<td align="left" valign="top" width="50%" headers="d0e73 ">Allows an application to notify a completion
port that some function or activity has occurred. </td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="section"><h4 class="sectiontitle">How asynchronous I/O works</h4><p>An application
creates an I/O completion port using the <span class="apiname">QsoCreateIOCompletionPort()</span> API.
This API returns a handle that can be used to schedule and wait for completion
of asynchronous I/O requests. The application starts an input or an output
function, specifying an I/O completion port handle. When the
I/O is completed, status information and an application-defined handle is
posted to the specified I/O completion port. The post to the I/O completion
port wakes up exactly one of possibly many threads that are waiting. The application
receives the following items:</p>
<ul><li>A buffer that was supplied on the original request</li>
<li>The length of data that was processed to or from that buffer</li>
<li>An indication of what type of I/O operation has been completed</li>
<li>Application-defined handle that was passed on the initial I/O request</li>
</ul>
<p>This application handle can be the socket descriptor
identifying the client connection, or a pointer to storage that contains extensive
information about the state of the client connection. Since the operation
was completed and the application handle was passed, the worker thread determines
the next step to complete the client connection. Worker threads that process
these completed asynchronous operations can handle many different client requests
and are not tied to just one. Because copying to and from user buffers occurs
asynchronously to the server processes, the wait time for client request diminishes.
This can be beneficial on systems where there are multiple processors.</p>
</div>
<div class="section"><h4 class="sectiontitle">Asynchronous I/O structure</h4><p>An application
that uses asynchronous I/O has the structure demonstrated by the following
code fragment.</p>
<div class="p"> <pre>#include &lt;qsoasync.h&gt;
struct Qso_OverlappedIO_t
{
Qso_DescriptorHandle_t descriptorHandle;
void *buffer;
size_t bufferLength;
int postFlag : 1;
int fillBuffer : 1;
int postFlagResult : 1;
int reserved1 : 29;
int returnValue;
int errnoValue;
int operationCompleted;
int secureDataTransferSize;
unsigned int bytesAvailable;
struct timeval operationWaitTime;
int postedDescriptor;
char reserved2[40];
}</pre>
</div>
</div>
</div>
<div>
<div class="familylinks">
<div class="parentlink"><strong>Parent topic:</strong> <a href="aconcepts.htm" title="Advanced socket concepts go beyond a general discussion of what sockets are and how they work. They provide ways to design socket applications for larger and more complex networks.">Advanced socket concepts</a></div>
</div>
<div class="relref"><strong>Related reference</strong><br />
<div><a href="xasynchi0.htm" title="An application creates an I/O completion port using the QsoCreateIOCompletionPort() API.">Example: Use asynchronous I/O</a></div>
<div><a href="designrec.htm" title="Before working with socket applications, assess the functional requirements, goals, and needs of the socket application.">Socket application design recommendations</a></div>
<div><a href="xcodesigns.htm" title="There are a number of ways that you can design a connection-oriented socket server on the iSeries. These example programs can be used to create your own connection-oriented designs.">Examples: Connection-oriented designs</a></div>
<div><a href="xsignals.htm" title="Signals allow you to be notified when a process or application becomes blocked.">Example: Use signals with blocking socket APIs</a></div>
</div>
<div class="relinfo"><strong>Related information</strong><br />
<div><a href="../apis/gskstartinit.htm">gsk_secure_soc_startInit()</a></div>
<div><a href="../apis/gskstartrecv.htm">gsk_secure_soc_startRecv()</a></div>
<div><a href="../apis/gskstartsend.htm">gsk_secure_soc_startSend()</a></div>
<div><a href="../apis/createiocompletionport.htm">QsoCreateIOCompletionPort()</a></div>
<div><a href="../apis/destroyiocompletionport.htm">QSoDestroyIOCompletionPort()</a></div>
<div><a href="../apis/waitforiocompletion.htm">QsoWaitForIOCompletionPort()</a></div>
<div><a href="../apis/startaccept.htm">QsoStartAccept()</a></div>
<div><a href="../apis/startsend.htm">QsoStartSend()</a></div>
<div><a href="../apis/startrecv.htm">QsoStartRecv()</a></div>
<div><a href="../apis/postiocompletion.htm">QsoPostIOCompletion()</a></div>
</div>
</div>
</body>
</html>