미분과 적분, 줄여서 미적분...

미적분이 중요하다고는 하지만 과연 얼마나 많은 이들이 미분 적분의 의미를 제대로 이해하면서 사용하고 있을지 모르겠다.


이 글은 미분 적분에 대한 가장 기본적인 개념에 대한 내용이다. 하지만, 이 글의 내용만 잘 이해하고 알고 있어도 미분 적분은 더 이상 암호학이 아니게 될 것이라 생각한다. 무슨 미분 적분에 대한 문제 풀이법을 설명하려는 게 아니다. 그런 건 차후의 문제이다. 미분 적분이 무엇인지 이해해 보자는 것이고 최소한 이 정도는 알고 문제를 풀자는 것이다.


1. 적분의 이해


적분하면 아마도 다음과 같은 식이 떠오를 것이다.



그럼 이게 무슨 뜻인지 하나 하나 해부해 보도록 하자. 이게 무슨 뜻인지만 다 알아도 사실 적분을 거의 이해한 것이나 마찬가지다.


그 뜻은, "x를 a부터 b까지 변화시키면서 f(x)에 dx를 곱한 것을 전부 합쳐라"라는 의미이다. 결국 다음과 같은 의미이다 (수학적으로 완벽한 수식은 아니다. 단지 개념을 이해하기 위한 것이다).



먼저, 적분기호 는 인티그랄(integral)이라고 읽는데, 잘 보면 영어의 s자를 땡겨 놓은 거랑 비슷하다. 왠지 sum이 떠오르지 않는가? 그렇다. 바로, sum(합치다)의 s를 길게 늘어뜨린 게 적분기호 이다. 참고로, integral의 영어적 의미도 '합치다' 이다.


다음, f(x)dx가 남았는데, f(x)에다가 dx를 곱하라는 말이다. 먼저, f(x)가 의미하는 것을 함수 그래프를 통해 살펴보자


함수값 f(x)는 y = f(x) 그래프에서 x가 x일때의 y값, 즉, 위 그림에서 빨간색 선의 높이(길이)이다.


마지막, dx는 미분에서 나오는 dx랑 같은 말인데, x의 순간적인 변화량이다. dx와 관계된 표현으로 △x ('델타엑스'라고 읽는다)가 있는데 △x는 어떤 구간에서의 x의 변화량을 나타낸다.  만일, x가 x1에서 x2로 값이 변했다면 △x = x2 - x1이다. dx는 △x를 무한히 작은 값으로 보낸 극한에서의 개념이다. 예를 들어, 어떤 직사각형이 있고 이 직사각형의 밑변의 길이가 △x라 하자. 이제 이 직사각형을 세로방향으로 잘라서 둘로 나누자. 그럼 밑변의 길이가 △x/2가 된다. 그런데 이 사각형을 무한히 계속 나눈다면 하나의 기다란 선처럼 될 것이고, 이 선의 밑변의 길이는 0은 아니지만 0에 무한히 가까운 값이 될 것이다. 상상속에서만 존재하는 이 선의 밑변의 길이가 바로 dx이다 (편의상 dx를 길이라고 했지만 dx는 +, - 부호를 갖는 값이다. x가 증가하면 +, 감소하면 -이다. dx의 정확한 표현은 x의 순간변화량이다).


그렇다면, f(x)dx가 의미하는 것은 빨간색 선의 넓이(면적)라는 것이다 (f(x)가 높이, dx가 밑변).


그럼, 이제 다시 원래 적분 식으로 돌아가서 아래 식과 그림을 찬찬히 감상해 보자.





x를 a부터 b까지 변화시키면서 f(x)에다가 dx를 곱해서 합친다...


정적분 식을 보면서 자연스럽게 함수의 면적(그래프 아랫부분 넓이)이 연상된다면 성공이다^^

(만일 그래도 잘 모르겠다면 수학책에서 구분구적법 설명하는 부분을 찬찬히 읽어본 다음에 이 글을 다시 한번 읽어보기 바란다)



혹자는 이런거 굳이 알아서 머하냐 할 수도 있겠다. 천만의 말씀이다. 적분 계산하는 공식만 열심히 외워서 적분 계산만 잘하면 뭐할 것인가? 무슨 뜻인지도 모르고 어디에 써먹는지도 모른다면 말이다.


