Oh.... As to mmap, it is used to map a file to a process address space in the result that several processes can communicate with each other using this shared file memory. The process can access this file just as accessing the memory not using read/write system call.
On Mon, Nov 24, 2008 at 10:58 AM, Peter Teoh <[EMAIL PROTECTED]>wrote: > On Mon, Nov 24, 2008 at 7:29 AM, MinChan Kim <[EMAIL PROTECTED]> > wrote: > > I'm so late :) > > > > On Sun, Nov 23, 2008 at 4:17 PM, Wang Yu <[EMAIL PROTECTED]> wrote: > >> > >> > >> On Sun, Nov 23, 2008 at 2:23 AM, Rik van Riel <[EMAIL PROTECTED]> wrote: > >>> > >>> Peter Teoh wrote: > >>>> > >>>> when a process mmap() a section of a file into its own process memory, > >>>> the process memory will maintain a copy of the data of that section of > >>>> the file. > >>> > >>> No, it does not maintain a copy. > >>> > >>> It mmaps the page cache pages into its own address space. > >> > >> > >> According to your explanation, the flow is physical file(on > disk)-->Page > >> Cache(on memory, but in kernel space)-->Process Memory(on memory, but > in > >> user space). Is it? I am not sure.... > >>> > > > > Yes. When kernel find no page mapping, it allocate new page in page > > cache and copy from on-disk page to new page, then map the new page to > > user space address. > > so, Never duplication. > > > >>>> so...does there exists duplicated buffering? (one in kernel - > >>>> pagecache, and one in userspace - for mmap() content of the file in > >>>> process memory) > >>> > >>> No, there is no such double buffering. > >> > >> But what is the difference? Why linux do it? > > > > In case of read system call except O_DIRECT, It's duplication between > > user buffer and page cache. > > Read/write system call abstract page to file. so you always need user > buffer. > > Let think. If you want read some data, First of all you need some > > space which is user buffer. > > Mmap system call abstract page to memory. so you can handle file as > > memory operation without user buffer that mean It don't have > > duplication overhead. > > I see. So u are saying that read() will duplicate buffer between > userspace (user buffer) and kernel (pagecache), but for mmap() > operation, since there is no duplication, all access from user process > will immediate trigger a context switch, to read in the data from > ring0, right? > > Since u normally read in blocks of data using read(), and access data > byte-wise with mmap()'s pointer, so read() is much more efficient, as > it trigger much lesser context switches than mmap()'s way of pointer > accessing kernel memory? > > Performance-wise, mmap() will perform worst off than read()? > > Thanks. > > > -- > Regards, > Peter Teoh > > Ernest Hemingway - "Never mistake motion for action." > -- National Research Center for Intelligent Computing Systems Institute of Computing Technology, Chinese Academy of Sciences
