2023. 2. 10. 19:35ㆍ기술 창고/정보 창고
Blocking IO
Blocking IO 란 IO 프로세스가 시작한 작업이 진행되는 동안 다른 작업은 중단한 상태로 진행 중인 IO 작업이 끝날 때까지 대기하는 방식을 뜻한다,
Blocking IO 에 관한 자료를 찾다보니 가장 흔한 이미지가 위의 사진이였다.
사진을 보면, Read() 함수가 호출이 되면 해당 함수가 완전히 끝날 때까지 다른 작업을 수행하지 못한다.
Non-Blocking IO
Non-Blocking IO 는 한 프로세스가 IO 작업을 호출했을 때 IO 작업이 완료될 때까지 작업을 중단하지 않고 IO 호출에 대해 즉시 리턴한 뒤, 해당 프로세스가 이어서 다른 IO 작업을 수행할 수 있도록 하는 방식을 뜻한다.
Non-Blocking IO 는 한 프로세스가 작업을 진행할 때 즉시 커널 쪽에서 어플리케이션에 바로 응답을 한다.
이 때 프로세스는 계속해서 진행되는 상태이다.
어플리케이션에 바로 응답이 도착했기 때문에 어플리케이션은 다른 프로세스 작업을 수행할 수 있게 된다.
어플리케이션은 다른 작업들을 수행하다가 중간마다 시스템 콜을 보내 IO 작업이 수행 완료되었는지 커널에게 확인해보고, 완료가 되었다면 해당 IO 작업을 완료한다.
이미지를 보면 Read() 함수가 호출(시스템 콜)이 되고 난 이후에 바로 커널에서 어플리케이션으로 응답을 해준다.
이 때 어플리케이션은 응답을 받았기 때문에 작업 제어권은 어플리케이션에 있는 상태이며 따라서 다른 작업을 이어서 진행할 수 있다.
이후에 해당 작업들을 수행하면서 중간중간에 작업 완료가 되었는지 확인을 하고 완료가 되었다면 정상적으로 완료시킨다.
# Blocking 과 Non-Blocking 의 차이는 호출되는 IO함수가 바로 리턴하여 제어권을 어플리케이션에 넘기느냐 아니면 바로 리턴하지 않아 커널 쪽에서 제어권을 가지고 있느냐의 차이이다.
ㄴ Blocking 은 바로 리턴하지 않고 IO 작업이 완료될때까지 제어권을 커널 쪽에 넘긴 상태이다. (제어권을 넘겨서 block)
ㄴ Non-Blocking 은 바로 리턴하여 어플리케이션한테 다시 제어권이 돌아온 상태이다. (제어권을 돌려받아서 non block)
이 Blocking IO 와 Non-Blocking IO 가 동기(synchronous) , 비동기(asynchronous) 와 비슷하다고 하여 똑같다고 생각할 수 있으나 엄연히 다른 개념이라고 한다.
동기 (synchronous)
프로세스의 작업을 직렬화하여 수행하는 방식이다.
즉, 한 작업이 완전히 수행될 때까지 다른 작업들은 대기 상태이고, 완전히 완료가 되었다면 이어서 다른 작업이 수행되는 형식이다.
# 요청을 보내고 반드시 응답을 받아야 다음 작업을 수행하는 형식
비동기 (asynchronous)
프로세스의 작업을 병렬화하여 수행하는 방식이다.
즉, 여러 작업을 동시에 수행하는 상태이다.
# 요청을 보내고 반드시 응답을 받을 필요없이 다음 작업을 동시에 수행하는 형식
[동기 / 비동기 참고 글]
https://jindevelopetravel0919.tistory.com/87
여러 자료에서 동기/비동기, Blocking IO/Non-Blocking 의 차이를 말하고 있다.
- blocking : 작업을 요청하면 일단 요청한 쪽은 일단 block이 되고, 작업이 완료가 된후에 응답을 받을수 있음. 그렇기에 완료가 되기 전에는 요청한 쪽은 block이 되어 다른 작업을 수행하지 못함.
- non-blocking : 작업을 요청하면, 즉시 응답이 돌아옴
- 동기(sync) : 작업을 요청한 측에서 작업의 완료 여부를 체크함.
- 비동기(async) : 작업을 요청 받은 측에서 작업의 완료 여부를 알려줌
혹은
- blocking : wait queue 에 들어가고, 시스템 콜이 완료된 후에 응답을 보냄.
- non-blocking : wait queue 에 들어가지 않고, 즉시 리턴함. (응답 또는 에러코드)
- 동기(sync) : wait queue 에 머무는게 필수가 아니고, 시스템 콜의 완료를 기다림.
- 비동기(async) : 즉시 리턴하고, 시스템콜의 완료을 기다리지않음
이렇게 구분을 한다고 보면 될 것 같다.
비동기와 Non-Blocking 의 경우 비동기는 병렬적으로 작업을 수행하고 이때 여러 작업이 같은 시점에 동시에 수행할 수도 있지만 Non-Blocking은 한 작업의 시스템 콜을 보내면 바로 응답을 돌려받고 이 때 다른 작업을 이어서 할 수 있다는 차이점을 확인할 수 있는데, 개인적으로 동기와 Blocking의 명확한 차이점이 아직까지 잘 이해가 되지 않는다.
이후에 다시 추가 정리할 필요가 있을 것 같다.
[도움받은 출처 글]
https://etloveguitar.tistory.com/140
'기술 창고 > 정보 창고' 카테고리의 다른 글
포트 포워딩 적용 / 해제 (1) | 2024.01.02 |
---|---|
transferTo 사용 시 중복 업로드 불가 (+ 해결 방법) (0) | 2023.11.13 |
프로세스 (Process) / 스레드 (Thread) (0) | 2023.01.23 |
Stateful / Stateless (0) | 2023.01.09 |
사용자 패스워드 전송 및 보관 방법 (1) | 2023.01.06 |