예를 들어, 위 그림에 나오는 함수 그래프(a부터 b까지 부분)를 x축을 중심으로 회전시켰을 때 나오는 입체도형의 부피를 구하라는 문제가 있다고 하자.




적분의 개념이 잘 잡혀 있다면 위 회전체의 부피를 다음과 같이 계산할 수 있음을 알 수 있을 것이다.



좀 전에는 빨간색 막대 선들을 합치면 되었지만, 이제는 빨간색 원판들을 합치면 원하는 회전체의 부피가 나온다. 이제는 f(x)가 반지름이 되기 때문에 빨간색 원의 넓이는 πf(x)2이고, 여기에 dx를 곱하면 아주 얇은 원판(원기둥)의 부피가 나온다. 이것들을 a에서 b까지 모두 합하면 회전체의 부피 V가 나오는 것이다.


참고로, 고교수학에 보면 무한급수를 정적분으로 고치는 단원이 있는데(적어도 내가 학교 다닐땐 있었다), 겉보기는 무척 복잡하지만 적분의 개념을 이해하고 찬찬히 보면 당연한 얘기임을 알 수 있다.



2. 미분의 이해


적분의 반대말이 미분이다. 적분이 쌓는 거라면 미분은 미세하게 쪼개는 거다. 등등 미분에 대한 여러 가지 말들이 있지만 미분의 가장 정확한 표현은 순간변화율이다 (아마도 순간변화율을 구하는 방법이 나누기라서 미분이라고 부르는 것 같다).


그렇다면 순간변화율이 무엇인지만 이해하면 미분도 꿰뚫을 수 있다는 말이 된다.


우선, 변화율이 무엇인지 살펴보자. 변화율을 이해하기 위해서는 먼저 변화율이라는 말이 상대적인 개념이라는 것을 알아야 한다. 예를 들어, 'f의 변화율이 3이다'라는 말은 온전한 표현은 아니다.


왜?


무엇에 대한 변화율인지가 빠졌기 때문이다. 예를 들어, 우리가 알고 있는 속도(력)는 시간에 대한 위치변화(이동거리)의 변화율이고, 중학교 때 배우는 직선의 기울기는 x값에 대한 y값의 변화율이다.

즉, 변화율을 말하려면 변화율의 기준이 되는 놈이 있어야 한다는 말이고 이 기준이 뭐냐에 따라서 변화율 값이 의미하는 바가 완전히 달라진다 (속도에도 초속, 분속, 시속이 있음을 상기하자).


이 시점에서, '어라, 미분은 x로 나누는 것 아닌가?' 하는 님도 있을 것이다. 대답은 NO. 우리가 고등학교에서 배우는 대부분의 미분이 x에 대한 y의 변화율이기 때문에 dy/dx를 그냥 y'으로 쓰고는 암묵적으로 'x에 대한 미분이다'라고 하는 것이지, 미분 자체는 어떤 것도 대상으로 할 수 있다. 예를 들어, 얼굴에 느는 주름살의 개수를 나이로 미분하면 노화 진행율이 나온다.


아래 식이 미분을 설명하는 가장 근본적인 식이다. 꼭 암기(?)하자!!!



그럼 이제 고교 수학으로 돌아가서 도형의 변화율을 살펴 보자.




먼저, 왼쪽 그림은 기울기가 2인 직선이다. 기울기가 2라는 말은 dy/dx = 2라는 말로서, y 변화량이 x 변화량의 2배라는 말이다. 즉, x가 1 증가하면 y는 2 증가하고, x가 5 증가할 때 y는 10 증가한다는 말이다.


그런데, 오른쪽 곡선 y = f(x)의 경우는 변화율이 어떻게 될까? 직선처럼 변화율이 항상 일정한 것이 아니라 곡선의 경우는 변화율 자체가 계속 변화한다. 순간 순간의 변화율은 계속 변하지만, 어떤 구간에서의 평균적인 변화율은 정의할 수 있다. 여기서 평균변화율 개념이 나온다. 함수 f(x)의 구간 [a, b]에서의 평균변화율은 다음과 같이 주어진다.



