brunch

You can make anything
by writing

C.S.Lewis

by 김은지 Jul 18. 2019

C# 비동기/병렬 프로그래밍 (1/2)

C# 은 그냥 짱이다.. 찬양하라! 갓C#! 

작년 이맘때쯤 개인 프로젝트를 하나 하려고 했었는데, C#에서 병렬 처리를 어떻게 하는지를 몰라서 막혀서 결국 포기했었던 기억이있다.

그래서 시간이 나면 꼭 병렬 프로그래밍 관련 공부를 해야겠다라고 마음을 먹었고 이번에 마침 시간이 좀 생겨서 각잡고 공부를 하게 되었다. 

아래의 링크를 통해 공부했는데, Microsoft에서 교육관련 담당하는 부서에서 만든 컨텐츠라 그런지 구성도 너무 좋고 최고다. 시간되시면 꼭 한번 참고하시기 바란다. 

https://courses.edx.org/courses/course-v1:Microsoft+DEV235x+2T2018/course/


각설하고 본론으로 들어가보자. 

우선 비동기란 무엇인가? 병렬은 뭐지? 이 두 키워드를 찾아보면 왜 항상 같이 검색되는거지? 어떤 연관이 있는걸까?

위의 코스를 공부해보기전에는 이 모든 개념이 다 뒤죽박죽이었는데 공부하고 난 후에는 훨씬 명확해졌다. 


비동기란 무엇인가 - 일을 동기로 처리하지 않는 다는 것이다. 

대게의 프로그래머들은 동기(Synchronous)적으로 프로그램을 만들고 있을 것이다. 

동기적으로 프로그램을 짠다는 것은 마치 글을 읽드시 위에서부터 아래로 내려오며 쭉 순차적으로 실행이 된다는 것이다. 


하지만 비동기가 필요한 순간들이 있다. 대표적으로 User의 입력을 받아야 하는 상황이나, 웹에서 어떤 결과를 가져와야 하는 순간! 

왜 이런 순간들에 비동기가 필요할까?

예를들어 User의 입력을 받아야 하는 경우, 이 경우를 동기적으로 프로그래밍 한다면 아마 이런 상황이 발생할 것이다. 흔히들 '컴퓨터 렉 걸렸다'라고 표현하는 상황

User 입력을 받기 전까지는 다음 줄로 넘어가 실행을 할 수 없기 때문에 그 상태 그대로 컴퓨터는 멈춰있는 것이다. 상상해봐라 얼마나 답답할까? 

그래서 이때는 비동기로 처리하는 것이다. 즉 동기, 실행되는 타이밍을 다 맞추는 것이 아니라  User 입력을 받는 부분은 다른 타이밍에 처리되는 것이다. 그 작업이 완료 된 이후에...


결국 다른 타이밍에 처리가 된다는 것은 현재의 실행흐름과 달라진다는 것을 의미한다. 

하나의 프로그램(좀더 엄밀히 말하면 프로그램이 메모리에서 실행중인 상태를 의미하는 "프로세스")에서 여러개의 실행흐름을 가질 수 있을까? 이때 등장하는 개념이 쓰레드(Thread) 이다. Thread란 말은 영어로 실가닥을 의미한다. 마치 여러 줄의 실가닥 처럼 동일한 프로세스가 여러개의 실행 흐름을 가질 수 있는 것이다. 

이러한 포인트에서 비동기와 병렬처리는 맥락을 같이한다. 

그래서 User 입력을 받아오는 부분은 잠깐 다른 흐름에서 처리되는 것이다. 


그럼 병렬에 대해서도 잠깐 살펴보자. 병렬은 비동기에 비해서 개념적으로 좀 더 쉽게 이해되는 것 같다! (나만 그런가?) 즉 같은 작업을 한놈(?)이 다 하는게 아니라 여러 명이 같이 하자!!는 것이다. 그럼 좀 더 일이 빨리 끝날 수 있으니까? 예를들어 내가 마늘을 까야하는데 혼자서 까는것 보다 가족이 4명이라고 하면, 4명이 같이 까면 끝나는 시간이 1/4로 줄어드는 것 처럼...


사실 이 병렬 프로그래밍이 가능하게 된 것도 컴퓨터의 발전과 관련이 있다. 듀얼코어? 쿼드코어? 이런말을 한번쯤 들어본 적이 있을 것이다. 즉 컴퓨터의 코어가 여러개로 늘어감에 따라 일할 사람도 여러명으로 늘어단다는 뜻이다. 그래서 병렬로 처리되도록 프로그램을 개발하면, 여러개의 코어에서 일을 노나서 하기때문에 수행속도가 빨라지는 것이다. 


좋다. 그럼 C#에서 병렬 프로그램은 어떻게 짜는건데..?

2편에서 계속됩니다.... 씨유순 









 




작가의 이전글 나는 참 복받았다 - 다양성 관련 미팅에 참여한 후기 
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari