In practice, when input is handled asynchronously, how often is it really possible for the task to continue to perform meaningful work without actually having the input available to it?
The authors argue that lack of closure support in C++ forces developers to do a lot of manual stack management. However, there are several high-quality closure implementations available for C++: Does this weaken the effectiveness of their argument? How much of the work presented here is simply an effort to work around deficiencies in the target language rather than deficiencies in the event- and thread-based models?
How does the use of the adapters described in section 4 affect the ability of the programmer to debug problems that call code through these adapters?
Does the Pinning Pattern imply that the same I/O operation could be repeated an arbitrary number of times? If so, is this a reasonable thing to do?
What is the importance of the short circuit branch in the wrapper?
Why would mixing event-driven programming and thread-based programming be a good idea?
Can there be other combinations of task and stack management? Is it possible to construct a programming scheme by randomly picking a task/stack management styles? What happens with the combination of preemptive task management with manual stack management?
Can you explain more about the "pinning pattern" technique that they use to avoid the need to block on I/O? Does it have any special drawback?
In order to achieve cooperative task management with automatic stack management, all I/O must be asynchronous to work in this model. Could you explain the reason? I am a little confused about this part.
Considering all of the work they have done in wrapping I/O functions would you say that the ease of implementation is closer to the event-driven or multithreaded systems?
To benchmark the cooperative task management implemented on two systems to other operating systems the authors use the following sentence: "Our experience with both systems has been positive and our subjective impression is that we have been able to preempt many subtle concurrency problems by using cooperative task management as the basis for our work." What could be the types of statistics comparing cooperative task management to the event-driven and multithreaded systems that someone interested in implementing cooperative task management would like to see?
Why do we need to change the manual stack management in even-driven programming to the automatic stack management?
In the discussion on manual stack ripping, the authors discuss having to rip up the call graph to the point where a rip/split/continuation is already in place as soon as a blocking call is entered in to a function. Is there any other way of dealing with this? Or is this specific just to languages like C/C++ ... if an explicit 'continuation' facility exists in a language.
"fibers", mentioned in Section 4, are coined by the authors or already known?
The authors stated rather explicitly how their vision differs from the Lauer and Needham definition of event and thread models. Given that there is an almost 30 year gap between the two, it is clearly not due to the papers being contemporary and thus referring each other. Why do you suppose they had to make such a stark statement?
The "Pinning Pattern" used avoid concurrency problems in system loops over all the functions using a pinned resource and restarts the execution until it finds a path of executed functions where no function yields. This solution appears to be inefficient in terms of time. Are aware of any other solutions dependent on the restart mechanism but using some heuristics?
While the adaptors show that the two paradigms can work with each other in the same code, where would you do something like this, other than an academic paper such as this?
What particular advantages does cooperative task management have over regular threaded programming? Is cooperative task management just a fancy name for a scheduling system that essentially lets tasks run to completion? How are co-routines similar/different than CTM as described by the paper?
If we use C++ to program, what is the manual stack management to yield for I/O operations?
What are the potential disadvantages of this scheme ?
How does the "Pinning Design Pattern" , mentioned in the paper work ? How would it be used with common forms of IO like secondary storage, user input or network input ?
Does this hybrid approach really meet that "sweet-spot" described in figure 1? To me it seems more like it just makes a big bubble and covers all three ares instead.
It seems their goal is not performance....but: What is the overhead of one of those Fiber-to-continuation or continuation-to-fiber adaptors?
Given the fact that many current operating systems use automatic stack management for most of their subcomponents, could we consider it better for a cooperative program (i.e. a program that uses cooperative task management) that needs to interact closely with the OS (through system calls for instance) to go with the flow of the operating systems and follow its model ? Could keeping the same model as the OS save all of the overhead induced by the adaptors presented in the paper ?
This maybe branching out and not quite relevant to the paper, but what are tail calls and how does manually optimizing them away lead to an untraceable stack?
In class Buck brought up one important point from the paper not
covered in the slides:
"Stack Ripping" represents a significant
problem in the context of evolving software (ie software that is
modified) using the event driven model. When adding code that blocks
a continuation must be used to prevent the entire event system from
blocking. Since this now mean that the calling function is returning
early (ie without its I/O completed) every function above it on the
call graph must also have a continuation. The system in the presented
paper solves this problem by transparently switching away from the
event model prior to any blocking I/O.