-
3월 31일 금요일 TIL 회고록카테고리 없음 2023. 3. 31. 16:04
프로세스
- 프로세스란 실행중에 있는 프로그램
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
- 스케줄링에 대상이 되는 작업(Task)와 같은 의미로 쓰인다.
- 프로세스 내부에는 최소 하나의 스레드(thread)를 가지고 있는데, 실제로는 스레드(thread)단위로 스케줄링을 한다.
- 하드디스크에 있는 프로그램을 실행하면 실행을 위해서 메모리 할당이 이루어지고 , 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라 불린다.
- 프로세스의 문맥(context)
- CPU 수행 상태를 나타내는 하드웨어 문맥
- Program Counter
- 각종 Register
- 프로세스의 메모리 영역
- Code 영역
- 실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역이다. CPU는 코드영역에 저장된 명령어들을 하나씩 처리한다.
- Data 영역
- 코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역이다. 프로그램이 실행되면서 할당되고 종료하면서 소멸된다.
- Stack 영역
- 함수 안에서 선언된 지역변수,매개변수,리터값 등이 저장된다.함수 호출 뒤 기록되고 종료되면 제거된다.
- Heap 영역
- 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 자유공간이다.
- Code 영역
스레드
- 프로세스 하나만을 사용해서 프로그램을 실행시키기에는 메모리의 낭비가 발생한다. 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
- 즉, 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다. 스레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍 언어의 가장 작은 시퀀스이다. 하나의 프로세스는 하나 이상의 스레드를 갖고 있다.
- 스레드가 독립적으로 가지고 있는 부분
- Program Counter (실행 흐름)
- Register Set
- Stack Space
- 스레드가 동료 스레드와 공유하는 부분 (Task)
- Code Section
- Data Section
- OS Resources
- 전통적인 개념의 Heavyweight process 는 하나의 Thread 를 가지고 있는 Task로 볼 수 있다.
프로세스와 스레드의 차이
운영체제는 프로세스마다 독립된 메모리 영역을 Code/Data/Heap/Stack의 형식으로 할당한다.각각 독립된 메모리 영역을 할당해주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
프로세스들이 운영체제로부터 별도의 메모리 영역을 할당받은 모습 이와 다르게, 스레드는 메모리를 서로 공유할 수 있다. 자세히 말하면 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서, 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.
스레드들이 프로세스의 Code/Data/Heap 메모리 영역을 공유하는 모습 정리!
- 프로세스는 운영체제로부터 별도의 메모리 영역을 할당받는다.
- 스레드는 Stack을 제외한 Code/Data/Heap 부분은 공유해 서로 읽고 쓸 수 있게 된다. (공유 자원을 가진다.)
- 프로세스는 운영체제로부터 자원을 할당받은 작업의 단위
- 스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
@SpringBootTest와 @WebMvcTest의 차이점
@SpringBootTest
- 실제 스프링 컨테이너를 사용한다. 실제 운영 환경과 유사한 테스트를 할 수 있다.
- 따라서 컴포넌트 스캔을 수행하여 프로젝트 내의 모든 빈을 등록하게 된다.
- 모든 빈을 등록하기에 필요한 빈이 없는 경우가 없다. (컴포넌트 스캔 대상이 되지 않도록 지정한 것 제외)
- 모든 빈을 등록하는 과정 때문에 시간이 오래 걸린다.
- 실제 운영과 비슷한 환경에서에 테스트를 진행하기에 규모가 크고, 이로 인해 디버깅이 어려워진다.
@WebMvcTest
- MVC만을 위한 테스트이다. 컨트롤러에 대한 테스트를 진행할 때 사용한다.
- @SpringBootTest를 사용했을 때보다 훨씬 빠르다.
- 개별 테스트가 가능해진다.
- 하지만 실제 환경과의 유사도 측면에서는 @SpringBootTest보다 제한적이기에 예상 밖에 동작 오류를 잡아내지 못할 수도 있다.
참고하면 좋은 블로그 : https://ksh-coding.tistory.com/53
출처
https://codingjavaman.tistory.com/3
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html