[2021.01.21.목] TIL
오늘 컨디션
- 간만에 잠을 많이잤더니, 넘나 개운
⌛ 오늘 한 것
1. 전일 풀지 못한 알고리즘
-
완전탐색 / 모의고사
-
풀이시간:
01:10:00
...(왜이리 길어?..) -
리뷰: 굳이 패턴을 정답 길이만큼 만들 필요가 없었다ㅋ..ㅋ
-
구현여부:
완료 ✅
2. 자바의 정석 ch.13 스레드
멀티태스킹
- 윈도우나 유닉스를 포함한 대부분의 OS가 지원
- 여러 개의 프로세스가 동시에 실행될 수 있음.
멀티쓰레딩
- 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행
- ⭐ 하지만 CPU의 코어가 한 번에 단 하나의 작업만 수행할 수 있음.
- 동시에 처리되는
작업의 개수 == 코어의 개수
- 짧은 시간 동안 여러 작업을 번갈아 가며 수행함으로써 여러 작업들이 모두 동시에 수행하는 것
처럼
보이게 한다.
프로세스
- 실행중인 프로그램
- 프로그램을 실행하면 OS로부터 실행에 필요한 자원을 할당 받아 프로세스가 된다.
- 모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재
프로세스의 구성
- 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원
- 쓰레드
쓰레드
- 경량 프로세스(LWP, light-weight process)리고 불리기도 함.
- ⭐ 프로세스의 자원을 이용해
실제로
작업을수행
하는 것 독립적인
작업을 수행을 수행하기 위해, 개별적인 메모리 공간호출스택(call stack)
생성- ⭐ main 메서드가 수행을 마쳤더라도, 다른 쓰레드가 아직 작업중이면 프로그램은
종료 X
start()
를 호출되면,실행대기
상태에 있다가 자신의 차례가 되었을 떄 실행함.- ⭐ 한번 실행이 종료된 쓰레드는 다시 실행할 수 없다. ==
start()
한번 만 호출 가능
main 쓰레드
main 메서드
의 작업을 수행하는 것도 쓰레드- 쓰레드가 main 메서드를 호출해서 작업이 수행되도록 함.
자바는 OS 독립적?
-
실제로는 OS 종속적인 부분 몇 가지 존재
-
그중
쓰레드
가 하나이다.⇒ JVM의 종류에 따라 쓰레드 스케줄러의 구현방법이 다를 수 있기 때문에 멀티쓰레드로 작성된 프로그램을 다른 종류의 OS에서도 충분히 테스트 해볼 필요가 있다.
-
JVM의 쓰레드 스케줄러에 의해서 어떤 쓰레드가 얼마동안 실행될 것인지 결정되는 것과 같이 프로세스도 프로세스 스케줄러에 의해서 실행순서와 실행시간이 결정되기 때문에 매 순간 상황에 따라 프로세스에게 할당되는 실행시간이 일정하지 않고, 쓰레드에게 할당되는 시간 역시 일정하지 않게 된다.
-
따라서, 쓰레드의
불확실성
염두에 두어야 한다.
-
쓰레드의 우선순위
-
쓰레드가 가질 수 있는 우선순위
범위 1~10
( 숫자▲, 우선순위▲) -
쓰레드의 우선순위는 쓰레드를 생성한 쓰레드로부터 상속받음.
-
쓰레드를
실행하기 전
에만 우선 순위를변경
할 수 있다. -
'자바의 정석' 저자 코멘트 🧐
- 멀티코어에서는 쓰레드의 우선순위에 따른 차이가 전혀 없었다. - 따라서 쓰레드에 높은 우선 순위를 준다고, 더 많은 실행시간과 실행기회를 갖게 될 것이라고 기대할 수 없다. - 차라리 쓰레드에 우선순위를 부여하는 대신, 작업에 우선순위를 두어 PriorityQueue에 저장해 놓고, 우선순위가 높은 작업이 먼저 처리되도록 하는 것이 나을 수 있다.
쓰레드 그룹
-
보안상의 이유로 도입된 개념
-
모든 쓰레드는 반드시 쓰레드 그룹에 포함되어 있어야 한다.
-
쓰레드 그룹을 지정하는 생성자를 사용하지 않은 쓰레드는 기본적으로 자신을 생성한 쓰레드와 같은 쓰레드 그룹에 속한다.
-
우리가 생성하는 모든 쓰레드 그룹은 main 쓰레드 그룹의 하위 쓰레드 그룹
-
쓰레드 그룹을 지정하지 않고, 생성한 쓰레드는 자동적으로 main 쓰레드 그룹에 속함.
-
참조변수 없이 쓰레드 생성/실행
new Tread(ThreadGroup tg,Runnable r,String name).start()
⇒ 하지만, 가비지 컬렉터의 제거 대상이 되지는 않는다. → 해당 쓰레드의 참조가 `ThreadGroup`에 저장되어 있기 때문이다.
데몬 쓰레드
-
데몬 쓰레드가 아닌 일반 쓰레드의 작업을 돕는
보조적인
역할을 하는쓰레드
-
무한루프
와조건문
을 이용해서 실행 후대기
하고 있다가특정조건
이 만족되면 작업을 수행하고 다시 대기하도록 작성 -
일반 쓰레드 모두 종료 → 데몬 쓰레드 강제 자동 종료
-
데몬 쓰레드가 생성한 쓰레드는 자동적으로 데몬 쓰레드가 됨.
-
데몬 쓰레드의 예)
- Garbage Collector, 워드프로세서의 자동저장. 화면갱신 등
쓰레드의 실행제어
- 효율적인 멀티쓰레드 프로그램을 만들기 위해서는 보다 정교한 스케줄링을 통해,
- 프로세스에게 주어진 자원과 시간을 여러 쓰레드가 낭비없이 잘사용 하도록 프로그래밍 해야한다.
- 쓰레드 프로그래밍 어려운 이유는
동기화(Synchronization)
와스케줄링(Scheduling)
떄문이다. - 쓰레드 스케줄링을 잘하기 위해서는 쓰레드의 상태와 관련된 메서드를 잘 알아야함.
slee()
,joi()n
,interrupt()
,stop()
,suspend()
,resume()
,yeild()
쓰레드의 상태
NEW
,RUNNABLE
,BLOCKED
,WAITING, TIMED_WAITING
,TERMINATED
sleep()
try-catch 예외처리 이유
-
sleep()
에 의해 일시정지 상태가 된 쓰레드를 실행대기 상태로 변경하는 2가지 방법-
지정된 시간에 도달한다.
-
interrupt()
가 호출돼,InterruptedException
이 발생한다.
-
sleep()은 항상 현재 실행 중인 쓰레드에 대해 작동
th1.sleep(2000)
과 같이 참조변수를 이용해 호출하여도, 실제 영향은 일반적으로main 쓰레드
- static으로 선언되어 있으므로,
Thread.sleep(2000)
과 같이 작성하는게 좋음.
👍 잘한 부분
- 어제 풀지 못한 알고리즘을 풀었다, 역시 안풀리면 나중에 하는 것도 답인가보다.
- 그동안 무지했던 프로세스와 스레드에 대한 전반적인 개념을 진득하게 보았다.
👎 부족한 부분
- 수면시간 : 3h
- 프로세스 미션 시작을 못했다.
- 학습에 있어 지금 필요한 것과 알아두면 좋은 것을 분류하지 못했다.
🌙 느낀점
- 요즘 내가 부족한게 너무 많다는 생각이 든다. 언제 다 공부하나 싶다가도 해야할 일이 분명하니까 또 괜찮은 것 같고 애매모호하다. :)
- 파이로가 오늘
프로세스와 스레드
에 대해서 질의응답 세션을 줌에서 열었는데, 참여자가 50명?에 임박할 정도로 많은 인원들이 모였었다. 회의 내용의 80% 정도는 이해하지 못한 것 같지만 코드스쿼드를 함께하는 팀원들의 열정적인 분위기와 유능함을 보아서 나도 언젠간 지식나눔을 할 정도의 위치까지 도달하고 싶다는 의지와 목표가 생겼다.
Author And Source
이 문제에 관하여([2021.01.21.목] TIL), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@san/2021.01.21.목-TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)