[TIL] 1월 21일

yeon·2021년 1월 21일
1

프로세스와 스레드

참고: 이화여대 반효경 교수님의 운영체제 강의, 운영체제와 정보기술의 원리 책, 아래 첨부한 블로그들

운영체제

프로세스와 스레드의 차이

프로세스(PROCESS) , 스레드(THREAD) #2

프로세스란

  • process is a program in execution 실행중인 프로그램

  • 디스크에서 실행파일로 존재하던 프로그램이 메모리에 올라가서 실행되면 프로세스가 된다.

  • 시분할 시스템에서는 여러 프로세스가 함께 수행되어서 CPU를 획득해서 사용하고, 일정 시간이 되면 뺏기는 것이 반복된다.

    • 이때 CPU를 다시 획득할 때 어느 부분까지 명령을 수행했는지 재현해야 한다.
    • 프로세스가 현재 어느 상태에 와있느냐를 나타낸 것이 프로세스 문맥(context)이다.
  • 프로세스의 문맥(context)

    • 프로세스가 실행되면 프로세스만의 독자적인 주소 공간(stack, data, code)을 갖는다.

      프로세스가 CPU를 잡게되면 CPU의 PC(program counter)가 프로세스의 code의 어느 부분을 가르키고 있고, 매순간 프로세스의 code에서 instruction을 CPU 안으로 불러들여서 값을 넣고 연산을 하고, 그 결과를 레지스터 또는 프로세스의 메모리에 저장한다.

      이러한 과정을 거치는 프로세스가 지금 어느 상태에 와있느냐를 나타내는 것이 프로세스의 문맥이다.

  • 원칙적으로 프로세스는 각자의 주소공간을 가지고 수행되므로 다른 프로세스의 수행에 영향을 미치지 못한다.

    • 경우에 따라서 독립적인 프로세스들이 협력할 때 정보를 공유하고, 처리 속도가 향상되는 등의 이유로 더 효과적일 수 있다.
    • 이러한 이유로 운영체제는 프로세스간의 협력 메커니즘을 제공한다.
  • 프로세스간 협력 메커니즘(IPC : Inter Process Commmunication)

    프로세스간의 통신(communication)과 동기화를 이루기 위한 메커니즘

    IPC를 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있다.

    • message passing : 커널을 통해 프로세스간 메시지 전달(프로세스간 직접 전달 불가능)
    • shared memory : 서로 다른 프로세스간에도 일부 주소공간을 공유하게 하는 shared memory 메커니즘 존재 (원칙적으로 프로세스는 각자의 주소공간을 갖고 있지만, 그럼에도 불구하고 일부 주소공간을 공유하는 것)

프로세스의 상태(process state)

프로세스는 상태(state)가 변경 되며 수행된다.

  • Running
    • CPU를 잡고 instruction(지시)를 수행중인 상태
  • Ready
    • CPU를 기다리는 상태 (메모리 등 다른 조건을 모두 만족하고 있음)
  • Blocked(wait, sleep)
    • CPU를 주어도 당장 instruction 을 수행할 수 없는 상태
    • process 자신이 요청한 이벤트가 오래걸리는 작업이라(ex) I/O) 즉시 만족되지 않아서, 이를 기다리는 상태
    • 디스크에서 file을 읽어오는 경우 등 (I/O등의 event 를 스스로 기다리는 상태)
  • Suspended(Stoped) → 메모리를 통째로 빼앗긴 상태
    • 외부에서 강제로 정지시켜놓은 상태(프로세스가 정지된 상태)
    • 프로세스는 통째로 메모리에서 쫓겨나고 디스크에 swap out 된다. (중기 스케쥴러)
    • 예) 사용자가 프로그램을 일시 정지 시킨 경우, 메모리에 너무 많은 프로세스가 올라와 있을때

*구분

-Blocked : 자신이 요청한 event 가 만족되면 ready

-Suspended : 외부에서 resume(재개)해 주어야 Active

  • new : 프로세스가 생성중인 상태
  • Terminated : 수행(execution)이 끝난 상태, 정리한 것이 남아있는 상태(정리가 끝나면 더이상 프로세스가 아니다.)

Thread

프로세스내에서 CPU 실행단위

스레드는 프로세스 하나에서 공유할 수 있는 건 최대한 공유한다.

  • Thread 의 구성
    • Program Counter
    • register set
    • stack → 프로세스가 할당받은 메모리영역 중에서 stack 영역만 스레드마다 따로 갖는다.
  • 스레드가 동료 스레드와 공유하는 부분

    → Thread 가 여러개여도 task는 하나

    • code
    • data
    • heap
    • OS resources

