Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back

TIL 6장. 동시성

#pragmatic
3년 전
1,004
1

오늘 TIL 3줄 요약

  • 세상은 비동기적이므로 동시성은 필수다!

  • 동시에 진행할 수 있는 작업, 즉, 독립적인 작업들을 찾을 수 있도록 분석하는 작업이 필요하다.

  • 공유할 수 있는 데이터는 언제나 문제가 된다. 세마포어, 액터, 칠판과 같은 해법을 사용해보자.

TIL (Today I Learned) 날짜

2022.03.30

오늘 읽은 범위

6장. 동시성

책에서 기억하고 싶은 내용을 써보세요.

  • ‘동시성’은 둘 이상의 코드 조각이 실행될 때 동시에 실행 중인 것처럼 행동하는 것이다. 그리고 ‘병렬성’이란 실제로 동시에 실행되는 것이다.

    동시성을 얻으려면 실행 중에 코드의 다른 부분으로 실행을 전환할 수 있는 환경에서 코드를 구동해야 한다. 병렬성을 얻으려면 두 가지 일을 동시에 할 수 있는 하드웨어가 필요하다. -241p

  • 여러분의 애플리케이션이 실제 세상을 다루기 원한다면 동시성은 필수다. 세상은 비동기적이기 때문이다. -242p

  • 우리는 동시성을 확보해야 한다. 시간이나 순서에 의존하는 시간적 결합을 끊는 방법을 생각해 내야 한다. 결과적으로 분석하기 더 쉽고 응답속도도 더 빠르며 더 안정적인 시스템을 만들 수 있을 것이다. 많은 프로젝트에서 설계 과정의 일환으로 애플리케이션의 작업 흐름을 모델화하고 분석하는 작업이 필요하다. 우리는 동시에 일어나도 되는 게 뭐고, 반드시 순서대로 일어나야 하는 건 어떤 것인지 찾아내길 원한다. - 244p

  • 동시성은 소프트웨어 동작 방식이고, 병렬성은 하드웨어가 하는 것이다. 우리에게 여러 개의 프로세서가 있다면, 그리고 작업을 프로세서들에게 나누어 줄 수 있다면 전체 소요 시간을 단축할 수 있다.

    이런 식으로 나누기에 가장 이상적인 것은 비교적 독립적인 부분 작업들이다. 다른 부분 작업을 기다릴 필요 없이 진행할 수 있으면 좋다. 일반적인 형태는 커다란 작업을 독립적인 부분들로 쪼개서 병렬로 각각 처리한 다음, 결과를 합치는 것이다. -248p

  • 세마포어는 단순히 한 번에 한 사람만이 가질 수 있는 무언가다. 여러분은 세마포어를 만들어서 다른 리소스의 사용을 제어하는 데 쓸 수 있다. - 251p

  • 수정 가능한 리소스를 공유하는 애플리케이션 코드 어디에서나 동시성 문제가 발생할 수 있다. 여러분 코드의 인스턴스 둘 이상이 파일, 데이터베이스, 외부 서비스 등 어떤 리소스에 동시에 접근할 수 있다면 여러분은 잠재적인 문제를 안고 있는 것이다. - 256p

  • 시스템이 저장하는 상태는 오직 메시지 그리고 각 액터의 지역 상태뿐이

    다. 메시지는 수신자가 읽는 것 외에는 확인할 방법이 없고, 지역 상태는

    액터 바깥에서는 접근이 불가능하다. 모든 메시지는 일방향이다. 액터는 각 메시지를 끝날 때까지 처리하고 중간에 다른 일을 하지 않는다. 즉, 한 번에 하나의 메시지만 처리한다.

    그 결과 액터들은 아무것도 공유하지 않으면서 비동기적으로 동시에 실행된다. - 260p

  • 액터 모델에서는 동시성을 다루는 코드를 쓸 필요가 없다. 공유된 상태가 없기 때문이다. 명시적으로 처음부터 끝까지 “이걸 한 다음 저걸 하라”는 코드를 쓸 필요도 없다. 액터가 수신하는 메시지에 따라 알아서 실행되기 때문이다. - 265p

  • 일종의 ‘자유방임주의’적 동시성이다. 각 형사는 독립된 프로세스, 에이전트, 액터 등과 같다. 누군가는 칠판에 수집한 사실을 붙이고, 누군가는 떼어 낸다. 사실을 조합하거나 처리할 수도 있고 더 많은 정보를 덧붙일 수도 있다. 칠판은 사람들이 서서히 결론에 도달하도록 돕는다. - 268p

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

  • 책에서 언급한대로, 세상은 비동기적이므로 동시성을 고려하지 않을 수 없다. 동시성을 고려하지 않아도 되는 작은 규모의 프로그램을 작성하는 방식으로 실제 세상에서 사용하는 프로그램을 작성했다고 가정해보면, 생각만 해도 끔찍하다. 매우 느리고, 매우 불안정할 것이다.

  • 동시성 프로그래밍을 했던 경험 중 가장 기억에 남는 건 예전에 위키피디아 데이터를 크롤링했을 때다. 인턴을 할 때 위키피디아 데이터를 이용해 개체명 태깅 사전을 구축해야 하는 과제를 부여받아, 위키피디아에 존재하는 모든 단어를 크롤링하면서, 상위의 카테고리도 계속 연결지어줘야 했었는데, 많은 사용자들이 계속해서 새로운 정보들을 추가하는 곳이다보니 순차적으로 프로그램을 짜서는 오래 걸릴 것이 분명했다. 더군다나, 처음에는 데이터를 어떻게 크롤링하는 것이 맞을지에 대한 생각도 정립이 안 되어서 여러 번 시도해봤어야 했는데, 그러면 문제는 더 심각해진다. 그래서 그 때 수업 때 배우긴 했지만 직접 써 본 적은 없는 멀티쓰레딩과 멀티프로세싱을 써보기로 했다. 동시에 진행할 수 있는, 즉 독립적인 일들을 찾아서 병렬적으로 진행할 수 있게끔 코드를 작성하는 것보다, 여러 쓰레드, 프로세스가 동일한 데이터에 접근한다는 것이 골치 아픈 문제였다. 책에서는 진열장을 예시로 들었고, 예전에 본 어떤 웹사이트에서는 냉장고를 예시로 들었으며, 그 때 내 코드에서는 방문한 페이지를 담는 큐였다. 그 때 나는 그 문제를 세마포어를 이용해 해결했었다.

  • 책애서 언급된 액터, 칠판의 개념은 간단하면서도 효과적인 해법인 것 같다. 물론 직접 써보기 전까지 간단하다는 말은 못 꺼내겠지만... 현재 구상하고 있는 프로젝트들을 직접 구현하려면 많은 데이터가 필요할 것 같은데, 그 때 한 번 직접 써봐야겠다. 아무튼 챕터 내내 여러 비유적인 표현들을 활용해 설명해준 덕분에 이해는 더 잘 된 것 같다.

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

오늘 읽은 다른사람의 TIL

1 comment