2016-08-16 2 views
0
내가 리눅스에 write() 시스템 호출을 사용하여 파일에 데이터 버퍼를 작성하려고

에 리눅스 write 시스템 호출의 다른 결과를 가지고, 여기에 내가 쓴 사용자 공간 코드입니다. strace를 다른 버퍼

memset (dataBuffer, 'F', FILESIZE); 
fp = open(fileName, O_WRONLY | O_CREAT, 0644);  
write (fp, dataBuffer, FILESIZE); 

나는 하나 malloc()에서, 또 다른 하나는 mmap()에서이다, DataBuffer의 두 가지 유형을 시도했다.

그리고 커널 버퍼의 두 종류에 무엇을 할 것 인 볼 strace를 사용합니다. 대부분은 동일하지만, write()을 할 때 보았는데, 그들은 다르게 보입니다. 만약 write()의 파라미터가 다른 상술 볼 수있는 것처럼 mmap에에서의 malloc()

[pid 258] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 3 
[pid 258] write(3, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"..., 691200) = 691200 

버퍼()

[pid 262] open("/mnt/mtd/mmc/block/DATA10", O_WRONLY|O_CREAT, 0644) = 4 
[pid 262] write(4, 0x76557000, 691200) = 691200 

에서

버퍼는 하나 같이 "... FFFFF"인 나는 전에 memset하지만 다른 하나는 메모리 주소와 같다.

또한 첫번째 파라미터는 다른 제

이며 내 시스템에서 malloc() 버퍼로부터보다 빠른 mmap()이고, 하나는 3 다르다.

어떻게 그들이 다른 온? 누가 이렇게 다른 걸까요?

감사합니다.

업데이트 : 어떻게 측정합니까? malloc()은 빠릅니까?

내가 커널의 write() 내부 깊숙한 곳을 추적하고 write()의 마지막 단계를 확인하면 iov_iter_copy_from_user_atomic()입니다. 이것이 실제 메모리 복사 작업이라고 생각합니다.

그럼 난 측정하는 gettimeofday()을 사용하는 시간의 malloc/mmap에 버퍼의 iov_iter_copy_from_user_atomic() 비용.

+0

어떻게 malloc()이 더 빨라 졌는지 측정 했습니까? –

+0

내가 – Eason

+0

이 당신이 시스템 호출에 의해 소요되는 시간을 볼 수 있도록 타임 스탬프를 보여줄 것'strace' 옵션이 아닌 시간을 측정 어떻게 업데이트 FrankMeerkötter @? – Barmar

답변

-1

나는 버퍼의 끝에 후행 0 바이트 거기 여부를 확인하는 것 같아요. 있는 경우 데이터가 문자열이고 따옴표로 표시한다고 가정합니다. 그렇지 않은 경우 주소 만 표시됩니다.

malloc()의 버퍼가 mmap()보다 빠른 이유를 생각할 수 없습니다. memset()을 호출하면 두 메모리의 메모리가 모두 RAM에 저장되므로 write()은 메모리에 아무것도로드 될 때까지 기다릴 필요가 없습니다.

관련 문제