△x는 구간에서의 x의 변화량을 나타낼 때 쓰는 표현으로 적분파트에서 이미 설명하였다. 그냥 우리가 보고 느끼고 수치화할 수 있는 x의 변화량은 △x로 표현하고, 상상속의 극한에서의 순간적인 변화량은 dx로 표현한다고 생각하자. 위 평균변화율 예에서, x는 a에서 b로 변했으므로 x의 변화량 △x는 △x = b - a이다.


이제 미분의 원래 정의인 순간변화율에 대해 얘기할 시점이 되었다.


우리는 위 곡선 예에서 구간의 평균변화율이 아닌 모든 x 점에서의 순간변화율을 구하는 것이 목적이다. 즉, x = a일때의 변화율, x = b일때의 변화율, ... 등과 같이 한 점 한 점에서의 변화율을 구하고 싶은 것이다. 곡선상의 어떤 한 점 부분을 무한히 확대한다고 해 보자. 어떤 곡선도 무한히 확대하다 보면 부분적으로는 직선이 된다. 이 직선의 기울기가 바로 해당 점에서의 순간변화율이다.



위 곡선 예에서 x = a에서의 순간변화율 f'(a)는 다음과 같이 구할 수 있다.



그런데, x = a 한점에서가 아니라 모든 점에서의 순간변화율을 구하고 싶으면 어떻게 하는가?


그냥 x를 특정 값으로 국한시키지 않고 x 자체에 대해 일반적으로 순간변화율을 구하면 된다 (사실 이러한 대수적 개념이 처음에는 쉽지 않지만 수학에서 꼭 익숙해져야할 부분이다. x에 대해 순간변화율을 구한다는 것은 비록 x가 어떤 값이 될 수도 있지만 지금은 하나의 대표값으로서 x라는 값 하나에 대해 순간변화율을 구한다는 말이다).



이상으로 미분에 대한 기본적인 개념은 설명은 다 했다.


참고로, 미분의 표현식인 dy/dx는 분수이고 나누기이다. 즉, dy를 dx로 나눈 값이다. 다만, y가 x에 종속되어 변하기 때문에 dy에는 dx에 대응되는 y 변화량이 올 뿐이다. 또한, y를 x로 미분하면 dy/dx지만 반대로 x를 y로 미분하면 dx/dy이다. 이 때, dy/dx와 dx/dy는 서로 역수관계가 성립한다. 예를 들어, 어떤 도형이 (1, 3)을 지난다고 하자. 만일 (1, 3)에서 y' = dy/dx = 2라면, (1, 3)에서 x' = dx/dy = 1/2이 된다. 다만, 주의할 것은 y' = 2라는 것은 x = 1일때 변화율이지만, x' = 1/2라는 것은 y = 3일때 변화율이다. 결국 한 점에서의 변화율이지만 보는 관점이 다를 뿐이다.


고교수학에서는 합성함수의 미분이라는 것을 배운다.

y = 2x를 x로 미분하면 dy/dx = 2이다. 이 말은 x가 1 증가하면 y는 2배로 2 증가한다는 말이다.

그렇다면 y = 2x를 2x로 미분하면 어떻게 될까? 답은 dy/d(2x) = 1이다. 즉, y와 2x의 변화속도가 같다는 말이다.

적분에 치환적분이 있듯이 미분에서도 2x를 하나의 새로운 변수 t로 놓고 생각해 보자. 그러면 y = t, t = 2x이므로 dt/dx = 2이고, dy/dt = 1이다. 즉, t의 변화량은 x의 2배이고 y의 변화량은 t와 같다는 말이다. 그렇다면 결국 y의 변화량은 x의 변화량의 2배라는 말이 된다.



즉, 처음부터 y를 x로 직접 미분하는 것 보다는 중간에 다리를 두어서 단계적으로 미분을 구하는 것이 합성함수 미분법이다. 예를 들어, y = (2x + 1)4인 경우 dy/dx = 4(2x + 1)3*2 = 8(2x + 1)3이 된다. 한 가지 유념해야 할 사실은 위 합성함수 미분법 식에서, dt/dx의 dt는 dx에 종속된 값이고 이 dt에 종속되어 dy/dt에서의 dy가 결정된다는 점이다.



3. 미분과 적분


미분은 쌀가루요 적분은 분노를 쌓는다라는 말이 있다. 이것도 일견 맞는 말이지만 미분 적분 관계에 대해 수학적으로 좀더 살펴보자.