멀티 Thread 의 장점

  • 응답성(Responsiveness)

    • 사용자의 입장에서 빠르다.

      → 하나의 프로세스가 스레드를 여러개 두는 경우, 하나의 스레드가 blocked(wait)상태일 때,

      다른 스레드가 CPU를 잡고 running 할 수 있어서 응답시간이 빨라진다.

  • 자원 공유(Resource Sharing)

    • n Threads can share code, date, resource of the process
    • n개의 스레드는 code, data, heap, 프로세스의 자원을 공유한다.
  • 경제성 (Economy, 응답성과 다른 의미로 빠르다는 걸 의미)

    • 스레드를 생성하고, 스레드간의 CPU문맥교환이 일어나는 것이, 프로세스가 하나 생성되고 프로세스간 문맥교환이 일어나는 것보다 훨씬 간단함
  • Utilization of MP Architectures (MP : Multi Process, CPU가 여러개 있는 환경)

    • 각각의 스레드가 서로 다른 CPU 에서 병렬적으로 일할 수 있다.
    • CPU의 개수가 여러개 일 때만 해당

멀티 Thread 단점

  • 하나의 스레드만 실행 줄 일때는 실행시간이 오히려 지연될 수 있다.
  • 스레드 스케쥴링을 신경써야 한다.
  • 자원 공유 문제가 발생한다.(동기화 문제)
    • 서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 다른 스레드가 사용중인 변수나 자료구조에 잘못 접근할 수 있다.
  • 하나의 스레드에 문제가 생기면 전체 프로세스에 영향을 끼친다.
  • 구현과 디버깅이 어렵다.
  • 교착상태에 빠지지 않도록 주의해야한다.

프로세스 메모리 구조

아래 블로그 참조함

https://kyu9341.github.io/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/2020/10/04/OS_Process_Structure/

  1. Stack 영역
    • 프로그램이 자동으로 사용하는 메모리 영역
    • 함수 호출과 관계되는 지역변수, 매개변수를 저장한다.
    • 함수 호출 시 생성되고 함수가 끝나면 반환된다.
    • stack의 사이즈는 각 프로세스마다 할당되지만 프로세스가 메모리에 올라갈 때 크기가 고정되어 있어서 런타임시 크기를 변경할 수 없다.
    • 명령 실행 시 자동으로 증가, 감소하기 때문에 보통 메모리의 마지막 번지를 지정한다.
  2. Heap 영역
    • 필요에 의해 메모리를 동적 할당할 때 사용하는 메모리 영역
    • 동적 데이터 영역
    • 메모리 주소값에 의해 참조되고 사용하는 영역

→ Stack과 Heap은 사실 같은 공간을 공유한다. heap이 메모리의 낮은 주소부터 할당되면 stack은 높은 주소부터 할당된다. 각 영역이 상대 공간을 침범하면 stack overflow, heap overfloew라고 한다.

  1. Data 영역(BSS, GVAR)
  • 프로그램이 실행시에 생성되고, 종료되면 시스템에 반환된다.
  • 전역변수, 정적변수, 배열, 구조체 등이 저장된다.
  • 초기화 된 데이터는 Data(GVAR)영역에 저장되고, 초기화되지 않은 데이터는 BSS(Blocked Stated Symbol)영역에 저장된다.

→Data 영역과 BSS영역을 구분하는 이유?

초기화된 데이터는 초기값을 저장해야해서 Data영역에 저장되어 ROM에 저장된다. 하지만 초기화되지 않은 데이터까지 ROM에 저장한다면 더 큰 사이즈의 ROM이 필요해서 Data영역과 BSS영역으로 나누었다.

  1. Code(Text)영역
  • 실행명령을 포함하는 코드들이 들어가는 부분
  • 코드 자체를 구성하는 메모리 영역
  • 프로그램 명령이 위치하는 곳
  • 기계어로 제어되는 메모리 영역
  • 프로그램을 시작할 때 컴파일한 프로그램이 저장되어 있다.
    • 읽기 전용 영역이여서 프로세스가 함부로 변경할 수 없다.
    • 변경 시 오류 발생

*결론 : 프로세스와 스레드의 차이란? (면접 단골 질문)

프로세스는 실행중인 프로그램을 뜻하고, 스레드는 그 프로세스안의 CPU 실행 단위이다.

프로세스는 운영체제에게 메모리 영역(Code, Data, Stack, Heap)을 할당 받고, 운영체제에게는 프로세스가 최소 작업 단위이다.

스레드는 프로세스 내에서 Stack 영역을 제외한 다른 메모리 영역을 다른 스레드와 공유한다.

