https://gall.dcinside.com/mgallery/board/view/?id=github&no=57769&page=1
비동기 io는 누가 완료 시켜주는거임?멀티 스레드 아니고 비동기 가능하다는데만약 파일 write_async()라는 함수가 있다면함수 실행 동안 프로그램은 다음줄부터 그 이하로 계속 실행(1)하는거임?그리고 파일 쓰기가 다 끝나면 누군가가 다시 write_gall.dcinside.com내가 아는대로 댓글에 싸질러봤는데 생각보다 글이 길어지고 두서없이 이야기하는거같아서 다시 써봄,,
사실 이게 정확히 맞는 내용인지 확신이 없어서 아닌거같으면 댓남겨주셈
일단은 IO 작업, polling 방식만 이야기할꺼임 다른건 모름
먼저 blocking 간단히 설명하자면 그냥 원래 쓰던 방식임
파일 쓰기 api 를 호출하면 파일 쓰기가 끝날때까지 호출한 스레드를 사용할 수 없음 (block)
작업이 끝나면 작업 결과와 함께 다시 스레드가 돌아감
non blocking api 는 호출 즉시 함수가 종료되고 스레드에서 다음 코드를 계속 실행할 수 있음
```
write_async(99999999999999);
print("next code");
```
이런 코드가 있다하면 쓰기작업이 끝나든말든 "next code" 가 바로 출력이 될꺼임
그럼 쓰기작업이 끝났는지 어떻게확인함? 쓰기작업이 성공한거임? 반환값은? 쓰기작업 끝난후에 다시 읽기작업도 필요한데??
non blocking 은 스레드를 멈추는 대신 각 작업을 고유하게 구분할 수 있는 id를 반환함. 나중에 쓰기작업의 결과를 알고 싶을때 이 작업 id를 확인해보면 됨
```
var task_id = write_async(9999999999);
// 동시에 처리하고 싶은 작업들
do_something();
// 쓰기작업 종료 후에 하고싶은 작업들
while (get_task_state(task_id) != COMPLETE) ;
var result = get_task_result(task_id);
do_another(result);
```
이런식으로 os 에서 작업 id를 통해서 작업 상태와 결과를 알려주는 api 도 따로 제공해줄거임
결과적으로 스레드 하나로 파일 쓰기 작업과 do_something() 작업을 동시에 할 수 있는거임
non-blocking api 를 여러번 호출하고 여러 작업을 하나의 스레드에서 전부 처리하는것도 가능함
```
for (i = 1 ~ 100)
{
tasks[i] = write_async(i);
}
while (true)
{
for (i = 1 ~ 100)
{
if (get_task_result(tasks[i]) == COMPLETE)
{
print(tasks[i] + " completed");
tasks.remove_at(i);
}
}
}
```
실제 구현은 운영체제마다 다른데 리눅스의 epoll 은 file descriptor 가 작업 id 역할을 하고, 윈도우의 iocp 는 completion port 가 작업 id 역할을 한다는거같음. (윈도우는 잘 모름)
자바스크립트는 런타임에서 non blocking io 작업들을 모두 관리함. 이벤트 루프마다 작업 상태와 완료 여부를 확인하고 완료된 작업이 있다면 함수호출할때 받은 콜백 함수를 태스크큐에 넣어주는거임. 결과적으로 큐에 들어있는것들이 메인스레드에서 처리되는거고
닷넷의 경우도 마찬가지로 런타임에서 작업들을 모두 관리함. 작업이 완료된다면 SynchronizationContext 에 따라서 다른 동작을 보이는데, 기본값은 닷넷 런타임이 관리해주는 ThreadPool 에서 스레드 하나 갖고와서 그걸로 콜백함수(ContinuteWith으로 넘어온거 혹은 await 이후 코드)를 실행함. GUI 앱이라면 스레드풀 대신 메세지 큐에 콜백 함수를 넣어줌
아마도 코루틴 고루틴 가상스레드 어쩌고하는것도 닷넷이랑 똑같은 방식일꺼임
정확하다 굳잡
나는 폴링이 아니라 인터럽트 발생하면 알아서 호출되도록 하는건줄알았는데 여기설명보면 전달받은 fd가지고 계속 일정 주기마다 확인하는것같네?
인터럽트가 성능이 더 좋지않음? 체크하는데 비용 소모하면.. 블럭킹 + 멀티스레드 컨텍스트 스위칭하는거랑 별반 다를거없을것같아서 <= 물론 이건 뇌피셜입니다.