적분에는 정적분과 부정적분이 있는데 미분과 반대말 관계에 있는 건 정확히 말하면 부정적분이다. 부정적분의 정의가 '미분해서 f(x)가 되는 함수를 f(x)의 부정적분이라 정의한다'이다. 예를 들어, f(x) = 2의 부정적분은 F(x) = 2x + C이다 (C는 임의의 상수). 그러니, 미분과 부정적분은 완전히 서로 반대말 관계이다.


반면에 정적분은 미분과는 직접적인 관계는 없으며, 구분구적법과 관계된 말이다. 앞서 1. 적분의 이해에서 설명한 바와 같이, 정적분은 어떤 정해진 구간에서 함수값을 미세하게 나누어 합친 값으로 적분(積分)의 한자 의미에 보다 가까운 말이다. 부정적분이 하나의 함수인 반면에 정적분은 어떤 수치 또는 값임에 주의하자.


정적분과 부정적분은 계산상의 연관 관계를 갖는다. 정적분 값을 곧이 곧대로 정의대로 구하지 않고 손쉽게 구하는 한 방법은 먼저 부정적분을 구한 후에 부정적분의 차를 이용해서 정적분 값을 계산하는 것이다. 즉, f(x)의 한 부정적분을 F(x)라 할 때,

와 같이 정적분 값을 부정적분을 이용해서 손쉽게 계산할 수 있다. 이 관계식은 미적분학에 있어서 가장 기본적인 정리 (fundamental theorem) 중 하나이다.


정리해 보면, '미분과 부정적분은 서로 반대말 관계에 있다. 정적분은 미분이나 부정적분과는 별개의 개념으로서 구분구적법, 면적, 부피 등에 관계된 개념이다. 정적분을 계산하는데 부정적분이 활용된다'이다. 참고로, 정적분의 수학적 정의는 구분구적법의 극한값이다.



☞ 이상으로 미분 적분의 개념에 대한 나름의 설명을 해 보았습니다. 제가 학교 다닌 지가 하도 옛날 일이라 요즘에는 교과서에 이런 내용들이 다 있을지도 모르겠네요. 요즘같이 바쁜 시대에 이 긴 글을 읽을 사람들이 많지는 않겠지만 조금이라도 도움이 되었길 바랍니다. 글의 재미를 위해 가끔 과격한 표현도 썼습니다 :) => 요즘 교과서에 다 나와있는 내용이라는군요.. OTL ^^;


☞ 긴 글을 읽으신 분들을 위한 팁입니다 ^^. 미분, 적분을 포함한 왠만한 거의 모든 수학 공식들은 여기에 다 정리되어 있습니다. => http://www.tug.org/texshowcase/cheat.pdf


☞ 가끔 영어 표현 때문에 들어오는 분들이 있어서 적어봅니다. 미분(differential), 미분학(differential calculus), 미분하는것(differentiation), 미분한결과(derivative), 변화율식{f(a+h)-f(a)}/h(difference quotient), 순간변화율(instantaneous rate of change), 평균변화율(average rate of change), 적분(integral), 적분학(integral calculus), 부정적분/결과(indefinite integral 또는 antiderivative), 정적분/결과(definite integral), 적분하는것(integration)


☞ 제 글은 미분, 적분에 대한 나름의 해석, 이해를 적은 글이기 때문에 일부 수학적 정의와는 차이가 있을 수 있습니다. 아래의 2014/08/20일자 댓글 내용을 참고하시기 바랍니다.


by 다크 프로그래머


http://darkpgmr.tistory.com/45




멀티 쓰레드 프로그래밍이 어려운 까닭

보통 멀티 쓰레드 프로그래밍 하면 손사레부터 치는 사람들이 대단히 많다. 이 쪽에 대해 나름 공부를 하고 있다 생각하지만 아직까지 버그가 없으면서 높은 병렬성을 가진, 어느 정도 이상 규모를 가진 프로그램을 일반적인 순차적 프로그래밍을 짜듯 쉽게 만들 자신은 없다. 팀 스위니 같은 천재조차도 멀티 쓰레드 프로그래밍은 쉽지 않다고 고백하는 것을 보면 현재 주된 개발 방식 어딘가에 동시성과 맞지 않는 근본적인 한계가 존재한다는 추측을 하게 된다.

 

