티스토리 뷰

728x90
반응형

목차

     

    Program, Process, Thread

     

    프로그램, 프로세스, 그리고 스레드는 모두 컴퓨터에서 실행되는 코드를 가리킨다.

     

    하지만 당연하게도 중요한 차이점들이 있는데, 짧게 정리하면 아래와 같다.

     

    1. 프로그램
      프로그램은 실행 가능한 코드와 데이터의 집합이다. 실행 파일이나 라이브러리 형태로 디스크에 저장되며
      실행되기 전에 디스크에서 메모리로 로드되는데, 이를 '프로그램 인스턴스'라고 한다.
    2. 프로세스
      위에서 말한 '프로그램 인스턴스'가 바로 프로세스이다.
      다시 한번 정리하자면 프로그램이 실행되어 운영체제에 의해 메모리상에 올라가면 이를 프로세스라 부른다.
      따라서 운영체제로부터 자원을 할당받는 작업의 단위라 볼 수 있으며, 프로세스 사이에는 자원이 공유되지 않는다.
      이 때문에 Context Switching의 비용이 크다는 단점이 있지만,
      하나의 프로세스에서 발생한 오류가 다른 프로세스에 전파되지 않아 안정적이라는 장점도 있다.
    3. 스레드
      스레드는 다시 이 프로세스 안에서 실행되는 작업의 최소단위이다. 당연히 프로세스로부터 자원을 할당받는다.
      하나의 프로세스에 여러 개의 스레드가 존재할 수 있으며, 스레드 사이에선 힙메모리, 데이터, 코드를 공유한다.
      이 때문에 Context Switching의 비용이 작다는 장점이 있지만,
      하나의 스레드에서 발생한 오류가 다른 스레드에 영향을 미친다는 단점과
      공유자원에 대한 동시접근 문제를 해결해야 한다는 까다로움이 있다.

    요약하면 프로그램은 실행 가능한 코드와 데이터의 집합,

     

    프로세스는 메모리에 올라가 실행 중인 프로그램,

     

    스레드는 프로세스 내부에서 실행되는 작업의 단위를 가리킨다.

     

    Compiler, Interpreter

     

    컴파일러와 인터프리터는 모두 프로그래밍 언어를 실행 가능한 형태로 변환하는 일종의 소프트웨어이다.

     

    여기서 실행 가능한 형태란 대략

     

    • 기계어 - 컴퓨터 CPU에서 직접 이해하고 실행할 수 있는 2진수 코드
    • 어셈블리어 - 비교적 인간이 이해하기 쉬운 언어. 기계어와 1:1 대응이 되며, 어셈블러에 의해 변환된다.
    • 바이너리 코드 - 역시 2진수 코드이지만, 컴파일 대상이 실행 가능한 형태로 변환된 것을 가리킨다.
    • 바이트 코드 - JVM에서 실행하기 위한 코드. 자바 파일을 컴파일하면 생성된다.
    • 네이티브 코드 - 특정 하드웨어와 OS에 맞는 기계어 코드. 

    등이 있다.

     

    계속해서 차이점을 보자면

     

    Compiler

     

    컴파일러는 소스코드를 분석한 뒤 바로 실행 가능한 기계어로 변환한다.

     

    이 기계어는 OS에 의해 직접 실행되며, 소스코드 분석을 먼저 마치고 변환 후에 실행파일을 생성하기 때문에

     

    런타임에 변환 작업이 필요하지 않다.

     

    대표적인 컴파일러로는 

     

    • GCC(GNU Compiler Collection)
      리눅스, 유닉스 운영체제에서 사용되는 C, C++, Objective-C, Fortran, Ada를 위한 컴파일러
    • Clang
      리눅스, 유닉스, 윈도우 등에서 사용되는 C, C++, Objective-C, Objective-C++ 컴파일러
    • Visual C++
      윈도우에서 사용되는 C++ 컴파일러

    등이 있다.

     

    Interpreter

     

    인터프리터는 컴파일러와 다르게 작성된 소스코드를 실행 시 한 줄씩 읽어서 기계어로 변환한다.

     

    소스가 처음 실행되는 속도가 빠르고 디버깅이 쉬우며 메모리를 효율적으로 쓸 수 있다는 장점이 있지만

     

    런타임시에는 한 줄씩 읽어 변환하는 탓에 속도가 느리다는 단점이 있다.

     

    인터프리터는 인터프리터 언어 별로 굉장히 다양한 종류가 있으며,

     

    대표적인 인터프리터 언어로는 Python, Ruby, JavaScript 등이 있다.

     

    JVM

     

    그럼 JVM은 뭐야? 자바는 왜 안 보여?

     

    JVM은 말 그대로 자바 가상 머신으로, 자바 바이트 코드를 실행하기 위해 인터프리터와 JIT 컴파일러를 모두 사용한다.

     

    자바 컴파일러에 의해 변환된 자바 바이트 코드를 인터프리터로 실행하는 동시에 JIT 컴파일러가 바이트코드를

     

    네이티브 코드로 변환해 캐싱한다. 이후 같은 코드가 호출되면 캐시 된 네이티브 코드를 사용하기 때문에 속도가 빠르다.

     

    즉, JVM은 컴파일러와 인터프리터 역할을 모두 수행한다고 할 수 있다.

     

    JIT 컴파일러(Just-In-Time Compiler)

     

    JIT 컴파일러는 위에 적었듯 바이트코드를 실시간으로 네이티브 코드로 변환하는 컴파일러이다.

     

    이와 같은 작업을 통해 인터프리터의 단점인 속도 저하를 극복할 수 있다.

     

    참고로 파이썬의 JIT 컴파일러가 바로 그 유명한 PyPy3(물론 인터프리터 기능도 있다)이다.

     

    RAM

     

    램이 하드디스크보다 비싼 이유는 매우 단순하다. 그래도 나열해 보면 아래와 같은 나선이다.

     

    • 고밀도 집적 회로이며 작은 크기에 많은 트랜지스터가 들어가 있어 만들기가 어렵고 비용이 많이 든다.
    • 따라서 대량생산이 가능한 하드디스크와 달리 한정된 양만 생산된다.
    • 시스템 확장과 성능 개선에 있어 하드디스크에 비해 더 필수적이다.
    • 즉, 만들기가 어려워 공급은 정해져 있기 때문에 수요에 따라 가격이 크게 변동하며 기본적으로 비싸다.

    집적 회로(IC) - 특정 기능을 위해 전기 회로와 반도체 소자(트랜지스터)를 하나의 칩으로 구현한 것. 반대말은 이산 회로이다.

    트랜지스터 - 전기의 흐름을 제어하고 정보를 처리하기 위한 반도체 소자.

     

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/09   »
    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
    글 보관함