1. A method of data communication between a first virtual machine and a second virtual machine, the method comprising: copying data from the first virtual machine to a first queue, the first queue being configured to receive the data from the first virtual machine, the first queue having a first header section and a first data section, the first queue header being write protected and configured to store a tail pointer that points to an end of the data in the first queue data section; updating the tail pointer in the first header section, wherein the update of the tail pointer causes a page fault; and handling the page fault through a page fault handler, the handling includes copying the data from the first queue to a second queue, the second queue being a shadow copy of the first queue and configured to receive a copy of the data and to allow the second virtual machine to access the copy of the data, wherein, the second virtual machine is executing in a record/replay mode.