반응형

진짜 헷갈리는거 이 4개 오늘 끝판낸다. (OS관점)

 


실생활 관점

 

동기(Synchronous)

너 나랑 일 "같이 끝"내고 다음 일은 "같이 시작"해야해. 기다려.

이 개념의 순수한 의미는 "같은 시간"이라는 의미다. 뭐가 같은 시간이냐? 일 완료하는 시점이 같은 시간이라는 것이다. 예를 들어 "로미오"은 핫도그룰 굽고 "줄리엣"은 핫도그에 소스를 뿌려 진열대에 놓는 일을 한다고 해보자. 동기식에서는 "로미오"가 핫도그를 굽는 것을 끝마쳤으면 그것을 "줄리엣"에게 건넨다. 그럼 "줄리엣"은 소스에 뿌린다. 이 때 "줄리엣"이 소스를 뿌려 진열대에 놓는 시점이 "로미오"와 "줄리엣"의 작업 완료 시점인 것이다.

즉, "로미오"와 "줄리엣"은 작업 완료 시점이 동일하다. 이것을 약속한 것이 동기식이다. 따라서 "로미오"가 다음 일을 하려면 "줄리엣"의 작업이 끝났는지 안끝났는지 관심이 있어야한다. 더욱더 중요한건 이 의미는 "다음 작업의 시작 시점" 또한 "로미오"와 "줄리엣"은 항상 같을 수 밖에 없다. 작업 완료 시점이 똑같기 떄문이다.

 

 

비동기(Asynchronous)

사장님 퇴근하겠습니다.

작업 완료 시점은 같지 않아도 된다. 이 개념은 "같은 시간"을 지키지 않아도 된다는 것이다. 즉 "로미오"의 작업 완료 시점은 "줄리엣"이 소스를 다 뿌리고 핫도그 거치대에 놓는 그 순간이 아니라, 핫도그를 다 굽는 그 시점이 "로미오"의 작업 완료시점이다. "줄리엣"은 핫도그에 소스를 뿌려 진열대에 놓는 순간이 작업 완료 시점인 것이다. 여기서 중요한건 "로미오"는 "줄리엣"의 일에 관심이 없다. 그래서 "로미오"는 핫도그를 다 굽고나서 퇴근을 하던 주방청소를 하던 무엇이든 할 수 있다. (OS관점에선 프로세스/스레드가 다른 Code를 수행할 수 있다)

 

 

 

Ok.. 그렇다면 Block과 Non-block의 차이점은

 

 

 

블럭(Block)

순수한 의미는 "막는"것이다. 그냥 막아버리는 것이다. 여기서 중요하다 "막는"다는 것은 뭔가? 즉 행동 제어권을 없애 버린다는 것이다. 예를들어 동기식이던 비동기식이던 "로미오"와 "줄리엣"에서 "줄리엣"이 "로미오"를 Block한다는 것은 "줄리엣"의 행동 제어를 뺐는 것이다. 즉 멈춰버리게 하는 것이다. 여기서 멈춰버린다는 것은 "줄리엣"의 몸체를 멈춰버리겠다는 것이다.*오감각은 살아있다) (행동 제어권 = CPU 점유).

 

논블럭(Non-Block)

즉 막지 않는 다는 것이다. 비동기식이던 동기식이던 "로미오"가 "줄리엣"을 Non-Block하겠다는 건 "너 자유롭게 매우 자유롭게 행동해"라는 것이다.

 

 

 

즉, 비동기/동기는 방식이고 Block/Non-Block은 "한다" 이다.

ex) 비동기식 방식으로 저것을 Block 할거야.

 

 

 

자.. 그럼

헷갈리는거 들어간다

 

 

 

 

동기식 & 블럭

(작업완료시점은 같은데 행동제어권 뺐기)

"로미오"가 핫도그를 굽는 것을 완료해서 "줄리엣"에게 줬다. "줄리엣"이 말한다. "거기 STOP!, 너 내가 소스뿌리고 진열대에 올려놓기 전까지 가만히(얼음땡, 진짜 아무것도 못함) 있어!, 그리고 내가 완료하면 너도 집가는거야"

(친구 챙기는 스타일)

 

동기식 & 블럭

(작업완료시점은 같은데 행동제어권 안뺐기)