멀티 쓰레드 프로그래밍이 어려운 까닭을 파고 들어가면 현재 가장 주류를 이루고 있고 또 성공적으로 적용 중인 구조적 프로그래밍이라는 개념 자체가 동시성 프로그래밍에 적합하지 않다는 점에 그 근본적인 원인이 있음을 알게 된다.1 이러한 원인을 알기 위해서는 우선 구조적 프로그래밍에 대한 이해가 필요하다.

 

구조적 프로그래밍이란 프로그램의 논리를 작은 단위로 나누어 생각할 수 있도록 하위 구조(sub-structure)라는 논리적인 단위를 제공한다. 이러한 하위 구조의 가장 작은 단위는 일반적으로 문장(statement)인데, 구조적 프로그래밍에서는 이들을 순차적으로, 혹은 필요에 따라 비순차적으로 수행하도록 적합한 제어 구조를 제공함으로써 작은 하위 구조로 부터 더 큰 프로그램을 조립해나간다.

 

여기에서 중요한 것은 프로그램의 문맥이 특정한 상태에서 어떤 하위 구조로 진입했을 때, 프로그램 작성자가 그 결과를 결정적으로(deterministic) 예측할 수 있다는 점에 있다. 하위 구조의 동작 결과를 알고 있기 때문에 이러한 하위 구조를 조립한 상위 구조들의 동작 결과도 미리 예측 가능하며, 이러한 전제 하에 상방식(bottom-up), 혹은 하방식(top-down) 설계가 가능해진다. 이 때 각각의 하위 구조가 다른 구조에 영향을 적게 줄 수록 유지 보수가 쉬워지는 경향이 있는데, 이를 위해 그 범위를 가능한 하나의 객체로 좁히기 위한 노력들이 훗날 객체 지향 패러다임에 상당한 영향을 주었다고 한다.

 

이 구조적 프로그래밍에서 가장 강력한 도구를 들라면 역시 서브루틴, 혹은 메쏘드이다. 잘 짜여진 서브루틴이라면 전제 조건(pre-condition)과 사후 조건(post-condition), 부가 효과(side-effect)가 명확하게 정의될 수 있다. 전제 조건이란 서브루틴에 진입하기 이전 프로세스2의 상태가 가져야 하는 전제 조건들을 의미하며, 사후 조건이란 서브루틴을 수행한 이후 반환되는 결과 값 및 변화한 프로세스의 상태이다. 부가 효과란 해당 서브루틴의 수행으로 인해 발생한 프로세스의 변화 자체를 의미한다. 현재의 컴퓨터 모델에서는 서브루틴을 수행하는 사이에 발생한 메모리 영역의 변화 일체가 서브루틴 수행의 부가 효과라고 볼 수 있다.3

 

헌데 기존의 프로그램에 동시성이라는 개념이 등장하는 순간 기존의 이런 도구들이 전부 의미가 없어진다. 두 개 이상의 실행 문맥이 동시에 한 메모리 영역을 읽고 쓰는데에 아무런 제약이 가해지지 않기 때문이다. 헌데 서브루틴이건 하위 구조이건 수행 자체에는 시간이 필요하고, 그 사이에 한 메모리 영역을 두 쓰레드가 동시에 조작하려 시도하면 비결정적(non-deterministic)인 결과, 이른바 데이터 레이스가 나오게 된다.

 

문제는 이 뿐만이 아니다. 설령 데이터 레이스가 존재하지 않는다고 하여도 싱글 쓰레드와 멀티 쓰레드 사이에는 프로그래밍 방식에 있어 현격한 차이가 있다. 만약 단일 쓰레드가 특정 객체를 수정하는 서브루틴를 수행한다 하면 일반적으로 진입 이전과 이후의 객체 상태는 모두 의미 있는 상태일 것이다. 이러한 가정 하에 구조적 프로그래밍이 가능해지는 것이다. 그러나 두 개 이상의 쓰레드가 그러한 서브루틴을 수행한다면 수정이 완전히 이루어지지 않는 불완전한 상태의 객체에 접근하게 될 가능성이 있다. 동시에 접근될 가능성이 있는 모든 객체에 대해 가능한 모든 불완전한 상태에 대한 대비를 해야 한다는 것이다. 이러면 당연히 프로그램의 복잡도가 현격하게 상승하게 되며, 이는 구조적 프로그래밍의 강점 하나가 그대로 사라지는 것을 의미한다.

 

