1 / 19

Cooperative Task Management without Manual Stack Management or, Event-driven Programming is Not the Opposite of Threaded

Cooperative Task Management without Manual Stack Management or, Event-driven Programming is Not the Opposite of Threaded Programming. Atul Adya, Jon Howell, Marvin Theimer, William J. Bolosky, John R. Douceur Microsoft Research Presented by Jonathan Beare CS 533 – Winter 2009. References.

stanislaus
Download Presentation

Cooperative Task Management without Manual Stack Management or, Event-driven Programming is Not the Opposite of Threaded

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Cooperative Task Management without Manual Stack Managementor, Event-driven Programming is Not the Opposite of Threaded Programming Atul Adya, Jon Howell, Marvin Theimer, William J. Bolosky, John R. Douceur Microsoft Research Presented by Jonathan Beare CS 533 – Winter 2009

  2. References “An Introduction to Programming with Threads” Andrew D Birrell “On the Duality of Operating System Structures” H. C. Lauer and R. M. Needham “Why threads are a bad idea (for most purposes)” John Ousterhout “SEDA: An architecture for well-conditioned, scalable internet services” Matt Welsh, David Culler, and Eric Brewer

  3. Introduction • Events vs. Threads Argument • Stack Management • Manual, Automatic • Task Management • Serial, Cooperative, Preemptive • We need a Compromise! • Cooperative Threading

  4. Goals for Cooperative Threading • Benefits of both • Event-driven (Manual Stack) • Ease of reasoning about concurrency • Thread-driven (Automatic Stack) • Ease of readability and maintainability

  5. Conflation, Conflation, Conflation • Task Management • Stack Management • I/O Response Management • Conflict Management • Data Partitioning

  6. Cooperative Threading • Automatic Stack Management • Cooperative Task Management • Atomic Blocks • Yielding

  7. Cooperative Threading • Advantages • Readability • Few concurrency issues • Efficiency • Disadvantages • Explicit yielding

  8. Manual, Automatic Interoperation • Hybrid Approach • Usage of Wrappers • Disparate Programmers • Conflicting Codebases • Generally not a preferred method

  9. CAInfo GetCAInfoBlocking(CAID caId) { CAInfo caInfo = LookupHashTable(caId); if (caInfo != NULL) { // Found node in the hash table return caInfo; } caInfo = new CAInfo(); // DiskRead blocks waiting for // the disk I/O to complete. DiskRead(caId, caInfo); InsertHashTable(caId, CaInfo); return caInfo; } Stack Management Automatic

  10. void GetCAInfoHandler1(CAID caId, Continuation ∗callerCont) { // Return the result immediately if in cache CAInfo ∗caInfo = LookupHashTable(caId); if (caInfo != NULL) { // Call caller’s continuation withresult (∗callerCont−>function)(caInfo); return; } // Make buffer space for disk read caInfo = new CAInfo(); // Save return address & live variables Continuation ∗cont = new Continuation(&GetCAInfoHandler2, caId, caInfo, callerCont); // Send request EventHandle eh = InitAsyncDiskRead(caId, caInfo); // Schedule event handler to run on reply // by registering continuation RegisterContinuation(eh, cont); } void GetCAInfoHandler2(Continuation∗cont) { // Recover live variables CAID caId = (CAID) cont−>arg1; CAInfo ∗caInfo = (CAInfo∗) cont−>arg2; Continuation ∗callerCont = (Continuation∗) cont−>arg3; // Stash CAInfo object in hash InsertHashTable(caId, caInfo); // Now “return” results to original caller (∗callerCont−>function)(callerCont); } Stack Management Manual

  11. function FetchCertificate GetCertificateData if VerifyCertificate is false return false function GetCertificateData if Certificate is InMemory return Certificate else GetCertificateFromDisk return Certificate function VerifyCertificate GetCertificateInfo if CertificateInfo is NULL return false else return CheckCertificate // Implemented as Manual // Implemented as Manual // May retrieve immediately // Must wait for disk // Implemented as Automatic // Implemented as Manual, wait for disk // May retrieve immediately Stack Management Hybrid Example

  12. Hybrid Management Example Overview Manual Automatic Manual Automatic

  13. Hybrid Management Cross-calling bool FetchCert(User user, Certificate ∗cert) { // Get the certificate data from a // function that might do I/O certificate = GetCertData(user); if (!VerifyCert(user, cert)) { return false; } } Certificate∗ GetCertData(User user) { // Look up certificate in the memory // cache and return the answer. // Else fetch from disk/network if (Lookup(user, cert)) return certificate; certificate = DoIOAndGetCert(); return certificate; } bool VerifyCert(User user, Certificate ∗cert) { // Get the Certificate Authority (CA) // information and then verify cert ca = GetCAInfo(cert); if (ca == NULL) return false; return CACheckCert(ca, user, cert); }

  14. Hybrid Management Continuation-to-Fiber adaptor void VerifyCertCFA(CertData certData, Continuation ∗callerCont) { // Executed on MainFiber Continuation ∗vcaCont = new Continuation(VerifyCertCFA2, callerCont); Fiber ∗verifyFiber = new VerifyCertFiber(certData, vcaCont); // On fiber verifyFiber, start executing // VerifyCertFiber::FiberStart SwitchToFiber(verifyFiber); // Control returns here when // verifyFiber blocks on I/O } VerifyCertFiber::FiberStart() { // Executed on a fiber other than MainFiber // The following call could block on I/O. // Do the actual verification. this−>vcaCont−>returnValue = VerifyCert(this−>certData); // The verification is complete. // Schedule VerifyCertCFA2 scheduler−>schedule(this−>vcaCont); SwitchTo(MainFiber); }

  15. Hybrid Management Fiber-to-Continuation adaptor void FiberContinue(Continuation ∗cont) { if (!Fiber::OnMainFiber()) { // Manual stack mgmt code did not perform // I/O: just mark it as short-circuited FiberContinuation ∗fcont = (FiberContinuation) ∗cont; fcont−>shortCircuit = true; } else { // Resumed after I/O: simply switch // control to the original fiber Fiber ∗f = (Fiber ∗) cont−>arg1; f−>Resume(); } } Boolean GetCAInfoFCA(CAID caid) { // Executed on verifyFiber // Get a continuation that switches control // to this fiber when called on MainFiber FiberContinuation ∗cont = new FiberContinuation(FiberContinue, this); GetCAInfo(caid, cont); if (!cont−>shortCircuit) { // GetCAInfo did block. SwitchTo(MainFiber); } return cont−>returnValue; }

  16. Hybrid Management Wrapping up void VerifyCertCFA2(Continuation ∗vcaCont) { // Executed on MainFiber. // Scheduled after verifyFiber is done Continuation ∗callerCont = (Continuation∗) vcaCont−>arg1; callerCont−>returnValue = vcaCont−>returnValue; // “return” to original caller (FetchCert) (∗callerCont−>function)(callerCont); }

  17. Implementation • Farsite – File System • Windows NT • Originally event-driven • UCoM – Mobile Phone Application • Windows CE • Automatic stack management

  18. Implementation Cont… • Positive experience • Preempt subtle concurrency problems • Function wrapping is tedious • Possible to automate the wrapping

  19. Conclusions • Events vs. Treads debate clarified • Cooperative Threading • Automatic Stack • Cooperative Task • Hybrid adaptor may be used to interoperate between Manual and Automatic Stack • Cooperation between disparate programmers • Software evolution of conflicting code bases

More Related