2017-11-20 16 views
1

tutorial for libuv에 따르면 후속 호출을 uv_write으로하면 다른 쓰기를 차단하는 쓰기가 발생하지 않아야합니다. (내 이해는 개별 스레드에서 발생한다고 생각했습니다.)
그러나 strace 아래의 예제 코드를 실행했으며 이것이 사실이 아닌 것으로 보입니다. uv_fs_write을 사용하여 유사한 예제를 실행하면 각 쓰기 호출이 개별 스레드에서 발생하고 차단되지 않음을 알 수 있습니다.uv_write가 실제로 비동기입니까?

누군가가 예상 동작이 uv_write이고, 기본 스트림이 파일 핸들 일 때 uv_fs_write과 다른 것으로 가정하면 설명 할 수 있습니까?

cat Makefile | strace ./uvtee/uvtee ~/out.txt 

open("/home/james/out.txt", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 11 
ioctl(11, FIONBIO, [1])     = 0 
epoll_ctl(6, EPOLL_CTL_ADD, 7, {EPOLLIN, {u32=7, u64=7}}) = 0 
epoll_ctl(6, EPOLL_CTL_ADD, 9, {EPOLLIN, {u32=9, u64=9}}) = 0 
epoll_ctl(6, EPOLL_CTL_ADD, 0, {EPOLLIN, {u32=0, u64=0}}) = 0 
epoll_wait(6, [{EPOLLIN|EPOLLHUP, {u32=0, u64=0}}], 1024, -1) = 1 
brk(0xb3e000)       = 0xb3e000 
read(0, "examples=\\\n\thelloworld\\\n\tidle-ba"..., 65536) = 1965 
write(1, "examples=\\\n\thelloworld\\\n\tidle-ba"..., 1965) = 1965 
write(11, "examples=\\\n\thelloworld\\\n\tidle-ba"..., 1965) = 1965 

전체 코드는 here입니다.

+0

해결했습니다. 이제 조금 더 명확하게 바라기를 바랍니다. – js7222

+0

링크 된 예가 관련 예입니까? 그것은 마치 파이프처럼 파일을 처리하는 것처럼 보입니다. 정규 파일을 참조하는 파일 설명자에서 uv_pipe_open()을 호출합니다. 이는 질문의 요점을 우회하는 것처럼 보입니다. – nos

+0

죄송합니다. 예에서는 파이프를 사용하여 파일 핸들을 추상화합니다. 파이프를 사용하여 파일을 처리하고 uv_write를 호출하는 것이 uv_fs_write를 사용하는 것과 다른 동작을 할 것으로 예상되는지 여부를 정말로 알고 싶었습니다. uv_write_write는 쓰레드가 쓰기를 위해 생성되는 반면, uv_write는 동일한 쓰레드에 쓰도록 순차적 인 호출을하는 것처럼 보입니다. – js7222

답변

0

fs 작업은 스레드 풀에서 실행됩니다. 이는 파일에 대해 비 차단 입출력을 수행 할 수있는 유용하고 이식 가능한 방법이 없기 때문입니다. 우리는 쓰레드 풀을 사용하기 때문에 쓰기 작업을 병렬로 수행 할 수 있습니다. 그래서 uv_fs_write는 오프셋 매개 변수를 취하므로 여러 threas가 서로 위에 밟지 않고 쓸 수 있습니다.

이 예외적 인 예외는 macOS입니다. 여기서 전역 잠금은 uv_fs_write 작업을 직렬화하는 데 사용됩니다.

이제 네트워크 IO는 완전히 다릅니다. 우리는 이벤트 루프를 사용한다. (알다시피) ans 쓰기 연산은 대기열에 넣어 지므로, 보내진 순서대로 그리고 의존하지 않는 소켓이 쓰기 가능할 때 쓰여질 것이다.