select 함수가 등록된 디스크립터들의 변화를 체크 하는데 그 디스크립터들이 변화하는 원리를 알고 싶습니다.
select()와 같은 함수는 일반 라이브러리 함수가 아니라
systemcall이기 때문에(정확히는 systemcall의 wrapper 함수)
함수를 수행하는 주체는 유저 프로세스가 아니라 커널입니다.
1. select() 호출하는 순간 해당 프로세스(쓰레드)의 상태는 wait가 됩니다. 그리고 이 후 제어권은 커널에게 넘어갑니다.
2. 커널이 모든 I/O를 관장하니까 변화를 감지하는건 당연히 할 수 있겠죠. 등록한 파일디스크립터에서 I/O가 일어날 경우 커널이 해당 프로세스(쓰레드)의 상태를 wait에서 ready로 바꿉니다.
3. 커널의 스케쥴링에 의해서 주어진 프로세스의 제어권이 돌아오면 프로세스의 상태는 다시 running으로 바뀌고 select()는 block상태에서 빠져나오게 됩니다.
만약 이해가 안되신다면 - process state - CPU 제어권 or CPU 스케쥴링 - interrupt 등 부터 공부하시면 도움될겁니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
select()와 같은 함수는 일반 라이브러리 함수가
select()와 같은 함수는 일반 라이브러리 함수가 아니라
systemcall이기 때문에(정확히는 systemcall의 wrapper 함수)
함수를 수행하는 주체는 유저 프로세스가 아니라 커널입니다.
1. select() 호출하는 순간 해당 프로세스(쓰레드)의 상태는 wait가 됩니다.
그리고 이 후 제어권은 커널에게 넘어갑니다.
2. 커널이 모든 I/O를 관장하니까 변화를 감지하는건 당연히 할 수 있겠죠.
등록한 파일디스크립터에서 I/O가 일어날 경우 커널이 해당 프로세스(쓰레드)의 상태를 wait에서 ready로 바꿉니다.
3. 커널의 스케쥴링에 의해서 주어진 프로세스의 제어권이 돌아오면 프로세스의 상태는
다시 running으로 바뀌고 select()는 block상태에서 빠져나오게 됩니다.
만약 이해가 안되신다면
- process state
- CPU 제어권 or CPU 스케쥴링
- interrupt
등 부터 공부하시면 도움될겁니다.
댓글 달기