ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3월 31일 금요일 TIL 회고록
    카테고리 없음 2023. 3. 31. 16:04

    프로세스

    • 프로세스란 실행중에 있는 프로그램
    • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
    • 스케줄링에 대상이 되는 작업(Task)와 같은 의미로 쓰인다.
    • 프로세스 내부에는 최소 하나의 스레드(thread)를 가지고 있는데, 실제로는 스레드(thread)단위로 스케줄링을 한다.
    • 하드디스크에 있는 프로그램을 실행하면 실행을 위해서 메모리 할당이 이루어지고 , 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라 불린다.
    • 프로세스의 문맥(context)
      • CPU 수행 상태를 나타내는 하드웨어 문맥
      • Program Counter
      • 각종 Register
      • 프로세스의 메모리 영역
        • Code 영역
          • 실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역이다. CPU는 코드영역에 저장된 명령어들을 하나씩 처리한다.
        • Data 영역
          • 코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역이다. 프로그램이 실행되면서 할당되고 종료하면서 소멸된다.
        • Stack 영역
          • 함수 안에서 선언된 지역변수,매개변수,리터값 등이 저장된다.함수 호출 뒤 기록되고 종료되면 제거된다.
        • Heap 영역
          • 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 자유공간이다.

     

    스레드

    • 프로세스 하나만을 사용해서 프로그램을 실행시키기에는 메모리의 낭비가 발생한다. 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
    • 즉, 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다. 스레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍 언어의 가장 작은 시퀀스이다. 하나의 프로세스는 하나 이상의 스레드를 갖고 있다.

    • 스레드가 독립적으로 가지고 있는 부분
      • 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://velog.io/@aeong98/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C

    https://codingjavaman.tistory.com/3

    https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

Designed by Tistory.