여기에서 구조적 프로그래밍의 가장 큰 전제가 무너지는 것이다. 구조적 프로그래밍에 있어 그 결과를 신뢰할 수 없는 하위 구조는 존재 가치가 없으며, 그러한 하위 구조를 단 하나 가지고 있는 것 만으로도 해당 프로그램은 전혀 신뢰할 수 없는 프로그램이 되고 만다. 그렇지 않은 하위 구조를 짜는 것은 싱글 쓰레드에 비해 몇 배의 노력이 들어가며, 뒤에서도 설명하겠지만 특정 조건을 만족하지 않는 이상 이러한 하위 구조들은 서로 조합이 불가능하다는 치명적인 문제가 존재한다.

 

그간 연구자들이 이에 대해 손을 놓고만 있었던 것은 아니다. 컴퓨터 과학계에서는 수십년 전부터 동시성에 대한 연구가 시작되었고, 특히나 CPU 자원의 공평한 분배가 중요한 운영체제론에서는 동시성에 대한 연구가 광범위하게 진행되어 왔다. 쓰레드나 락, 데이터 레이스 등의 개념을 프로그래밍 자체보다는 운영체제나 시스템 프로그래밍 등의 테마를 공부하며 배우는 사람이 많은 것은 바로 이런 까닭이다.

 

가장 먼저 나온 방안은 (그리고 현재까지 가장 널리 통용되는 방안은) 필요한 경우 락을 이용하여 프로그램 수행을 직렬화하는 것이다. 간단히 말해 의미 없는, 불완전한 상태의 객체에 관한 서브루틴이 수행될 가능성이 있는 경우 진입 지점에 적당히 락을 걸어 두 개 이상의 쓰레드가 동시에 객체를 수정하지 못하도록 막는 것이다. 이 방법은 구현이 쉽고, 가장 기계 친화적인 방식이기 때문에 아직까지 널리 쓰인다.

 

그러나 구조적 프로그래밍과 이 방식이 잘 맞느냐를 묻는다면 회의적이다. 구조적 프로그래밍은 말 그대로 하위 구조의 조합을 통해 프로그램을 만들어가지만, 일반적으로 락 기반 프로그래밍은 객체 단위로 락을 할당한다는 점을 생각해보면 이 방식은 런타임에 존재하는 실제 객체의 상태에도 다분히 의존적이다. 기존에는 주로 하위 구조들이 이루는 프로그램의 구조에 대해서만 신경쓰면 됐다면 4 이제는 여기에 런타임의 프로세스 상태라는 새로운 차원까지 치밀하게 신경써야 한다. 이로 인해 락을 이용한 하위 구조들끼리는 별 다른 조치 없이 그대로 조합하는 것은 불가능하며, 악명 높은 동시성 버그인 데드락이 발생하는 까닭의 99%는 여기에 있다. 5

 

이런 방식 대신, 프로세서가 제공하는 원자적 명령어6를 통해 서브루틴을 수행하는 구간에 대해 해당 객체가 항시 유효한 상태임을 보장하는 방식인 이른 바 Lock-free, Wait-free로 대변되는 non-blocking 동기화 기법도 존재한다. 여기에서는 보통 프로그램의 복잡도를 제어 가능한 수준으로 낮추기 위해 선형화(Linearization)라는 개념을 도입한다. 선형화의 아이디어는 간단히 말해 특정 쓰레드가 특정 객체에 대한 작업를 수행한다 치면 다른 쓰레드에 있어서는 이 작업이 한 순간에 일어난 것처럼 보이도록 하자는 것이다. 데이터베이스의 트랜잭션과 어느 정도 유사한데, 이런 방식으로 접근을 하면 동시적으로 수행되는 각 작업들 사이의 선후 관계를 판별하는게 가능해지고, 또한 락을 이용한 방법과는 달리 하위 구조끼리의 조합도 가능해진다.

 

허나 non-blocking 동기화 기법은 기존의 알고리즘을 선형화시켜야 한다는 제한이 있기 때문에 코딩하기가 대단히 까다롭다. 이는 현대 프로세서들이 제공하는 원자적 연산 명령들의 한계 때문인데, 대부분의 경우 근접해있는 64비트 변수 두 개를 원자적으로 바꾸는 명령 정도가 한계이다. 이러한 명령만을 이용하여 프로그래밍하는 것은 락을 이용한 프로그래밍에 비해 절대 쉽다고 할 수 없다. 그렇기 때문에 대개의 경우는 아주 기초적이고 자주 사용되는 자료구조에 한해 이러한 프로그래밍 기법을 사용하는 것이 대부분이다.

 

