일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 코딩테스트
- jvm
- JAVA기본
- 정리글 작성법
- 코드스테이츠 #회고록
- git #intellij
- 네트워크 기초
- 시작 #꾸준히 #과하지않게
- 에러해결
- WSL2 #권한
- Java환경
- mapstruct
- 인터넷 #ISP
- 호스트주소 #Host주소
- WSL #Linux #ubuntu
- 몰입학습 #몰입
- 회고
- 회고 #주간회고
- String
- 백엔드로드맵
- 공부방식
- 사용자계정 #WSL2
- 롤중독
- 회고록
- OOP
- 코드스테이츠 #
- 글 foramt
- Git #회고록
- 피드백
- 회고록_코드스테이츠
- Today
- Total
느리더라도 꾸준히
회고록(16) - Thread, JVM 본문
1. 지금 현재, 당신의 기분이나 느낌을 표현해 주세요.
추운 겨울에 전골을 해먹어서 그런가 든든한 느낌이다. 역시 잘먹어야 좋은 멘탈도 유지된다.
어제의 약속대로 바로 스카에 와서 공부를 할 예정이다. 오늘 이후로, Java 세션이 끝났는데 내 기준에서는 아직 크게 노력한건 없다라고 생각된다.(이미 Java는 알고 있었으니까..) 그래도 헷갈렸던 부분들을 꼼꼼히 다시 채워놓았다는 점에서는 괜찮았던 시간이었다.
오늘 강사님이 개발은 공부도 공부지만, 결국 백문이 불여일타 라고 했다. 배운 개념들을 다시 쳐보며 익숙해지도록 해야할 것 같다. 특히 앞으로는 내가 모르는 개념들을 배울 것이므로 더많이 쳐보고 더 이해해보자.
2. 오늘 무엇을 학습한 내용 중 지금 떠올릴 수 있는 단어를 모두 나열해 주세요.
프로세스, 싱글/ 다중 Thread, Runnable, run(), start(), OS, 스레드 동기화, 임계영역, 락, 스레드 실행 제어 메서드
JVM, Stack 영역, Heap 영역, Garbage Collector
3. 2에서 작성한 단어를 가지고, 오늘의 학습 내용을 설명해 보세요.
프로세스
운영체제로 부터 받은 자원들을 가지고 실제 실행되는 application을 말한다.
프로세스는 데이터/컴퓨터 자원 그리고 스레드로 구성되어 있습니다.
스레드(Thread)
프로세스의 내에서 실행되는 소스 코드 명령어들의 실행 흐름을 스레드 라고 부릅니다.
싱글 스레드
우리가 지금껏 자바에서 사용해온 메인 메서드가 바로 메인스레드를 통해 동작한 것이다. 이렇게 하나의 스레드로 명령어의 실행 흐름을 관리하는 것을 싱글 스레드 라고 부른다.
멀티 스레드
메인 스레드 외의 다른 스레드를 생성하는 하나의 프로세스에서 여러개의 스레드가 실행 됩니다. 이를 멀티 스레드 라고 부릅니다.
Runnable
Thread class는 Runnable interface를 구현하는 구현체 입니다. 이 Runnable은 run() 이라는 메서드를 추상메서드로 가지고 있는데, 이 메서드를 재정의 하여 Thread가 동작할 명령문을 생성할 수 있습니다.
동작 흐름
- Runnable 구현체나, 하위 Thread, 익명 객체를 통해 run() 를 재정의 하고 Thread type으로 참조 변수를 생성합니다.
- 해당 참조변수에서 start() 를 실행하면, Thread가 실행 대기 상태가 됩니다.
- OS가 대기중인 Thread를 가져와 run()을 실행 합니다.
스레드 동기화
무엇인가
synchronized 키워드를 통해 메서드나 블록 영역을 임계영역(critical section)으로 생성할 수 있습니다. thread들이 객체를 공유하고 있는 상황에서 임계 영역에 한 thread가 들어간다면 락이 걸리게 됩니다. 다른 thread들은 락을 가지고 있는 thread가 끝까지 실행을 마치고 락을 제공할때까지는 해당 임계 영역에서 실행될 수 없습니다.
왜 필요한가?
쓰레드 들이 공유하는 객체에서 동시에 메서드를 수행하면, 메서드가 원하는 로직을 망가트릴 가능성이 높기때문에, 동기화를 통해 이 문제를 막아야합니다.
쓰레드 실행 제어 메서드
- Thread.sleep() : 제공한 시간 만큼 쓰레드의 실행을 멈추는 메서드
- 참조변수.interrupt() : 일시 정지상태의 참조변수가 가리키는 쓰레드를 다시 실행대기 상태로 만들어주는 메서드
- Thread.yield() : 한 쓰레드가 가진 남은 수행시간을 다른 우선순위가 높은 쓰레드에게 양보하는 메서드
- 참조변수.join() : 참조변수가 가리키는 Thread가 전부 수행된 후, 자신의 Thread를 실행하라는 메서드
- 참조변수.notify() & wait() : 쓰레드간 상호작용에 사용되는 메서드
JVM
정의
프로그램을 실행하기 위해서는 메모리, 컴퓨터에서 필요한 자원을 요청하고, 운영체제로부터 받은 자원을 통해 프로그램을 실행할 수 있다. 이 프로그램과 운영체제 사이에서 요청 명령을 운영체제들이 이해할수 있도록 변환해주는 통역가와 같은 기능을 하는 기능
왜 필요하지?
프로그램을 실행하기 위해 메모리에 제공하는 요청들은 운영체제마다 필요로 하는 코드의 형식이 다르다. JVM은 운영체제 마다 여러 버전으로 작성되어 있기 때문에, 프로그램속 같은 소스코드로 모든 운영체제를 사용할 수 있다. 즉 운영체제에 독립적이게 만들어 준다.
Stack 영역
메서드 호출시, 메서드내에서 사용되는 매개변수, 리턴값, 지역변수, 연산시 일어나는 임시값들을 저장하고, 메서드 호출이 완료시 제거한다.
LIFO : 나중에 들어온 값이 먼저나간다는 의미로 , 스택은 LIFO 특징을 가지고 있다.
Heap
힙 영역은 단 한개만 존재하며 객체, 인스턴스변수, 배열값 등을 저장한다. 일반적으로 주소값(참조변수)는 Stack 영역에, 실제 객체나 배열값들은 Heap영역에 저장해두고 참조해오는 형식을 가진다.
Garbage Collector
가비지 콜렉터는 위에서 말한 Heap 영역에서 참조변수가 사라져버린 객체나 배열값등을 자동으로 제거하여 메모리를 확보해준다.
4. 설명하기 어려운 단어가 있다면, 그 이유는 무엇인가요?
5. 그 단어를 스스로 설명할 수 있기 위해서 누군가에게 질문을 한다면, 어떤 질문을 해야 할까요?
'(CodeStates)Daily memoir' 카테고리의 다른 글
회고록(17) - 재귀 (1) | 2022.11.18 |
---|---|
회고록(16) - 모의 기술 면접 체험 (0) | 2022.11.16 |
회고록(15) - 애노테이션, 람다, 스트림, I/O (0) | 2022.11.15 |
회고록(14) - 컬렉션 (0) | 2022.11.10 |
회고록(13) - 다형성, 추상화 (0) | 2022.11.09 |