프로세스는 다른 프로세스와 정보를 공유하려면 IPC(프로세스간 협력 메커니즘)을 이용해야하지만, 스레드는 메모리영역과 다른 자원들을 공유하기 때문에 정보 공유가 더 쉽다.

스레드의 스케쥴링은 운영체제가 담당하지 않아서 프로그래머가 직접 동기화문제를 다뤄야한다.


자바의 정석 ch8 예외처리 학습

예외 발생 시키기

키워드 throw를 이용해 고의로 예외를 발생시킬 수 있다.

  1. 연선자 new를 이용해서 예외 클래스의 객체를 만든다.
    • Exception e = new Exception("고의로 발생시켰음");
  2. 키워드 throw를 이용해서 예외를 발생시킨다.
    • throw e;

→ 위의 두 과정을 한줄로 요약할 수 있다.

  • throw new Exception("고의로 발생시켰음");

  • Exception 인스턴스를 생성할 때, 생성자에 String을 넣어주면 이 String이 Exception 인스턴스의 메시지로 저장된다. 이 메시지는 getMessage()를 이용해서 불러올 수 있다.

checked 예외와 unchecked예외

  • checked 예외 : 컴파일러가 예외 처리 여부를 체크함 (예외처리 필수)

    → Exception과 그 자손

  • unchecked 예외 : 컴파일러가 예외처리 여부를 체크 안함 (예외처리 선택)

    → RuntimeException과 그 자손

메서드에 예외 선언하기

예외를 처리하는 방법 세가지

  1. try-catch 문 사용 (직접 처리)
  2. 예외 선언 (예외 떠넘기기, 알리기)
  3. 은폐 (덮기) : 빈 catch문 → 이 방법은 되도록 쓰지 않는다.
void method() throws Exception1, Exception2, ... ExceptionN {
		// 메서드 내용
}
  • 메서드에 예외 선언한 것

    • 예외를 메서드의 throws에 명시하는 것은 예외를 처리하는 것이 아니라, 호출한 메서드에게 예외처리를 떠넘기는 것
  • 이 메서들를 호출하면 이런 예외가 발생할 것이라고 알려주는 것

  • 이 메서드를 호출하는 쪽에서 예외처리를 해준다. (try-catch문 또는 예외 선언(던지기) )

  • 메서드 내에서 예외처리를 할지, 호출하는 쪽으로 던져서 호출하는 쪽에서 예외처리를 하게 할지는 직접 판단해서 try-catch 문을 어디에 넣을지 결정한다.

  • Java API문서를 보고 사용하고자 하는 메서드의 선언부와 Throws:를 보고, 이 메서드에서는 어떤 예외가 판단할지 보고 예외처리를 해주는 것이 좋다.

    • 이때 Throws: 중에서 checked 예외만 메서드에 선언한다. (checked 예외 : 예외처리가 필수적인 예외)
  • 예외 선언 예제

import java.io.File;

public class ExceptionEx16 {
    public static void main(String[] args) {

        try {
            File f = createFile("");
            System.out.println(f.getName() + "파일이 성공적으로 생성되었습니다.");

        } catch (Exception e) {
            System.out.println(e.getMessage() + "다시 입력해 주시기 바랍니다.");
        }
    }

    static File createFile(String fileName) throws Exception {
        if (fileName == null || fileName.equals("")) throw new Exception("파일 이름이 유효하지 않습니다.");
        File f = new File(fileName);
        f.createNewFile();
        return f;
    }
}

Finally블럭

예외 발생 여부에 상관없이 무조건 실행될 코드를 포함한다.

코드 중복을 제거하는 기능

  • 예외가 발생한 경우
    • try → catch → finally 순으로 실행
  • 예외가 발생하지 않은 경우
    • try → finally 순으로 실행

오늘 한 일

  • 프로세스란? 프로세스의 문맥이란? 프로세스간의 협력방법? IPC란? 프로세스의 상태는 무엇이 있나? 스레드란? 멀티 스레드의 장점? 멀티 스레드의 단점? 프로세스 메모리의 구조? 프로세스와 스레드의 차이점?
  • 자바의 정석 예외처리 파트 학습
    • 고의로 예외 발생 시키는 법, checked 예외와 unchecked예외, 메서드에 예외 선언하는 법(throws ...), finally 블럭의 기능

Todo

(주말 학습)

  • 자바의 정석 학습
  • 코딩연습 많이하기

3개의 댓글

comment-user-thumbnail
2021년 1월 22일

아니 그 논문은 추천해 준 건 아니구요 ㅎㅎ 그런 것도 있다 정도입니다. 읽지 말고 다른 자바 공부 더 하시는 걸 추천!
정리 넘 잘하셨네요!

1개의 답글