《异步编程.ppt》由会员分享,可在线阅读,更多相关《异步编程.ppt(21页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、Asynchronous Programming ModelShiding LinNon-blocking,blockingOverlapped IO,IO completion portAsynchronous,synchronousThreadingEvent-driven programmingConceptsBlockingSame control flowReturn when readyNon-blockingInstant returnStatus checking by poll,select,epollBlocking&non-blockingread()read()chec
2、k readyreadyblockedIOCPInstant returnNotification from kernel when completedCallback functionSynchronization objectsCompletion event(to IO Completion Port)Overlapped IO&IO completion portread()I/OnotifynotificationWorker threadsWhy asynchronous?Concurrent requestsMulti-party communicationMultiple de
3、vices(NICs,disks)Synchronous+multi-threadingBetter performance for user-level context switchAsynchronous&synchronousThreadVirtual processorTime-multiplexingAdvantagesSimple and IntuitiveDisadvantagesLockContext-switch costBad scalability(ctx StartA(ctx,EndA);EndA:a-ctx StartB(ctx,EndB);EndB:StartC(c
4、tx,EndC);EndC:Manual stack managementChopped control flowa=A(f)b=B(a)c=C(b)Two phase commitEvent-driven programmingCoordinatorSubordinateLog(”Prepare”)PrepareCollect all acksCommitLog(”Ready”)Prepare_AckCommit_AckLog(”Commit”)Log(”Commit”)Collect all acksNon-lockLight-weight context switchGood scala
5、bilityChopped control flowManual stack managementOnly logical parallelismPros and consProgramming frameworkEvent-drivenAsynchronous IOMulti-processor supportKylinKylin architectureCExecManCDiskManCNetManreq.Qdisksthreadevent Qobjectsthreadevent Qobjectsthreadevent Qobjectsconnections req.Qstruct Asy
6、ncContext Job job;APF_ERROR nErrCode;int nAction;CAsyncClient*pClient;class CAsyncClientprotected:virtual void OnCompletion(AsyncContext*pCtx)=0;public:int GetAsyncId();virtual int AddRef();virtual int Release();virtual const char*GetName();void SetName(const char*fmt,.);Interfacesstruct NetRequest
7、AsyncContext async;void*buf;int len;int request;int xfered;class CSocketV:public CAsyncClientprotected:virtual void OnCompletion(AsyncContext*pContext);virtual bool OnConnected(APF_ERROR nErrCode);virtual void OnListened(SOCKET s,SOCKADDR_IN*pSockAddrIn);virtual void OnWritten(APF_ERROR nErrCode,Net
8、Request*pReq)virtual void OnRead(APF_ERROR nErrCode,NetRequest*pReq)virtual void OnBroken(APF_ERROR nErrCode)=0;bool Close();public:APF_ERROR Create(bool bTCP,uint16 port=0,uint32 ip=0);void Listen(int backlog=64);void Connect(uint32 ip,uint16 port);void Shutdown();void Read(void*pBuf,int count,NetR
9、equest*pReq);void Write(void*pBuf,int count,NetRequest*pReq);Interfacesclass CFIFOChannel:public CSocket;void CFIFOChannel:OnRead(APF_ERROR nErrCode,NetRequest*pReq)if(0=nErrCode)add pReq-buf to buffer queue:m_ReadQOnRead();void CFifoChannel:OnRead()char*p,buf32;for(;)switch(m_frt)case FRT_PACK_BEGI
10、N:if(m_ReadQ.GetTotalLen()=20)m_ReadQ.GetN(20,buf);if(buf19=0)p=buf+6;m_nHead=strtoul(p,&p,10);if(m_nHead!=0)while(IS_BLANK(*p)p+;m_nBody=strtoul(p,NULL,10);m_frt=FRT_HEADER;break;m_frt=FRT_STOP;break;StartRead();return;case Sample 1:FIFOBUF!x y 0headrnrnbodyEOF!Sample 2:Block cache managercachereadwritefreeDiskMandisksevent Qreq.Qpackcheckenqevent QclientackackcallESPKylinESPSSDBSSDB-ClientsimulationnetworkingThank you!