ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로세스(Process) & 스레드(Thread) 정리
    WEB & CS 2023. 8. 13. 14:45

    * 프로세스와 스레드를 공부하기 전에 알아두면 좋은 정보

    1. 메모리 구조
      • code
        • 실행 명령을 포함하는 코드들
        • cpu가 처리
      • data
        • 전역변수(global)와 정적(static)변수가 저장
        • 프로그램이 종료되면 소멸된다.
      • heap
        • 동적 메모리 영역
        • 사용자가 관리할 수 있는 메모리
        • 메모리의 낮은 주소에서 높은 주소 방향으로 할당
      • stack
        • 지역변수, 매개변수등의 일시적인 데이터가 저장
        • 함수 호출이 완료되면 소멸
        • Last-In First-Out방식에 따라 동작

    memory

     

    * context swiching

    • cpu에서 여러 프로세스를 돌아가면서 작업을 처리하는 과정
    • 인터럽트를 발생시켜 CPU에서 실행중인 프로세스를 중단하고 다른 프로세스를 처리하기 위한 과정
      1. 현재 실행중인 프로세스의 상태(context)를 먼저 저장
      2. 다음 프로세스를 동작시켜 작업을 처리
      3. 이전에 저장된 프로세스의 상태(context)를 다시 복구

    * 인터럽트 : CPU가 프로세스를 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요함을 CPU에게 알림

     

    프로세스(Process)

    • 프로세서에 의해 실행되는 프로그램이다.
    • 하나 이상의 스레드를 가지고 있다.
    • OS로부터 자원을 할당받음
    • 메모리에 올라온 프로그램의 독립적인 인스턴스
      • 독립적인 메모리 구조를 갖는다.
      • 다른 프로세스의 변수나 자료구조에 접근이 어렵다.
      • 다른 프로세스에 접근하기 위해서 파이프, 소켓등의 IPC를 사용해야한다.

    process

     

     

    스레드(Thread)

    • 프로세스 내에서 실행되는 여러 흐름의 단위
    • 프로세스가 할당받은 자원을 이용
    • 프로세스의 stack만 독립적으로 할당받고 나머지(heap, data, code)는 공유한다.
    • 다른 프로세스의 스레드에는 접근이 어렵다.
    • 동일 프로세스에서 한 스레드가 자원을 변경하면 다른 스레드는 결과를 즉시 확인할 수 있다.

    thread

     

    멀티 프로세스

    • 여러 프로세스를 구성해 프로그램을 구동
    • 하나에 프로세스에 문제가 발생해도 다른 프로세스에는 영향이 없다.
    • context swiching 비용이 크게 발생한다.
    • context swiching 과정에서 모든 데이터를 지우고 다시 정보를 불러와야한다.

     

    멀티 스레드

    • 여러 스레드로 구성하고 각 스레드로 하나의 작업을 처리
    • 시스템 자원의 효율성 증대
    • context swiching 비용이 적어진다.
    • 메모리를 공유하고 있기 때문에 context swiching 과정에서 속도가 빠르고 통신에 대한 부담이 적다.
    • 자원 공유를 전역변수를 이용해 충돌이 발생해 동기화 문제가 발생한다.
    • 하나에 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다.
    • 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.

     

     

    * Java에서의 Thread

    • JVM에 의해 관리되고 있다.
    • 프로세스가 존재하지 않는다.
    • main()도 하나의 스레드이다.
    • main() 이외에 다른 스레드를 생성하려면 Thread클래스를 상속받거나 Runable 인터페이스를 구현한다.
    class Msg implements Runnable {
        @Override
        public void run() {
    		for (int i = 0; i < 10; i++) {
    			System.out.println("msg.....");
    			try {
    			    Thread.sleep(500);
    			} catch (InterruptedException e) {
    			    e.printStackTrace();
    			}
    		}
        }
    }
    
    class Dev extends Thread {
        @Override
        public void run() {
    		for (int i = 0; i < 10; i++) {
    			System.out.println("dev.....");
    			try {
    			    Thread.sleep(500);
    			} catch (InterruptedException e) {
    			    e.printStackTrace();
    			}
    		}
        }
    }
    
    
    class Main {
        public static void main(String[] args) {
            
            Msg m = new Msg();
            Thread thread_msg = new Thread(m);
            thread_msg.start();
            
            Dev d = new Dev();
            d.start();
            
    		for (int i = 0; i < 10; i++) {
    			System.out.println("main.....");
    			try {
    			    Thread.sleep(500);
    			} catch (InterruptedException e) {
    			    e.printStackTrace();
    			}
    		}
        }
    }

    * 결과

    위 코드 실행 결과

     

Designed by Tistory.