Linux Programmer

Guestbook

방명록쓰기 폼
  • 학생 2021.02.03 03:31 안녕하세요. 공부를 하다 보니 이해가 어려운 용어가 있어서 질문 드리고자 방명록 남깁니다.

    Reentrant에 대한 용어를 이해하려고 하고 있는데요, C언어에서 말하는 Reentrant와 Java에서 말하는 Reentrant가 다른것인지 궁금합니다.

    SUSv3에 정의로 따지면 Reentrant 하다는 것은 병렬로 둘 이상의 스레드에서 실행했을때 문제가 없어야하다 (외부에서 변경 가능한 static이나 전역 변수를 사용하면 안된다) 라고 이해했습니다.

    그런데 Java에서 ReentrantLock 클래스에 대한 설명을 보면 Reentrancy란 Lock에 대한 acquire를 invocation 단위가 아닌 스레드 단위로 한다고 말하고 있습니다.

    즉, 동일 스레드가 다시 acquire를 할때는 문제 없이 락을 획득 할 수 있다는 것인데요.

    그렇다면 다른 스레드에서 acquire를 요청하는 경우 병렬로 실행이 불가능 하다고 이해가 되는데 왜 ReentrantLock 이라는 이름이 사용되었는지 궁금합니다.

    Java에서 말하는 Reentrant와 sunyzero님 블로그에 있는 Reentrant는 다른 것인지 궁금합니다.

    (구글링을 통해 많이 찾아 보았는데 명쾌한 해답을 얻지 못해서 질문으로 남기게 되었습니다.)

    답변 주시면 정말 감사하겠습니다 :)
  • sunyzero 2021.02.03 18:55 신고 결론부터 이야기 하면 다릅니다.

    1. reentrant terminology의 문제 원인
    2000년대 초반부터 운영체제 이론과 기술은 매우 빠르게 성장했습니다. 그리고 이에따라 terminology가 함의하고 있는 뜻이 여러 방향으로 해석될 소지가 있거나 부정확한 용어는 되도록이면 사용하지 않도록 하고 있습니다. 그리고 그 중의 하나가 바로 reentrant입니다.

    그래서 10여년 전부터 reentrant보다는 정확한 범위(domain)를 가지는 용어로 정의하기 때문에 막연하게 도메인을 정하기 않고 지칭하는 병렬 레벨보다는 operation단위인지 function단위인지, thread 단위인지에 따라서 서로 다른 용어를 사용하도록 되어있습니다.

    그 결과 signal-safety라든지 thread-safety라든지 정확한 용어로 대체되고 있습니다.

    2. 자바의 reentrant
    자바의 경우는 실제 운영체제가 아닌 추상화된 JVM이 해석하는 투명성을 제공합니다. 따라서 java의 설계 사상자체가 JVM을 통해 OS의 기능을 끌어다 쓰기 때문에 용어나 기능의 1:1 매칭이 어렵습니다. 그러다보니 OS에서는 이미 제거되는 추세의 용어나 기능이 뒤늦게 자바에 들어가는 경우가 생길 수 밖에 없어서 많이 쓰이지 않는 고유의 용어를 사용하는 경우가 많습니다.(이런 연유로 후일 다른 플랫폼을 배울때 용어의 혼란을 겪는 경우도 많기는 합니다.)

    따라서 자바에서 사용하는 많은 용어는 OS나 다른 언어에서 사용하는 용어와는 단어만 같을 뿐 의미는 다른 경우가 꽤 있습니다.
  • 학생 2021.02.04 01:02 답변 감사드립니다.

    그렇다면 용어에 대한 이를 정리해보자면

    Reentrant function 이라는 것이 sunyzero님이 말씀하신 내용이고

    Reentrant 하다는 것은 단순히 재진입이 가능하다는 의미로 이해하면 괜찮을까요?

    위와 같이 이해해보면 재진입 함수는 시스템 레벨에서 사용하는 용어이고

    재진입락(ReentrantLock)에서 말하는 Reentrant를 지원한다는 것은
    단순히 재진입 즉 동일 스레드(Lock의 오너)인 경우 재진입을 허용한다라는 의미 정도로 이해할 수 있을 것 같아서요.

    학습을 하다보면 항상 동일한 단어가 다른 의미로 사용되는 것이 많아서 정의를 이해하기가 어렵네요 ㅠㅠ

    소중한 시간 내어 답변 주셔서 감사드립니다.
  • sunyzero 2021.02.05 12:51 신고 음... 아무래도 제가 설명을 잘못했나 봅니다.

    POSIX계열에서 말하는 reentrant 용어과 자바의 용어는 서로 다른 의미입니다. (그냥 용어의 혼동이라고 보시면 됩니다.)

    이런 연유로 인해 POSIX에서도 십수년전부터 reentrant라는 용어를 제거하게 된 것 입니다.

    reentrantlock도 사실은 이름이 잘못 지어진 것이라고 보는게 타당합니다. 기능적 측면에서 위와 같은 것은 보통 recursive lock혹은 recursive mutex라고 부르기 때문입니다.

    다시 정리하면 reentrant라는 용어는 옛날에 terminology를 명확하게 사용하지 않던 시절에 사용되던 것으로 되도록이면 지양할 용어이고, POSIX와 java는 이 용어를 서로 다른 의미로 쓰고 있어서 둘은 의미가 다릅니다.
  • 익명 2018.10.01 21:20 비밀댓글입니다
  • sunyzero 2018.10.02 12:47 신고 제가 적어둔 C언어 공부법에 대한 글을 읽어보시기 바랍니다.

    만일 다른 프로그래밍 언어를 이미 알고 있다면 상관없지만 처음 프로그래밍 언어를 배우는 경우라면 굳이 C언어로 시작할 이유는 없습니다.

    그게 아니라 어떤 목표때문에 꼭 C언어부터 배워야 한다면 제가 적어둔 글에 적힌대로 정통파로 배우시는게 좋습니다. 다만 이 경우에는 리눅스나 맥OS를 사용해야 하므로 윈도우즈를 당분간 끊으셔야 합니다.
  • 익명 2018.09.16 13:57 비밀댓글입니다
  • sunyzero 2018.09.18 12:07 신고 오류 제보에 이어 어색한 문맥까지 알려주시니 너무 감사합니다.

    다음 판에는 꼭 반영하도록 하겠습니다. 감사합니다.
  • 익명 2018.09.08 09:39 비밀댓글입니다
  • sunyzero 2018.09.09 21:47 신고 자세한 제보 정말 감사합니다.
    확인하고 수정하도록 하겠습니다. ^^
  • 익명 2018.07.02 10:58 비밀댓글입니다
  • sunyzero 2018.07.05 20:38 신고 뭔가 오해 하신 듯 싶습니다. 저는 학원을 하거나 학원 강사를 하는 사람이 아닙니다.

    가끔 대학이나 기업체에서 요청을 해서 특강을 나가긴 하지만 원래 직업은 회사에서 개발을 하고 있습니다.
  • 111 2018.06.27 09:30 4판 계획은 있으신가요?
  • sunyzero 2018.06.27 20:49 신고 일이 너무 바뻐서 당분간은 힘들 것 같습니다. ^^
  • 익명 2018.04.26 10:47 비밀댓글입니다
  • sunyzero 2018.04.29 18:04 신고 도움이 되셨다니 저도 기쁩니다. ^^
  • 익명 2018.03.01 21:57 비밀댓글입니다
  • sunyzero 2018.03.09 11:46 신고 답글이 늦었습니다. 개인적인 사정으로 블로그를 거의 들어가지 못했습니다.

    저는 IT 및 금융 관련 기업에 출장 강의를 나갑니다. 주로 리눅스 어드민, 트러블 슈팅, 시스템 프로그래밍, TCP/IP 네트워크 프로그래밍, 병렬 프로그래밍, 최적화 프로그래밍 등을 강의해왔습니다.

    온라인 강의에 대해 지인이 물어봐서 잠깐 알아본 적이 있는데, 국내 과정중에는 문제점이 있는 경우가 꽤 있습니다. 편법적인 내용을 알려주거나 틀린 내용이 들어있기도 하더군요.
    그래서 제 추천은 가장 공식적인 내용이 많은 Linux foundation쪽의 온라인 강의가 괜찮다고 생각합니다. 강의는 아마 다 영어일겁니다. 한국어를 제공하는지는 모르겠습니다.

    오프라인 강의는 국내에 레드햇 정규과정이 개설되어있는 것으로 아는데, 관련 과정의 커리큘럼이나 교재가 꽤 괜찮습니다. 하지만 개인이 듣기엔 비용이 너무 비쌀겁니다. 그래서 보통 회사에서 단체로 듣는 경우가 많습니다.
  • 쭌쓰 2017.09.06 22:57 안녕하세요~ 이제 막 컴퓨터 공부를 시작하려고 알아보던중 들렸습니다! 저의 꿈은 어느 것이든 뚫을수 있는 해킹 실력과 인공지능 개발인데 두개 다하는건 힘든지 궁금합니다..또 파이썬으로 언어를 시작하려고 하는데 주인장님 글을 보니 이쪽으로 평생 갈거면 c언어를 하는게 좋다고 하셔서 질문 드립니다! C언어로 시작하는게 맞는거 겠지요!? 또한 해킹을 하는데 C언어가 필수 겠지여!
  • sunyzero 2017.09.13 14:31 신고 보안관련이라면 C언어가 필수긴 하지만, 그것보다 대학교에서 차근차근 전공 수업을 배우는 것이 더 중요합니다.
  • 박연오 2017.01.25 02:51 안녕하세요. 2012년 쯤이었던 것 같네요. 도서관에서 볼 만한 책을 둘러보다가 <손에 잡히는 Vim>을 읽어보고 Vim을 잘 쓸 수 있게 되었습니다. 이맥스도 써 봤지만 펑션 키 조합이 불편해서 Vim으로 정착했군요. 그 후로 수년간 제 밥벌이에 큰 도움을 얻고 있습니다. 쉽고 유용한 책을 써 주셔서 감사합니다.

    블로그를 둘러보다가 국내 출판시장에 관한 고민을 쓰신 글도 읽어보았습니다. 고급 지식일수록 한국어로는 나오지 않는다는 말이 참 맞다고 생각됩니다. 그나마 IT 서적은 그래도 고급서가 간간이 저술되거나 번역되고 있는 것 같습니다. (번역질은 실망스러운 경우가 많지만요) 아마도 개발자들이 그래도 성실하게 공부를 이어가는 사람이 많은게 아닌가 싶네요. 저 자신도 여러가지 이유로 원서를 사거나 제본해서 보고 있는데 좋은 책은 기회되는대로 번역을 해 봐야겠다는 생각도 들었습니다.
  • sunyzero 2017.02.05 18:38 신고 감사합니다. 부족한 책인데 도움이 되셨다니 기쁩니다.
    국내출판시장이 열악한데, 나중에 좋은 책 써주시면 저도 꼭 읽어보도록 하겠습니다.

    늦었지만 새해 복많이 많으시기 바랍니다. ^^