2021-01-21-TIL
메모
맛집 정보: 서울감자탕
JetBrains Academy
- 취업준비정보: 노션에 정리해 둔 Reference 페이지
G102 Prodigy
읽어도 읽어도 매일 새로 쓰이는 소설 - 일기
스레드는 프로세스 실행의 단위
스레드
프로세스 실행의 단위,
LWP, 멀티태스킹의 단위 등은 결과적으로 그렇지만 원론적으로는 프로세스 실행의 단위라고 하는 것이 바람직하다.
Single Threaded Program
Oracle의 Java 튜토리얼도 같은 구분을 쓴다. 프로세스는 자기만의 메모리 공간을 가진 독립된 실행 환경이고, 스레드는 프로세스 안에 존재하며 모든 프로세스는 적어도 하나의 스레드를 가진다. 스레드는 프로세스의 메모리와 열린 파일 같은 자원을 공유하기 때문에 새 프로세스를 만드는 것보다 적은 자원으로 생성할 수 있고, 그래서 경량 프로세스(lightweight process)라고도 불린다. 애플리케이션은 main thread 하나로 시작하며, 이 상태가 Single Threaded Program이다. 자원을 공유한다는 점은 통신을 효율적으로 만들지만 동기화 문제의 원인이 되기도 한다.
버그의 가장 큰 원인
포인터(*) -> 포인터를 직접 다루지 못하고 다른 방법을 제공한다.
쓰레드 -> 멀티쓰레드 자체를 직접 다루지 못하게 하고 다른 인터페이스를 제공한다.
보편적인 변수 이름에 관해 몇 가지 팁
변수 이름에는 동사를 넣지 않는다 (동사로 시작하지 않는다)
isValid 같은 boolean 변수를 제외하고 모두
변수의 단수형에는 관사를 넣지 않는다. (단수형과 복수형은 s로 구분 가능하다)
user(단수형), users(배열, 리스트), userList(리스트)
전치사는 최대한 생략한다.
numOfUsers(x), numberOfUsers(x), userCount(o), numUsers(o)
영어 표기와 관련해 multithreading을 붙여 쓰는지, multi-threading처럼 하이픈을 넣는지도 찾아봤다. 저장해 둔 Wheatleys 글은 지금 404를 반환하지만, 링크에 남은 텍스트 조각으로 보면 “Multithreading”을 붙여 쓰는 예로 들면서 하이픈을 넣어 쓰는 경우도 많다고 설명하는 글이었다.
git diff는 줄 단위로 비교한다
방금 알게 된 것인데, git은 단순하게 이전의 코드에서 해당 라인의 코드가 무엇으로 바뀌었는지만 Line by Line으로 검사한다. 따라서 위와 같이 같은 내용의 함수를 새로 만든 경우, 사실은 해당 라인에 새로운 함수를 추가한 것인데도 기존의 함수를 그대로 있는 것으로 인식한다. 이런 식의 형상관리가 효용성 면에서 약간 개선될 여지가 있지는 않는가? (ex. 새로운 함수가 추가된 것을 시그니처만 뽑아서 형상관리로 인식한다던지 등)
git은 파일 내용을 줄의 나열로 보고 두 버전 사이의 차이를 계산한다. 어떤 줄을 같은 줄로 짝지을지는 diff 알고리즘이 정하며, git diff --diff-algorithm으로 default(myers), minimal, patience, histogram 중 하나를 고를 수 있다. 같은 변경이라도 알고리즘에 따라 추가와 삭제로 묶이는 범위가 달라지므로, 비슷한 함수를 새로 추가했을 때 어색하게 보이는 diff는 patience나 histogram으로 다시 보면 읽기 쉬워지는 경우가 있다. 함수 단위로 보고 싶다면 -W(--function-context) 옵션이 변경이 속한 함수 전체를 문맥으로 보여 준다.
1
2
git diff --diff-algorithm=histogram
git diff -W
멀티 스레드 스케줄링 미션
미션 요구사항은 다음과 같았다.
옵저버
프로세스 작업 정보 데이터 구조 구현
프로세스 종류 4개 구현
1초마다 프로세스 스케줄링 구현
프로세스 상태 변경
프로세스 상태 누적 표시
스레드 개수 표시
2초마다 스레드 스케줄링 구현
함께 받은 학습 질문은 다음과 같다.
- 멀티 스레드 스케줄링 방식에 대해 학습하고 정리한다.
- 각자 운영체제 스레드 동작 방식과 본인이 작성한 스레드 스케줄링 방식을 비교한다.
- 스레드를 무제한으로 만들 수 없다면, 프로세스가 많아질 때 성능 향상을 할 수 있는 방법이 무엇일까?
- setTimeout 내부 동작 방식에 대해 학습하고 정리한다.
- (setTimeout 제외하고) 플랫폼에서 정확도 높은 타이머(Timer)를 구현하기 위한 여러 방식에 대해 학습한다.
- 멀티 스레드가 공용 리소스에 접근할 때 임계구역을 다루는 방식(Semaphore, Mutex 등)에 대해 학습하고, 어떤 경우에 사용해야 하는지 토론한다.
setTimeout의 지연은 최소 시간이다
MDN 문서에 따르면 setTimeout의 지연 시간은 보장값이 아니라 최소값에 가깝다. 중첩 호출이 5단계에 이르면 브라우저는 최소 4ms의 지연을 강제하고, 비활성 탭에서는 브라우저마다 더 강하게 타이머를 늦춘다(Firefox 데스크톱은 최소 1초). 지연 값은 부호 있는 32비트 정수로 변환되므로 최대값은 2,147,483,647ms이고, 이보다 크면 오버플로가 나서 곧바로 실행될 수 있다. 정확한 타이머가 필요하면 이런 제약을 전제로 다른 방식을 찾아야 한다는 것이 미션 질문의 의도로 보인다.
세마포어와 뮤텍스
Java의 Semaphore 문서는 세마포어를 허가(permit)의 개수를 세는 객체로 설명한다. acquire()는 허가가 생길 때까지 기다렸다가 하나를 가져가고, release()는 허가를 하나 돌려준다. 허가를 하나만 두면 상호 배제 락처럼 쓸 수 있고 이를 binary semaphore라고 부르는데, 세마포어에는 소유자 개념이 없어서 획득한 스레드가 아닌 다른 스레드가 해제할 수 있다는 점이 일반적인 Lock과 다르다. 임계구역에 한 스레드만 들어가야 하면 뮤텍스(락), 동시에 N개까지 허용해야 하면 세마포어를 쓰는 것이 기본적인 구분이다.
검색 언어 설정
구글링에서 한국어를 기본언어로 사용하고 있는 경우, 영어로 검색을 해도 한국어가 포함된 게시물을 우선적으로 표시해준다. 그래서 언어를 영어로 변경한 계정을 하나 설정하고, 한국어를 기본언어로 설정한 계정을 하나 두어서 같이 검색을 하면 유용할 것 같다.
참고한 자료외부 출처 7
외부 출처
댓글
아직 댓글이 없습니다