해당 글은 코드스쿼드 2022 마스터즈 코스 "Java 웹 백엔드" 과정을 수강하면서 학습한 내용 등에 대한 회고 글입니다. :)
수강 회고
오늘 오전에는 프로세스/스레드 스케줄링 미션 관련 JK의 강의가 진행되었다. 강의에 앞서 JK의 간단한 훈화(?) 말씀이 있었는데, 가장 인상깊었던 대목은 인간이 가진 특별한 힘 중 하나는 바로 "자신이 모르는 것을 인지할 수 있는 것"이라는 것이었다. 이는 내가 얼마 만큼의 학업 등을 성취할 수 있는지에 대한 판단 능력으로 이를 메타인지 능력이라고도 한다. 메타인지 능력은 학습을 함에 있어서도 굉장히 중요한 요소라고도 한다.
하지만 인간은 익숙한 것을 대할수록 이러한 능력이 떨어질 수 있다고 한다. 단적으로 내가 프로그래밍을 함에 있어서도 평상시 자주 들었던 익숙한 용어를 보면 자칫 "저건 내가 잘 알지"라고 착각하는 경우가 있는데 실상을 열어다 보면 제대로 알고 있지 않는 경우가 허다했다. 개인적인 생각으로 단순히 생각만 하는 노력으로는 내가 제대로 알고있는지를 판단하는 데에는 한계가 있다고 생각한다.
나 같은 경우 내가 제대로 알고있는지를 판단하기 위해 기술 블로그에 해당 내용을 작성하는 편이다. 기술 블로그는 다수의 사람이 볼 수 있는 환경에 자연스럽게 노출되므로 글을 작성할 때는 신중하게 작성할 수밖에 없게 된다. 누군가는 내 글을 참고할 수도 있을 것이고, 그때 잘못된 정보를 작성했었다면 그 사람에게도 피해가 가기 때문이다.
또한 코드스쿼드 마스터즈 코스 과정 상의 환경 역시 내가 제대로 알고있는지를 판단하기에 적합하다고 생각한다. 현재 CS10 컴퓨터 과학 과정은 매주 미션이 주어지는데, 평상시 익숙했었던 부분도 간간이 주어지곤 한다. 이때 미션 과제를 풀이하다보면 내가 평상시 알고있었다고 생각했었던 부분들도 내가 제대로 알고있지 못했었다는 것을 인지할 수 있게 된다. 아울러 다른 수강생들이 작성한 코드들을 보면 나의 갇힌 생각에서 벗어나 좀 더 효율적인 코드를 보며 나의 부족함을 인지할 수 있게 된다.
그룹 리뷰 시간 역시 나의 상태를 진단하는데 도움이 된다고 생각한다. 누군가에게 말로 설명하다보면 내가 미처 고려하지 못했던 부분들이나 내가 말하면서도 이상하다는 점들을 스스로 발견할 수 있게 된다. 나는 오늘 프로세스/스레드 스케줄링 관련 미션 그룹 리뷰 시간에서도 이러한 점들을 느낄 수 있었다. 내가 구현한 것을 소모임원들에게 설명해주면서도 "과연 나라면 이러한 설명을 듣고 이해할 수 있을까?"라는 의문이 생겼다.
내가 작성한 소스 코드를 설명함에 있어 구조적인 부분, 기능적인 부분, 내가 의도한 부분 등을 소모임원들에게 깔끔하게 전달하지 못했던 점이 아쉬웠는데 이는 시간에 쫓겨 소스 코드를 작성하여 나조차도 전체를 제대로 이해하지 못했던 점이라고 생각한다. 이처럼 프로그래밍을 함에 있어서 내가 학습한 내용을 누군가와 적극적으로 공유(설명 등)하는 태도는 상대를 위한 것뿐만 아니라 무엇보다 나 자신을 위한 것이라고 생각한다.
당신이 어떤 새의 이름을 안다고 해서 그 새를 아는 것은 아니다.
- 리처드 파인만 -
학습 회고
- 프로세스/스레드 스케줄링 관련 미션 과제 풀이 및 그룹 리뷰
- Java 웹 백엔드 클래스 내 소모임원들과 zoom 회의실에서 학습
오늘은 어제 공부했던 프로세스와 함께 스레드 등 관련 내용에 대해서도 학습했다. 주요 학습한 내용으로는 다음과 같다.
스레드 스케줄링
스레드 스케줄링은 스레드의 개수가 CPU 코어의 수보다 많을 경우, 각각의 스레드들을 어떤 순서에 의해 실행할 것인지, 동시성을 실행할 것인지 등을 결정하는 것이다. 이때 스레드 스케줄링은 스레드 스케줄러가 결정하게 되며 스레드 스케줄러에 의해 여러 스레드들이 아주 짧은 시간 동안 번갈아가면서 run 메소드를 실행하게 된다.
join과 synchronized의 용도 구분하기
Thread의 join 메서드는 해당 스레드가 완전히 끝날 때까지 다른 스레드의 작업을 잠시 멈추고 기다리도록 하는 반면 synchronized 키워드는 멀티 스레드 환경에서 특정 스레드가 진행 중인 작업을 다른 스레드가 간섭하지 못하도록 막을 때 사용된다. 특정 스레드가 synchrozied block에 가장 먼저 접근하면 해당 영역에 대한 lock을 획득하여 다른 스레드들은 이 block에 접근할 수 없게 된다.
join과 synchrozied 이 둘은 특정 멀티 스레드 환경에서 다른 스레드들의 실행을 방지한다는(wait or block) 점에서 유사하지만 용도 자체가 다르다.
join 메서드는 멀티 스레드 환경에서 스레드 실행 작업 순서를 통제하는데 유리하다. 예를 들어, 임의의 실행 작업 순서가 지켜져야 할 경우 join 메서드를 사용하는 것이 유리하다. 이때 synchronized를 사용한다면 어느 스레드가 먼저 synchronized block에 접근할지 확신할 수 없으므로 실행 작업 순서를 보장하기 어렵기 때문이다.
반면 synchornized은 멀티 스레드 환경에서 다수의 스레드들이 동시 다발적으로 특정 코드(메서드 등)를 실행시키는 것을 방지하는데 유리하다. 예를 들어, 특정 공유된 자원에 여러 스레드가 접근 및 연산 작업을 하는 경우에는 synchorized를 사용하는 것이 유리하다. synchorized를 사용하지 않으면 연산(덧셈, 뺄셈, 곱셈 등) 작업이 다수의 스레드에 의해 동시 다발적으로 이뤄지면서 기대하지 않는 값들이 생성될 수 있다. 이때 join 메서드를 통해 스레드들이 순차적으로 접근 및 작업하도록 하는 것도 방법이지만, 이는 다른 스레드의 실행 작업을 멈추도록 하므로 항상 좋은 방법만은 아니다.
좋았던 점
- 오늘 그룹 리뷰 시간을 통해서 내가 작성한 소스 코드의 문제점들을 살펴볼 수 있는 시간이 되었다.
아쉬웠던 점
- 지난 주말 위염으로 인해 수면 및 식사 시간의 패턴이 약간 불규칙해졌다.
참고자료
- https://stackoverflow.com/questions/27244677/what-is-the-difference-between-thread-join-and-synchronized
- https://codedragon.tistory.com/5346
- 자바의 정석
'2022 Masters Course > CS 10 Course' 카테고리의 다른 글
2022 마스터즈 코스(백엔드) 19일차 회고(2022. 1. 27.) - "체력의 중요성" (2) | 2022.01.27 |
---|---|
2022 마스터즈 코스(백엔드) 18일차 회고(2022. 1. 26.) - "나의 부족한 점 점검하기" (0) | 2022.01.27 |
2022 마스터즈 코스(백엔드) 16일차 회고(2022. 1. 24.) - "데드 포인트 극복하기" (2) | 2022.01.24 |
2022 마스터즈 코스(백엔드) 15일차 회고(2022. 1. 21.) - "객체지향 프로그래밍 vs 함수형 프로그래밍" (2) | 2022.01.21 |
2022 마스터즈 코스(백엔드) 14일차 회고(2022. 1. 20.) - "질문의 중요성" (2) | 2022.01.20 |