그러나 선형화라는 아이디어 자체는 상당히 유용하기 때문에 동시성 모델을 만들고 사고하는데 있어 (락을 이용하는 경우에도) 쓸만하며, 또한 하위 구조간 조합이 아무 제약 없이 가능하다는 강점 덕분에 구조적 프로그래밍과 상당히 궁합이 잘 맞는다. 여기에서 더 나아가 특정 코드 구간에서 일어나는 모든 연산이 원자적으로 일어난다는 것을 보장할 수 있으면 어떨까? 이런 아이디어에서 Transactional memory라는 개념이 등장한다. Transactional memory란 간단히 말해 특정 수행 구간에서 일어난 메모리 변화를 원자적으로 반영시키는 개념으로, 메모리 버젼의 트랜잭션이라고 생각하면 된다. Transactional memory가 구현되면 모든 코드를 아주 쉽게 선형화 할 수 있게 되므로 동기화에 대한 시름거리를 하나 덜어버리는 셈이 되나, 안타깝게도 아직까지는 이를 실용적인 수준까지 구현한 사례는 존재하지 않는다.

 

현재까지는 어느 쪽이든 그 난이도가 낮지 않다. 이 외에도 수많은 방법들이 제안되었고 또 제안되고 있지만, 아직까지는 확실하게 은탄환이라 불릴 만한 해법은 나오지 않은 상태이다. 병렬, 동시성 프로그래밍은 로직 자체를 고민하는 것도 만만치 않은데 여기에 이런 다양한 문제들이 엮이면서 그 난이도가 살인적인 수준까지 올라간다. 마땅한 방법이 없는 현재로써는 이를 하나 하나 공부하며 그때 그때 맞는 방법론을 찾아 적용하는 수 밖에 없어 보인다.

 

 

 

출저 : http://summerlight-textcube.blogspot.kr/2010/04/%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4-%EC%96%B4%EB%A0%A4%EC%9A%B4-%EA%B9%8C%EB%8B%AD.html

  1. 물론 이게 goto를 쓴다고 해결된다는 의미는 절대 아니다. [본문으로]
  2. 여기에서 프로세스란 시스템 프로그래밍적 관점에서의 그 용어가 아닌, 프로그램의 인스턴스로써의 프로세스를 의미한다. [본문으로]
  3. 물론 이에 한정되지는 않는다. I/O도 부가 효과라고 볼 수 있으니까. [본문으로]
  4. 꼭 그렇지만은 않지만, 대부분은 좋은 설계에 의해 해결된다. [본문으로]
  5. 이 뿐만 아니라 lock contention, lock convoying등 락으로 인한 문제점은 셀 수도 없이 많다. [본문으로]
  6. Compare and swap등. [본문으로]

[펌글]

디바이드앤퀀쿼, 다이나믹, 그리디 세 가지 방법만알아도 문제가 쉽게 풀린다.


어디선가 봤는데 알고리즘은 저 3가지 위주로만 공부하라고 했는데,, 옼키 였나

kdlp 였나

Scenario: Git remote server를 사용하다가 문득 이런 의문이 들었다.


"소스관리시 하나의 Repository 내에 여러프로젝트를 저장하는 것일까? 아니면 여러개의 Repo를 만들까?"


초보적인 질문 일수있으나, 형상관리에 익숙하지 않아 궁금하였다.



Solutions:

okk* 사이트에서 이런 답변을 받을 수 있었다.



dgkim  991
19시간 전

github 사이트에서 repository를 제거할 수 있습니다.

하나의 제품의 여러 모듈로 구성되어 있고, 하나의 레포지토리여야만 유리한 점이 있는 것에 아니라면,

프로젝트 모듈별로 repository를 만드는 것으로 사용해 보십시오.

(일반 웹이라면, web project 하나가 repo하나, 서버+앱이라면, 각각 repo)
-------------------------------------------------------------------------------------------


이렇게 관리하는 거였군, 감사합니다 okk* dgkim



+ Recent posts