[2021.01.21.목] TIL

노을·2021년 1월 21일
0

TIL

목록 보기
26/81

오늘 컨디션

  • 간만에 잠을 많이잤더니, 넘나 개운

⌛ 오늘 한 것

1. 전일 풀지 못한 알고리즘

  • 완전탐색 / 모의고사

  • Github 링크

  • 풀이시간: 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가지 방법

    1. 지정된 시간에 도달한다.

    2. interrupt()가 호출돼, InterruptedException이 발생한다.

sleep()은 항상 현재 실행 중인 쓰레드에 대해 작동

  • th1.sleep(2000) 과 같이 참조변수를 이용해 호출하여도, 실제 영향은 일반적으로 main 쓰레드
  • static으로 선언되어 있으므로,Thread.sleep(2000) 과 같이 작성하는게 좋음.

👍 잘한 부분

  • 어제 풀지 못한 알고리즘을 풀었다, 역시 안풀리면 나중에 하는 것도 답인가보다.
  • 그동안 무지했던 프로세스와 스레드에 대한 전반적인 개념을 진득하게 보았다.

👎 부족한 부분

  • 수면시간 : 3h
  • 프로세스 미션 시작을 못했다.
  • 학습에 있어 지금 필요한 것과 알아두면 좋은 것을 분류하지 못했다.

🌙 느낀점

  • 요즘 내가 부족한게 너무 많다는 생각이 든다. 언제 다 공부하나 싶다가도 해야할 일이 분명하니까 또 괜찮은 것 같고 애매모호하다. :)
  • 파이로가 오늘 프로세스와 스레드에 대해서 질의응답 세션을 줌에서 열었는데, 참여자가 50명?에 임박할 정도로 많은 인원들이 모였었다. 회의 내용의 80% 정도는 이해하지 못한 것 같지만 코드스쿼드를 함께하는 팀원들의 열정적인 분위기와 유능함을 보아서 나도 언젠간 지식나눔을 할 정도의 위치까지 도달하고 싶다는 의지와 목표가 생겼다.
profile
카르페디엠

0개의 댓글