Filllock bufferwait for signal:write_readyyesis buffer full?nowrite datasignal:readyyesfree space>=data sizenounlock bufferDrainlock bufferwait for signal:read_readyyesis buffer empty?noread datasignal:write_readyyesbuffer data>=requestednounlock buffer