2016.11.22 10:18 Dev 개인 정리글










Reference

[1] Vert.x VS Akka (https://java.libhunt.com/project/vertx/vs/akka)

[2] Why we chose Akka for our cloud device solution(https://techblog.king.com/why-we-choose-akka-for-our-cloud-device-solution/)

[3] Difference in message-passing model of Akka and Vert.x(http://stackoverflow.com/questions/21481238/difference-in-message-passing-model-of-akka-and-vert-x)

[4] Interview with Tim Fox About Vert.x 3, the Original Reactive, Microservice Toolkit for the JVM (https://www.infoq.com/articles/vertx-3-tim-fox)

[5] Akka wiki (https://en.wikipedia.org/wiki/Akka_(toolkit))

[6] Vert.x wiki (https://en.wikipedia.org/wiki/Vert.x)



저작자 표시 비영리 변경 금지
신고
posted by 아틴
2016.11.17 20:02 Dev 개인 정리글

함수형 프로그래밍(functional programming)이나 리액티브 프로그래밍(reactive programming) 또는 함수형 리액티브 프로그래밍(functional reactive programming)에 대한 관심이 뜨겁다. 이러한 소프트웨어 패러다임에 있어서 늘 나오는 이야기는 비슷하다. 멀티 코어의 시대와 멀티 스레드 프로그래밍의 어려움과 문제점들이 이야기되고 모바일 시대와 IoT로 인해서 늘어나는 트래픽양이 이야기된다.


결론적으로 내가 내린 결론은 이러하다.

이러한 패러다임의 변화는 물론 개발의 편리성이나 이점들도 있지만 결국은 현대의 하드웨어에 맞춰서 소프트웨어의 성능을 최대한으로 끌어내기 위한 것이다. 성능의 중요성은 대형 서비스일수록 매우 중요하다. 페이스북이나 아마존 라인, 트위터에서 받는 트래픽 양을 생각해보아라.


결국 핵심은 멀티코어 하드웨어에서 어떠한 방법으로 소프트웨어의 성능을 최대한으로 끌어낼 것인가인데 여기서 "동시성(Concurrency"과 "병렬성(parallelism]"이 중요하다. 조금 더 구현적으로 상세하게 들어가면 "비동기(asynchronous)" 방식과 "논블로킹(non blocking"방식을 통해서 성능을 높이는 부분이 있고, 스레드의 상태를 공유하지 않고 복사하는 형태로서 멀티 스레드의 근본적인 문제점을 제거하는 형태가 있다.


그 결과물들로 뜨겁게 부상하고 있는 함수형 프로그래밍 스칼라가 있고, 리액티브 프로그래밍에서는 RxJava, Vert.x, Akka, Play framework 등이 있다.

로우 레벨과 하이레벨에 대한 부분을 잘 구별해야 한다. Vert.x의 경우 내부에서 이미 RxJava와 Netty를 사용하고 있다.


결국은 이런 이론적인 부분과 로우 레벨단에 대한 공부를 잔뜩 한 후에 Vert.x나 Akka를 쓰면 끝나는 문제가 아닐까 싶기도 하다.

그래도 Spring 5. 버전에서 리액티브 프로그래밍이 반영이 된다고 하니 리액티브 프로그래밍과 기초적인 내용을 잘 공부해두면 향후에 기술을 고를 때나 사용할 때 많이 유용할 듯 하다.




자극 (Motivation)

2가지 중요한 포인트가 있다. 두 가지 주요 변화는 다음과 같다.

  • 하드웨어의 발전
  • 인터넷


첫번째로 "하드웨어의 발전", 30년간 컴퓨터 성능은 무어의 법칙이 주도하였다.

하지만 무어의 법칙[1]은 깨졌고 현재는 암달[2]의 법칙이 주도하고 있다.


프로그래머가 별다른 노력 없이도 컴퓨터의 성능이 무어의 법칙으로 향상되고 있었는데

무어의 법칙이 깨진 것에 대해서 Herb Sutter라는 사람이 한 말은 유명하다.


공짜 점심은 끝났다
- 어브 써터(Herb Sutter) -


두번째로 인터넷 트래픽의 증가이다. 

스마트폰으로 인하여 모바일 트래픽은엄청나게 증가했다. 그리고 지금은 IoT로 인한 트래픽까지 증가하고 있다.

이 전과 비교하면 인터넷 트래픽이 엄청나게 증가하였고 이에 따라서 성능의 중요성 또한 이전보다 훨씬 중요하게 되었다.




무어의 법칙


무어의 법칙[1]은 반도체 집적회로의 성능이 18개월마다 2배로 증가한다는 법칙

  • 메모리의 용량이나 CPU 속도가 18개월에서 24개월마다 2배씩 향상된다는 '기술 개발 속도에 관한 법칙'
  • 컴퓨팅 성능은 18개월마다 2배씩 향상됨
  • 컴퓨팅 가격은 18개월마다 반으로 떨어짐



암달의 법칙(Amdahl's law)



  • 암달의 저주[2]로도 불림
  • 컴퓨터 시스템의 일부를 개선할 때 전체적으로 얼마만큼의 최대 성능 향상이 있는지 계산하는 데 사용
  • 병렬 컴퓨팅에서 멀티 프로세서를 사용할 때 프로그램의 성능향상은 프로그램의 순차적인 부분에 의해 제한됨
  • 예를 들면, 프로그램의 95%가 병렬화 할 수 있다면 이론적인 최대 성능 향상은 아무리 많은 프로세서를 사용하더라도 최대 20배로 제한됨[3]




인터넷

조금 전에 얘기한대로 인터넷 사용자는 엄청나게 증가를 하였는데 대략적으로 어떤 변화를 보였는지 보자.


1999년

  • 인터넷에는 2억 8천만 명의 사용자가 있었음


2005년

  • J2EE, SOA 및 XML이 가장 중요
  • 인터넷에는 10 억 명의 사용자가 있음
  • Facebook에는 550만 명의 사용자가 있음
  • YouTube는 신생아 (2005 년 2 월).
  • 트위터는 태어나기 전 (2006).
  • Netflix는 아직 비디오 스트리밍 (2007)을 도입하지 않음


2014년
  • 인터넷 라이브 통계에 따르면 약 2,950,000,000 명의 인터넷 사용자가 있음
  • 중국 만해도 640 만 인터넷 사용자가 있음
  • 미국은 2 억 8000 만명

오늘날 가장 인기있는 웹 사이트 중 두 가지 :
  • 페이스 북 - 13 억 사용자.
  • 트위터 - 2 억 7 천만 명의 사용자.
시대가 바뀌었다. 2014년 기준으로 하나의 웹 사이트(페이스북)가 이제는 10년 이전의 전체 인터넷 사용자보다 많은 사용자를 보유하고 있다.

1995년부터 2015년까지 인터넷, Facebook 및 Twitter의 총 사용자




멀티코어 시대

어찌되었든 무어의 법칙이 깨진 이후 CPU 회사들은 컴퓨터의 성능을 높이는 대신에 CPU 숫자를 늘리는 것이 주력하였는데 이것이 우리가 아는 듀얼 코어, 쿼드 코어의 등장이다. 게다가 하이퍼 스레딩[4]이라는 기술을 개발하여 하나의 물리적 CPU를 두 개의 CPU인 것처럼 인식하게 만들어서 코어의 숫자는 더욱 더 늘어나게 되었다.


문제는 이러한 멀티코어 시대에 따라서 소프트웨어 개발자들은 "동시성 프로그래밍, 멀티 스레드 프로그래밍"이라는 당면 과제를 받게 되었다.

하지만 자바 동시성 프로그래밍은 쉽지 않다. 대표적인 것이 자바 개발자들에게 동시성 프로그래밍 바이블 같은 책이었던 "JAVA Concurrency in practice"이다. concurrency인데 왜 번역이 병렬 프로그래밍으로 되었을까 싶은 마음이 들기는 하였는데 아무래도 멀티 코어를 다 사용한다는 점에서 병렬 프로그래밍이라는 이름으로 번역을 한 듯하다. 개인적으로는 "실전 자바 동시성"이라는 이름이 더 맞는듯하다. 참고로 동시성과 병렬성은 다른 뜻이다.



java concurrency in practice에 대한 이미지 검색결과  


동시성 프로그래밍이 왜 어려운지 예를 들 때면 늘 이 책이 나오곤 합니다. 많은 사람들이 추천하지만 그만큼 책 내용은 어렵습니다.

"java.util.concurrent" 패키지쪽 사용 방법에 대해서 많은 설명이 되어있는데 사용을 하는 법은 어렵지 않으나 동시성 프로그래밍의 어려운 점이나 문제가 생기는 구간, 원인 그리고 해결방법에 대한 원론적인 문제들은 사실 많이 골치 아프고 생각을 많이 해보게 만든다. 그리고 그런 점이 이 책이 어렵다고 많이들 이야기하는 이유이기도 하다.


자바에서 벗어나면 다음과 같은 책이 또 있다.

동시성 관련하여 유명한 책인데 나는 번역본을 보았다. 이 책 또한 정말 머리깨지는 이야기인데 "Java concurrency in practice"는 JAVA라는 언어에 국한되어 설명하기 때문에 이 책이 더 좋고 추천할만하다. 하지만 이 책도 만만치 않게 어렵다. (어쩌면 더)

"Java concurrency in practice"에서 다룬 내용은 이 책에서 동시성 모델 중 하나인 "스레드와 잠금장치"에 해당한다. 



  7가지 동시성 모델에 대한 이미지 검색결과





현재 패러다임

조금 전 살펴본 동시성 프로그래밍에서 Thead는 큰 문제를 갖고 있다. 예측이 불가능한 상황이 만들어지고 테스트가 어렵고 프로그밍하기 어렵다는 문제이다.


“Thread를 사용하는 대부분의 프로그램 들은 버그로 가득 차 있다.”
- Havoc Pennington -


처음에는 이러한 어려움과 문제에 대해서 원래 그런 것이고 이 어려운 것을 잘 해내는 사람이 잘하는 것이고 고수라는 생각을 갖고 있었지만 이제는 달라지고 있다. 이 고질적인 문제를 근본적으로 해결하려 하는 것이 요즘 많이 뜨고 있는 "함수형 프로그래밍(Functional programming"이고 동시성 프로그래밍 분야에서 큰 각광을 받고 있는 것이 "반응형 프로그래밍(Reactive programming"이다. 

 그리고 이 둘의 장점을 합친 "함수형 반응형 프로그래밍(Functional reactive programming"이 유행인데 아직 국내에서는 이렇다 할 큰 사례는 없는듯하다.

하지만 이러한 리액티브와 같은 부분은 Spring 5에서도 도입이 된다고 할만큼 큰 추세이니 알아두면 향후에 큰 도움이 될 것이다.




Reference

[1] 무어의 법칙 한글 위키 (https://ko.wikipedia.org/wiki/%EB%AC%B4%EC%96%B4%EC%9D%98_%EB%B2%95%EC%B9%99)

[2] 암달의 법칙 한글 위키 (https://ko.wikipedia.org/wiki/%EC%95%94%EB%8B%AC%EC%9D%98_%EB%B2%95%EC%B9%99)

[3] 암달의 법칙 영문 위키 (https://en.wikipedia.org/wiki/Amdahl%27s_law)

[4] 하이퍼 스레딩(https://ko.wikipedia.org/wiki/%ED%95%98%EC%9D%B4%ED%8D%BC%EC%8A%A4%EB%A0%88%EB%94%A9)

[5] what is reactive programming (https://medium.com/reactive-programming/what-is-reactive-programming-bc9fa7f4a7fc#.j3uzfx76t)



저작자 표시 비영리 변경 금지
신고
posted by 아틴
2016.11.17 18:10 Dev 개인 정리글

동시성(Concurrency)


  • 논리적인 용어
  • 동시에 실행되는 것처럼 보이는 것
  • 싱글 코어에서 멀티 스레드를 동작시키기 위한 방식
    • 하지만 멀티 코어에서도 동시성은 사용 가능함
    • 코어 수에 따른 방식보다는 작업 방식에 대한 부분인데 굳이 이해하기 좋고 좁게 보자면 이렇게 이해할 수 있을꺼 같음
  • 멀티 태스킹을 위해 여러 개의 스레드가 번갈아가면서 실행되는 성질
  • 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가면서 조금씩 실행되고 있는 것



병렬성(Parallelism)


  • 물리적인 용어

  • 실제로 작업이 동시에 처리되는 것

  • 멀티 코어에서 멀티 스레드를 동작시키는 방식
  • 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행되는 성질
  • 병렬성은 데이터 병렬성(Data parallelism)과 작업 병렬성(Task parallelism)으로 구분


데이터 병렬성

  • 같은 작업을 병렬 처리하는 것
  • 전체 데이터를 나누어 서브 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 것
  • 자바 8에서 지원하는 병렬 스트림이 데이터 병렬성을 구현한 것
  • 서브 데이터는 멀티 코어의 수만큼 쪼개어 각각의 데이터들을 분리된 스레드에서 병렬 처리함

 

작업 병렬성

  • 서로 다른 작업을 병렬 처리하는 것
  • Example) 웹 서버 (각각의 브라우저에서 요청한 내용을 개별 스레드에서 병렬로 처리함)




동시성(Concurrency) vs 병렬성(Parallelism)



Concurrency in golang



이미지 출처 (http://www.javaworld.com/article/2076774/java-concurrency/programming-java-threads-in-the-real-world--part-1.html)


사실 동시성과 병렬성을 단순한 설명으로만 들으면 잘 이해가 되지 않는다. 비슷한 말 같은데 무슨 차이가 있는지 말이다.

위의 정리해놓은 글을 보면 간단해보이는데 잘 이해가 되지 않는다면 아래 표를 통해 다시 정리하고 이해해보면 좋을꺼같다.


 

 동시성(Concurrency)

 병렬성(Parallelism)

 용어 차이

 논리적

 물리적

 뜻

 동시에 실행되는 것처럼 보이는 것

 실제로 작업이 동시에 처리되는 것

 코어 환경

 싱글 코어, 멀티 코어에서 가능

 멀티 코어에서만 가능






Reference

[1] 동시성과 병렬성 (http://sunphiz.me/wp/archives/1716)

[2] 동시성과 병렬성 (http://yolojeb.tistory.com/10)


저작자 표시 비영리 변경 금지
신고
posted by 아틴
prev 1 2 3 4 5 ... 144 next

티스토리 툴바