"로미오"가 핫도그 굽는 것을 완료해서 "줄리엣"에게 줬다. "로미오"는 다음 작업인 빈 소스통에 소스를 채우는 것을 할 수 없다. 왜냐하면 아직 "줄리엣"의 일이 끝나지 않았기 때문이다. 따라서 몸체는 움직일 수 없다. 하지만 눈은 굴릴 수 있다. 눈과 입은 움직일 수 있는 "로미오"는 말한다. "줄리엣, 끝났어?", 5초뒤 "줄리엣 끝났어? 나 다음작업 하고싶은데.. 얼른 이거 마치고 다음거 해야하는데.." 그래서 "줄리엣"의 일이 끝나는 것에 매우 관심있다. 그래서 소스를 채우면서 "줄리엣"의 일이 끝났는지 힐끔힐끔 볼 수 밖에 없다. (Polling)

(친구는 챙기긴하는데 자꾸 물어보는 타입)

 

동기식 & 블럭

(작업완료시점은 다르고 행동제어권 뺐기)

"로미오"는 핫도그를 다굽고 "줄리엣"에게 준다. "로미오"는 다 굽고 일이 끝났으니 주방가서 새로운 소스를 가져오려고 빈 소스통을 집었지만 "줄리엣"이 말한다. "거기 STOP! 나 이거 다 끝날 때까지 넌 못가",

"로미오"가 생각한다. 여기서 생각만한다. 육신은 움직일 수 없다. '아나 내일 다 끝났는데 왜 막는거야 관심도 없는데, 그래도 끝나면 알려주니까 기다리자' (Select)

(집갈려는 친구 붙잡는 스타일)

 

동기식 & 블럭

(작업완료시점은 다르고 행동제어권 안뺐기)

"로미오"는 핫도그를 다굽고 "줄리엣"에게 준다. "로미오"는 다 굽고 일이 끝났으니 새로운 소스를 가져오려고 빈 소스통을 집어서 소스를 채우거나 핫도그를 다시 굽는다. "줄리엣"은 소스를 뿌리고 진열대에 놓는다. 그걸 본 "로미오"는 그 핫도그를 손님에게 건넨다.

(가장 정없는 스타일, 근데 효율적임)

 

 

주목해야할점

동기식 & 블럭

굉장히 효율적이다. "로미오"는 핫도그를 굽자(작업완료)마자 다른 일을 할 수 있다.(행동자유)

- 하지만 만약 "로미오"가 작업을 끝나자마자 그 다음 작업인 핫도그를 계속 굽는다면?? 핫도그가 쌓이게 될 것이다.  뭔가 "줄리엣"가 몇명 더 있다면 매우 좋을 것이다. (I/O장치 or 버퍼를 여러개 놓기 in OS)

- 또한 "로미오"가 여러명이 있다면 얼마나 좋을까? 어차피 비동기식 논블럭이기 떄문에 자유로우니까 핫도그를 매우 많이 구울 수 있을 것이다. (멀티프로세스 / 멀티스레드 in OS)

 

동기식 & 블럭

이 부분을 다시 살펴보자.

"로미오"가 생각한다. 여기서 생각만한다. 육신은 움직일 수 없다. '아나 내일 다 끝났는데 왜 막는거야 관심도 없는데, 그래도 끝나면 알려주니까 기다리자'.

여기서 중요한 지점은 "로미오"는 생각은 자유롭게 할 수 있다. 즉, "로미오"는 다음과 같이 생각할 수 있다. '어 근데 보아하니 "홍길동"이 소스를 다 뿌렸네? 음 오케이 이거 마저 기다리고 "홍길동"한테 간다.' 즉 "로미오"는 생각과 오감각은 살아있기에 다음에 어떤 애들이 소스를 다 뿌리고 안뿌렸는지 에 대한 눈으로 훑을 수 있다. (감지할 수 있다) (Select 개념, "줄리엣"과 "홍길동"은 File descripter에 해당한다.) 당연히 "줄리엣"이 끝나면 "홍길동"을 위한 다음 작업으로 할 수 있게된다.

 


이제부터 OS관점, OS용어적으로 생각해보자.

 

 

OS관점

OS관점에서 "로미오"는 Process/Thread이 되겠고 "줄리엣"는 Kernel (I/O) 쪽이라고 생각해보자.

시간나면 추가로 정리하겠다.

 

 

 

 


참고

Boost application performance using asynchronous I/O

https://developer.ibm.com/articles/l-async/

 

블럭,논블럭,동기,비동기 이야기  

https://okky.kr/article/442803

 

동기와 비동기, 그리고 블럭과 넌블럭

https://musma.github.io/2019/04/17/blocking-and-synchronous.html

 

입출력 다중화

https://www.joinc.co.kr/w/Site/system_programing/File/select

 

I/O모델들과 I/O 멀티플렉싱(select)

https://simsimjae.tistory.com/129

 

Socket에서 select사용하기

https://ospace.tistory.com/147

 

 

 

반응형