본문 바로가기

프로그래밍 실력쌓기

Block, None Block, 동기, 비동기, 멀티스레드, 배타제어





Block, None Block, 동기, 비동기, 멀티스레드, 배타제어




1. 프로세스와 스레드의 차이


각각의 스레드는 메모리 공유가 됩니다.

각각의 프로세스는 메모리 공유가 되지 않습니다. 그렇기 때문에 통신을 하게 됩니다.

Redis나 MemcacheD같은 메모리 디비를 하나 놓고 그곳을 통해 메모리를 공유하기도 하고

DB에 저장하고 공유 하기도 합니다.


공유메모리, 무슨무슨큐, 이것저것 있는데 안쓰는게 정신건강에 좋을듯...


프로세스끼리 통신이 가능하고 메모리 공유가 가능해지면 물리적인 머신을 여러대 놓고 사용할수 있게 되니깐 부하분산도 시킬수 있고 좋죠. 대신 쉽진 않겠죠.





2. Block, NonBlock


어떤 함수가 있습니다. 그 함수를 호출했을때 그 함수가 


모든 동작을 완료하고 다음 코드를 실행시킨다면 Block,

동작을 완료 하지 않아도 다음코드를 실행시킨다면 NonBlock.


(이렇게 설명을 해도 될지 모르겠습니다.)


그렇기 때문에 


Block이 되는함수는 영원히 Block 되지 않기 위해 보통 Timeout 시간을 인자로 받습니다.


NonBlock함수는 완료하지 않고 다음코드들이 실행되기 때문에 실제로 그 함수가 종료됨을 알리는 콜백함수를 인자로 받습니다.







3. 동기, 비동기


하아.. 이건 어떻게 설명해야 될지 도저히 모르겠습니다. 능력부족...OTL


뽕맞은 설명을 한번 써보면 동기는 두가지 이상이 서로 맞물려서 돌아간다는 얘기고


비동기는 서로 상관없이 돌아간다는 얘깁니다.


MySQL Replication으로 예를 들어보면 (MySQL Replication은 마스터디비에서 일어난 일을 슬레이브디비에도 전달해줘서 결국엔 같은 디비가 두개가 되는 기능을 말합니다. 부하분산, failover에 사용합니다.)


마스터 디비에 row를 하나 추가하면 슬레이브 디비에도 row가 하나 추가되는데

이때 마스터 디비에 row가 추가되고 슬레이브 디비에도 row가 추가됐음을 확인하고 row추가 요청에 대한 성공을 보내면 동기방식입니다.



마스터 디비에 row가 추가되고 슬레이브 디비에 추가되던지 말던지 성공을 보내면 비동기입니다. 능력 부족 ㅠㅠ



동기 방식일때는 성공하던 실패하던 마스터디비와 슬레이브디비가 반드시 서로 일치할겁니다.

하지만 요청에 대한 리턴이 느릴겁니다. 둘다 확인 하고 리턴해야 되니까요.

대용량 처리에는 좀 불리하다고 볼수 있습니다.



비동기 방식일때는 리턴이 빠르겠죠. 

마스터디비만 확인하면 바로 리턴되니깐 하지만 데이타 불일치가 일어날수 있죠.

대신 대용량 처리에 좋습니다.


(MySQL은 비동기 방식을 지원합니다. 동기 방식은 없습니다. 반동기라는것은 있습니다.)


자신의 서비스에 맞게 잘 적용하는게 중요합니다.





4. 멀티스레드 + 배타제어


프로세스를 하나 만들면 스레드가 하나 생깁니다. 그걸 보통 메인스레드라고 부릅니다.

이 스레드 안에서 보통 UI에 대한 처리 + 기타등등의 처리들을 합니다.


그래서 이런 이해가 잘 없으면 하는 실수중에 하나가 새로 만든 스레드에서 UI로 접근할때 입니다.

메인스레드에서 UI로 접근을 하는데 다른스레드에서 또 접근하면 UI가 망가질수 있습니다.


그래서 C#은 메인스레드가 처리하도록 요청하는 코드를 넣습니다. 그렇지 않으면 아예 에러가 나버리죠.

C#은 메인스레드가 처리하도록 요청하는 함수가 있지만 만약에 없는 환경이라면 윈도우의 경우엔 윈도우 메세지를 보내서 처리하기도 합니다. 리눅스도 비슷한게 있는걸로 압니다.


다른 자원들도 마찬가지 입니다. 파일입출력, UI, 네트웍통신, 스레드끼리 공유하는 자원들, 등등의 것들은 조심히 다뤄야 합니다.


이런것들을 조심히 다루기 위해서 알아야 될것들이 


스레드에 관한 기초지식, Lock, Atomic Operation, 자료구조 등이 있습니다.


이것과 관련한 내용은


Java 언어로 배우는 디자인 패턴 입문 멀티 쓰레드 편 - YUKI HIROSHI


이란 책을 보시면 좋습니다.



어떻게 하면 공유하는 객체를 망가뜨리지 않고 가장 빠르게 동작시킬수 있는가가 관건인데


Lock으로 객체가 가지고 있는 모든 함수를 다 막아버리면 느리겠죠. 하지만 정신 건강엔 좋습니다.


추가적인 알면 좋은 키워드로는 

interlockedincrement, Lock-Free Queue, wait-free, reentrant등이 있습니다.