• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

2번 multi thread 방법 질문

22.05.19 11:50 작성 조회수 116

0

각각의 thread가 다른 fd를 read하기에 blocking 영향을 받지 않는다로 이해했습니다.

그런데 fd가 사용하는 read API 동시에 여러개 사용되지 못하기 때문에 동일한 디바이스 드라이버의 read함수를 사용한다면 결국은 한번에 하나의 fd만 읽을 수 있는 것 아닌가여?

답변 1

답변을 작성해보세요.

0

안녕하세요. Gone님

각각의 thread가 다른 fd를 read하기 때문에 blocking 영향을 받지 않는다고 이해하셨다고 하셨는데요, 저는 이 말을 잘 이해하지 못하겠습니다.ㅠ

I/O multiplexing은 여러 thread가 서로 다른  fd를 read하고 있는 것이 아닙니다. 기본적으로는 한 프로세스가 여러 fd에 대해 read할 수 있도록 하는 것입니다. fd에 read를 하면 blocking 됩니다. 즉, read 할 것이 있을 때가지 대기하는 것입니다. read할 것이 생기면 해당 데이터를 읽어들이며 read 함수에서 리턴하게 되구요.

select 등의 I/O multiplexing 함수는 다르게 동작합니다. read하고 싶은 fd들을 등록해두고 select()를 호출하면,  등록해둔 fd들 중에 read할 것이 생기면 그 때 select()에서 리턴하게 되고, 어떤 fd냐의 정보를 보고 해당 fd에 대해 read하면 곧바로 리턴하게 됩니다. 여기에서 select()에 등록한 여러 fd에 대해 여러 thread가 대기하고 있는 것이 아닙니다. select()를 호출한 사용자 프로세스는 하나인 것이고, 여러 fd에 대해 읽을 것이 있는지 기다리는 것은 리눅스 커널이 해주는 일입니다. 사용자 프로세스와는 관계가 없습니다.

디바이스 드라이버의 read ops는 디바이스 드라이버마다 다르게 동작합니다. 따라서 디바이스 드라이버의 종류에 따라 한 프로세스만 read할 수 있는 것도 있고, 여러 프로세스가 동시에 read할 수 있는 것들도 있습니다.

질문에 대한 답변이 됐는지 모르겠네요. 답변이 너무 늦어져 죄송합니다. 추가 질문 있으시면 댓글로 남겨주세요. 감사합니다!