|
질문만 하고.... 댓글이 달리지 않기 에 방치를 한 것을 발견했습니다.
devpia에서... 나를 제외 시키고... 열심히 공방이 이어졌습니다. 하여튼 똑똑한 분들이 많습니다.
그러다 3년 전 쯤에 데브피아에 추가를 한 것을 이곳에 추가를 해 두지 않았더군요...
그래서 이제 이곳에도 복사를 해서 붙혀넣기 했습니다. 참고하실 분은 참고하시길...
아래 구철회님 댓글이 하나 달려 있네요... atomic.... 무슨 말인지는 잘 모르겠지만.... 동기화가 필요없다...
그렇게 보이는 군요... 넵... 정확합니다. 동기화 필요없습니다... 그러므로 웬만하면....
동기화 없이... 프로그램을 할 수 있습니다. 어떻게 보면 이것도 동기화인데.... ㅋㅋㅋ
마지막에 올린 것
3년 전(2004년에 올린 것)의 글을 보충합니다.
아래의 글을 쓸 때는 30대 였는데 이제는 40대 입니다. 벌써 3년이 지난 것 같습니다.
몇 일 전 부터 자바로 서버 프로그램을 만들고 있습니다. 자바는 잘 사용하지 못하고 그저 한줄 검정하고 확인되면 붙혀 넣고... 소경 길 가듯 프로그램 하고 있습니다. 그리고 대부분은 동기화를 회피하고 있는데.... 오늘 딱 동기화를 하지 않으면 안되는 상황이 발생했습니다. 다른 언어에서야 습관적으로 사용하는 것으로... 그런데... ㅋㅋㅋ 자바에서는 두려움이 생깁니다. 확실히 깊은 내부를 마음으로 이해하지 못하기 때문에... 그리고 시스템과 좀 떨어져 위에서 도는 놈이라 어떻게 보면 쉽고 어떻게 깊이 생각하면 모호한 그런 느낌이 있습니다.... ㅋㅋㅋ ... 다 변명이지요... 그러다 쓰레드에 관한 지식을 얻고자 노력하다가 책을 하나 알게 되었습니다. "자바 쓰레드 능숙하게 다루기" 책이 절판이던군요 2001년에 출판된 것이데.... 그러다 어렵게 인터넷 헌책방에서 구입했습니다. 저것을 2번 읽어면 해결 되지 않을까? 생각으로 저녁 늦게(전 회사 사람과 모임이 있어) 와서 이 책을 보게 되었습니다. 쓰레드를 생각하며 메모리의 섞임에 대해 고민하며.... 그러다 32페이지 아래에서 위에 4째줄...
" .... 이러한 문제는 32비트(혹은 그보다 작은) 변수에서는 일어나지 않는다. 즉, 메소드가 하는 일이 단순히 어떠한 값을 설정하거나 반환하는 역활만을 한다면. 그리고 그 값이 long이나(자바에서는 8byte, 박영목 설명) double 타입이 아닌 경우라면 메소드는 동기화 될 필요가 없다. 즉, 앞에서 나온 예에서 x가 int로 선언되어 있는 경우라면 동기화가 전혀 필요없다"
이 짧은 글을 보는 순간 3년 전 아래의 글을 쓴 기억이 나면서 눈에서 눈물이 핑 돌았습니다. "그래 내가 처음에 짐작한 것이 맞았구나..." 그리고 또 잠시 생각했습니다. 그래 분명 32Bit 컴퓨터 이니까? 32Bit로 컴파일 되었어니까? 32Bit를 동시에 쓰게 된다. 그러므로 동기화가 필요없다. 그리고 싱글 CPU이기 때문에 더욱 그렇다.... 하지만 지금은 CPU2개 서버다... 지금은 어떨까? 생각했습니다. 하드웨어를 제가 설계하지 않았기 때문에 정확하게 알 수 없습니다. 그러나 엔지니어로 느껴 지는 것은 2CPU, 4CPU에서도 값은 섞이지 않을 것이다 입니다. 왜 그러냐 생각을 하니 세마포어던 뮤텍스던 동기화를 위해서 하드웨어적으로 어떤 변수나 flag는 한번에 기록되어 질 수 있어야 한다. 그렇지 않으면 2CPU는 4CPU는 의미가 없어진다는 생각.... 사람으로 치면 몸은 하나인데... 머리가 2개 목표도 2개의 한마디로 미친놈이라는 생각이 떠오릅니다. 또 CPU2가 2개라고 해서 속도가 2배가 발휘되지 않는다는 사실은 다 알 것입니다. 30% 더 증가한다고 알고 있습니다. 그러면 70%는 어디에 사용하는 것일까? CPU1과 CPU2와 마음을 맞추겠지요.... 다른 말로 동기화.... 그러므로 2CPU, 4CPU에서도 32Bit 컴퓨터 또는 32Bit로 컴파일 된 것은 32Bit 내에서 섞이지 않는다 입니다.
그러면 3년 전 실험으로 증명한 것은 섞인다고 했습니다. 한 컴퓨터 3일 동안 섞이지 않았습니다. 그리고 한컴퓨터만 보고 그렇다고 했습니다. 분위기가 그렇게 흘렀고 내 천성이 양보 스타일이라.... ㅋㅋㅋ 그리고 혼자 연구하는 스타일이라 지식도 딸리고... ㅋㅋㅋ 그리고 3년 전 섞인 PC에서 그 프로그램은 종료되었습니다. 어떤 전기적인 스파크로 하드웨어에 치명적인 펄스 유입으로 생각됩니다.
섞이더라도 그 프로그램은 계속 돌아야 하는데... 전체가 맛이 약간 갔다는 생각들었습니다. 또 실험하기도 귀찮고 해서...
지금 생각은 섞이지 않는다. 섞일 수 없다. 물론 이 생각도 새로운 지식이나 경험으로 인해 변경되고 수정될 수 있을 것입니다.
그러나 지금은 아니다 입니다. 그리고 이번에 자바로 서버쪽 CPU2개, 접속자 수 넘쳐나겠지요 견디어 내는지 테스트로 해볼 생각입니다. 뭐 잘못되면 잘리겠지요...ㅋㅋㅋㅋ 나의 사고로 Coding 하려고 합니다. 이미 이 글을 보는 순간 동기화 없이 하는 방법이 떠올랐습니다. 안해도 충분히 가능할 것 같습니다, 동기화는 원래 안하는 것이 좋지요... 그래서 왠만하면 다 피했습니다. C++에서도....
이제 자바에서도 해보아야겠습니다. CPU설계 하는 사람과 대화할 기회가 있다면 소프트웨어 깊이가 더 깊어 질 것이라 생각하느데,.. 미천한 존재인지라 그런 사람들과 대화할 기회가 있을 것인지???? 그러나 기대해 봅니다.
왜 이런 생각에 늘 잠못 이루는지.... 다른 사람들 보면 이런 생각은 하지 않고도 프로그램 잘 하는데...???
물론 생각하는 프로그래머도 있겠지만... 그리고 이런 생각을 하지 않고 프로그램을 하는 사람들 보면 대단하다는 생각 들기도 합니다.
천부적으로 타고난 사람들이다..... ㅋㅋㅋㅋ.... 그래도 내가 만든 프로그램이 아직 문제가 일어켜 나의 보잘 것 없는 명예를 더럽힌 적은 없기 때문에 오늘도 생각하고 어떻게 하면 더 성능을 낼까를 고민합니다..... 금방 할 것도 ... 더 편하게 할 것도 밤 늦게까지 고민합니다... 내가 너무 내 자랑하네요... ㅋㅋㅋㅋ 이런다고 월급 올라 가는 것도 아니고 대단한 연구소에서 나를 스카웃 할 것도 아닌데... 캄캄한 밤, 한산한 거리, 작은 빌딩, 허접한 사무실에서.... 자신의 일에 희열하며.... 어떤 섹스나 오르가즘보다 더 흥분하는 나는..... 미친 놈 ! ㅋㅋㅋㅋㅋ..... 12시 넘었네.... 좋은 꿈 꾸시길 바라며 ...
2007.10.27 토요일 AM 00:57, 부산에서 박영목 올렸습니다.
-------------------------------------------------------------------------------------------------------------
그 전에 올린 것....
박영목입니니다. 실험한 결과를 보고 추가한 것입니다. 2일 동안 프로그램을 돌려놓았습니다. 물론 2개의 정수를 비트가 겹치치 않도록 값을 지정해 두고... int형 하나에 2개의 쓰레드에서 값을 넣도록 했습니다(무론 int 배열 500개를 동시에 기록하면서). 그리고 다른 하나의 쓰레드에서 값을 검출하게 했는데. 2개의 값과 같지 않은 경우에 그 값과 갯수를 나타나게 해 두었는데... 방금 하나의 오류를 목격했습니다. 오류 직전에 VC++ 불러오면서 VC가 오류를 발생했고 VC를 닫다 말자 이상한 느낌이 들어 보았는데.... 그렇게 고대하던 오류가 나왔습니다. 여러 똑똑한 분들의 말씀이 맞다는 것이 증명되었습니다. ㅋㅋㅋㅋ 감사합니다.... 물론 이 실험은 오류가 최대한 가능 하도록 만들어 둔 것입니다. 그래도 아래와 같이 절대로 사용해야 합니다. 그래야 안정합니다. 다른 쪽 PC에도 걸어두었는데.... 저 PC는 3일째인 것 같은데... 아직 이상이 없군요.... 그 PC는 프로그램을 몇개 돌리지 않은 상태에서 가만히 켜두기만 한 것입니다. 그래도 절대로 아래와 같이 사용하기 바랍니다. 물론 오늘 상황은 어쩌면 아래와 같이 해 두어도 일어날 가능성이 있을 것 같지만 그래도 절대로 아래와 같이 사용하시기 바랍니다.
절대로 아래와 같이 사용하시기 바랍니다....... 4Byte 내에서도 값이 Mix된다. 4Byte 내에서도 값이 Mix된다. 4Byte 내에서도 값이 Mix된다.
EnterCriticalSection(&CriticalSection);
Form1->iNum = ....
LeaveCriticalSection(&CriticalSection);
===================================================================================
박영목 님이 쓰신 글 :
: 오늘 회사 노는 날인데.... 심심해서 나와서.. 약간의 실험을 했습니다. ㅋㅋㅋㅋ
: 이런 것들이 프로그램의 효율을 높이지요... ㅋㅋㅋㅋ
:
: 쓰레드를 거의 사용할 일이 없어서... 아니면 잘 익숙하지 않아서...
:
: 잘 사용하지 않았는데... 요즘은 이것을 사용하지 않고는 도저히 풀밍이
:
: 불가능함으로 사용하고 있습니다.
:
: 사용하면서.... 약간의 의문이 발생해서.....
:
:
: GUI나 문자열 외에 Form1의 public으로 선언된 int, char 같은 경우는
:
: 쓰레드에서 아래와 같은 구조를 취할 필요가 없을 것 같은데.... 여러분의 의견은 ???
:
:
: EnterCriticalSection(&CriticalSection);
:
: Form1->iNum = ....
:
: LeaveCriticalSection(&CriticalSection);
:
: 물론 쓰레드에서는 값을 집어 넣기만 하고...
: Form1(Main thread라고 할까?)에서는 한번씩 참고만 할 뿐일 경우....
:
: 그리고 실험을 해보지 않았지만 다른 쓰레드에서 동시에 변수에 쓴다고 해도
:
: 문제가 발생하지 않을 것이라 생각합니다.(에라 실험 coding 약간 함)
:
: int나 char 4byte 1byte 뭐 2byte도
:
: 현재 사용하는 PC는 386 이상으로 모든 처리는 32Bit(4Byte)로 동작합니다.
:
: 그러므로 이런 변수에 쓰레드에서 값을 바꾼다고 해도 한 메모리 4Byte 내에서는 다
:
: 른 값과 짬봉되지 않을 것이라 생각합니다.
:
: 1번 쓰레드에서 s라는 변수에 0x2040을 넣었다.
: 2번 쓰레드에서 s라는 변수에 0x3060을 넣었다.
:
: 위의 2 쓰레드를 실행해 두었다. 다른 쓰레드에서 값을 읽어본다.
:
: s 변수에 0x2060이나 0x3040 이런 씩으로 절대로 들어가지 않을 것이라 생각합니다.
:
: 글을 쓰다가 쓰레드를 만들어 돌려 놓았는데... 아직 이런 현상 없음....
:
: 오전에 문자열 갇고 놀았는데... 크기를 1000Byte random으로 1문자를 선택해서...
:
: 채우기 했더니... 간혹 한번씩 문자열이 썪이는 것을 발견했습니다...
:
: 당연하지요....
:
: 그렇지만 좌표와 같이... 화면 좌표 또는 지도 좌표와 같은 꼭 동시에 두 값이 필요할 경우.... 그외 동시에 필요한 정보는 아래와 같이 해야겠지요. 그렇지 않으면 아주 간혹 약간의 문제가 발생할 수 있습니다. 물론 이 좌표를 이용해서 그림을 그린다고 볼 때... 그냥 문자로 화면에 잠시잠시 보여 줄 경우에는 사용하지 않아도 아무른 이상이 없겠죠.... 금방 갱신이 될 것이기 때문에....
:
: EnterCriticalSection(&CriticalSection);
:
: Form1->x = ....
: Form1->y = ....
:
: LeaveCriticalSection(&CriticalSection);
:
: 다른 의견이나 실험한 것이 있으면 답변 달아주시면... 감사하겠습니다...
:
:
: 부산에서 박영목... 올렸습니다.
|