ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Process와 Thred
    Computer Science 2020. 9. 24. 03:27

    프로그램

    어떤 작업을 위해 운영 체제 위에서 실행할 수 있는 프로그램 또는 파일

     

    프로세스

    운영체제 위에서 실행중인 프로그램

    프로그램 명령어와 데이터들이 메모리에 올라오고 실행 중 또는 실행 대기중인 상태

     

    window os 위에서 실행중인 프로세스

    프로세서

    프로세스가 동작될 수 있도록 하는 하드웨어(CPU)

     

    멀티 태스킹

    OS를 통해 여러 프로세스(프로그램)을 실행하고, 관리하는 것.

    CPU가 작업하는데 필요한 자원(시간)을 프로세스 또는 스레드 간에 나누는 행위. 이를 통해 여러 응용프로그램을 동시에 열고 작업할 수 있음.

    CPU는 한순간에 하나의 프로세스만 실행할 수 있음. 하지만 우리는 여러가지 작업을 동시에 할 수 있음.

     

    운영체제가 짧은 시간에 수십번에서 수천번 실행할 프로세스를 교체하고 있기 때문에, 우리는 동시에 여러 개의 작업이 실행되고 있다고 느낄 수 있다.

    그림에서는 여러 프로세스가 동시에 실행되고 관리 되는 것처럼 보이지만, 사실 CPU는 한번에 한가지 명령어밖에 처리하지 못한다. 즉, 동시가 아닌 재빠르게 프로세스들을 번갈아가고 실행하고 관리하는 것이다. 이를 '문맥교환'이라고 한다.

     

    여러 프로세스를 관리하는 OS의 모습

     

    문맥교환 (Context Switching)

    여러가지 테스크가 빠르게 교체됨. 이 교체되는 순간을 문맥교환이라함.

    하나의 프로세스가 CPU를 사용중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업

    문맥교환은 OS의 CPU자원을 할당하는 스케줄러에 의해 발생한다.

    CPU를 적절하고 효율적으로 사용할 수 있도록 하는 작업을 스케줄링이라 한다.

     

    CPU Sheduler (스케줄러)

    스케줄러는 레디 큐에 존재하는 프로세스들을 특정한 우선순위를 기반으로 CPU를 할당받게 해주는 역할을 한다.

    스케줄링의 목적 3가지

    1. CPU를 최대한 활용하기
    2. 대기시간 최소화하기
    3. 처리량 최대화하기

    스케줄링은 멀티 태스킹 작업을 만들어내는 데에 있어서 핵심적인 개념이다.

    스케쥴링을 구현하는데는 반드시 자료구조의 구현이 따르는데, 어떤 자료구조를 이용하는지가 스케쥴링에 중요한 요소이다. 대표적으로 Linked List, Hash List, Bitmap, Red-Black Tree 등이 있다.

    이를 구현하는 스케쥴링 알고리즘 따라 스케쥴링 종류가 또 나뉜다.

    • FCFS: First Come, First Serve 의 약자로, 말그대로 선착순 알고리즘이다. 먼저 도착한 프로세스를 처리하는 스케쥴링
    • SJF: Shorted Job First의 약자로, 최단 작업을 우선하는 스케쥴링이다.
    • Priority Scheduling: 미리 주어진 프로세스의 우선 순위에 따라서 스케쥴링하는 방식이다.
    • RR: Round Robin의 약자로, 정해진 시간에 주어진 만큼 프로세스를 할당한 뒤 작업이 끝난 프로세스는 레디큐의 가장 마지막에 가서 재할당을 기다린다.
    • Multilevel-Queue: 레디큐를 여러개의 큐로 분류하여 각 큐가 각각 다른 스케쥴링 알고리즘을 가지는 방식
    • Multilevel-Feedback-Queue: Multilevel-Queue는 특정 프로세스가 큐에 고정되어 있지만, Multilevel-Feedback-Queue는 큐와 큐 사이에 프로세스가 이동하는 것을 허용한다.

     

    PCB

    PCB(Process Control Block, 프로세스 제어 블록)는 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영체제 커널의 자료 구조이다.

     

    PCB가 필요한 이유는 Context-Switching 때문이다. CPU가 여러 프로세스를 빠르게 번갈아가면서 작업하기 위해서는 프로세스에 대한 정보 및 상태를 저장/복원할 필요가 있다.

    운영체제에 따라 PCB에 포함되는 항목이 다를 수 있지만, 일반적으로 다음과 같은 정보가 포함된다.
    - 프로세스 식별자(PID;Process ID)
    - 프로세스 상태(Process State)
    - 프로그램 계수기(Program Counter)
    - CPU 레지스터 및 일반 레지스터
    - CPU 스케줄링 정보메모리 관리
    - 정보프로세스 계정 정보
    - 입출력 상태 정보

     

    프로세스 상태

    프로세스 생명주기

    • new : 프로세스가 생성되는 상태
    • ready : 프로세스가 CPU에 할당되어, 처리되기를 기다리는 상태
    • running : 프로세스가 CPU에 할당되어, 명령어들이 실행되는 상태
    • waiting : 어떤 이벤트 발생으로 인해 프로세스가 기다리는 상태
    • terminated : 프로세스가 종료되는 상태

    프로세스 간 문맥 교환(Context Switching)

    두 프로세스 P0, P1이 있다고 가정한다. 현재 P0은 Running 상태, P1은 Ready 상태이다.

    이 상태에서 interrupt 또는 시스템 콜 이 발생하면 P0은 Running이 아닌 Ready 상태로 전환된다.

    추후 복원될 P0을 위해 해당 프로세스 정보를 PCB에 담아 저장한다. P1은 이전에 저장한 PCB로 부터 상태를 복원하여 작업을 계속 수행한다. P1도 어느 시점이 되면 다시 Ready 상태가 되어 PCB에 상태를 담아 저장하고, P0이 PCB로 부터 복원되어 작업을 계속 수행할 것이다.

     

    이러한 작업의 반복 과정을 문맥 교환이라고 하는 것이다. 문맥교환도 메모리에 I/O를 하는 작업이기 때문에 실행되는 프로세스 수가 많거나, 빈번한 문맥교환은 Overhead를 발생시켜 성능 저하 결과를 가져온다.,

    해당 표를 보면 P0과 P1모두 idle 상태에 있는 시점이 있다.

     

     

     

    프로세스란?

    프로세스란 단순히 실행중인 프로그램.

    즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행중인 것을 의미한다.

    프로세스는 프로그램에 사용되는 데이터, 메모리 등 리소스와 스레드로 구성된다.

    프로그램이 메모리에 할당된 상태.

     

    프로세스의 메모리 영역

    • Stack -> 호출된 함수, 지역변수 등 임시 데이터

      • 함수 호출시 할동되고, 종료되면 제거된다.
      • 흔히 재귀함수를 통해 너무 많은 함수를 호출하게 되면 스택영역이 초고하하면서 StackOverFlow 에러가 발생한다.
    • Heap -> 동적으로 생긴 데이터

    • Data -> 전역변수, static 변수

      • 프로그램 시작과 함께 할당되어 종료될 때 소멸된다.
    • Code -> 프로그램의 코드

    힙 영역은 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 공간(Free Space)이다. 이 공간은 동적 메모리 할당 공간이므로 사용이 끝나면 운영체제가 쓸수 있도록 반납해야 한다. 프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리의 할당이 이루어지는 데이터 또는 스택과 같은 정적 메모리 할당과는 대조적이다. 동적 메모리 할당은 어느 시점에 어느 정도의 공간을 할당할 수 있을지 정확히게 예측할 수 없으므로, 런타임에 확인가능하다.

     

    IPC(Inter-Process Communication)

    각 프로세스는 별도의 공간에서 실행되기 때문에(자원을 공유하지 않기 때문에), 한 프로세스에서 다른 프로세스의 메모리 영역에 접근할 수 없다. 만약 프로세스가 다른 프로세스 자원에 접근하려면 IPC(Inter-Process Communucation)을 사용해햐 한다. 

    IPC란 OS 상에서 실행중인 프로세스 간에 정보를 주고받는 것을 말한다. 프로세스는 자신에게 할당된 메모리 내의 정보만 접근할 수 있는데, 이는 안정성을 위해 운영체제에서 자기 프로세스 메모리만 접근하도록 강제하고 있다는 것이다.

    IPC의 종료로는 메일슬롯, 파이프, 소켓, 시그널, 공유메모리 등이 있다. 안드로이드에서는 Parcelable이 있다.

     

     

    스레드란?

    스레드란 프로세스 내에서 실제로 작업을 수행하는 주체

    모든 프로세스는 한 개 이상의 스레드가 존재하여 작업을 수행

    스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 하나의 애플리케이션(프로그램)은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다. 즉 프로세스를 생성하면 기본적으로 하나의 (메인)스레드가 생성되는 셈이다.

     

    메모리 관점에서 본 프로세스와 스레드

    프로세스는 실행될 때 운영체제로부터 각각 독립된 메모리 영역을 할당 받는다. 스레드는 한 프로세스 내에서 동작되는 흐름으로 프로세스 내에서 Stack 영역만 별도로 할당 받고, 부모 프로세스의 Code, Data, Heap 영역은 공유 한다. 즉, 프로세스내에서 자식 스레드들은 서로 주소 공간이나 자원들을 공유하면서 실행될 수 있다.

     

    멀티쓰레드 프로그래밍이란?

    하나의 프로세스(프로그램) 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것.

     

    멀티 프로세스란? 

    멀티 프로세스는 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것.

    멀티 프로세스란 하나의 애플리케이션을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것이다.

    - 멀티 프로세스는 다음과 같은 특징이 있다.
    - 안정성이 좋다.
    - 여러개의 자식 프로세스 중 하나에 문제가 발생해도, 다른 자식 프로세스에 영향이 확산되지 않는다.
    - 구현이 비교적 간단하고, 각 프로세스들이 독립적으로 동작하며 자원의 서로 다르게 할당된다.
    - 프로세스 간 통신을 하기 위해서는 IPC를 통해야 한다.
    - 메모리 사용량이 많다.
    - 스케쥴링에 따른 Context Switch이 많아지고, 성능 저하의 우려가 있다.

     

     

    멀티 스레드

    멀티 스레드란 하나의 애플리케이션을 여러 개의 스레드로 구성하여 하나의 스레드가 하나의 작업을 처리하도록 하는 것이다. 일반적으로 멀티스레드르 사용하는 이유는 사용자와 상호작용하는 애플리케이션에서 단일 스레드로 Network 또는 DB 와 같은 긴 작업(Long-running task) 을 수행하는 경우 해당 작업을 처리하는 동안 사용자와 상호작용이 불능인 상태가 될 수 있기 때문이다.

     

    멀티 스레드는 다음과 같은 특징이 있다.
    응답성이 좋다.
    프로그램의 일부분(자식 스레드)이 오류 또는 긴 작업으로 인해 중단되어도 프로그램이 계속 적으로 수행된다.
    자원 공유가 쉽다.
    스레드들은 부모 프로세스의 자원과 메모리를 공유 할 수 있다.
    프로세스를 할당하는 것보다 스레드를 할당하는 것이 비용이 적다.
    멀티프로세서 구조에서 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있다.
    구현 및 테스트, 디버깅이 어렵다.
    너무 많은 스레드 사용은 오버헤드를 발생시킨다.
    동기화 그리고 교착상태가 발생하지 않도록 주의해야 한다.
    자식 스레드 중 하나에 문제가 생긴경우 전체 프로세스에 영향을 줄 수 있다.

    프로세스는 요리사, 쓰레드는 사용가능한 후라이팬에 비유할 수 있다.

     

     

    멀티프로세스와 멀티 스레드 비교

     

    *멀티 프로세스는 각 프로세스가 독립적인 메모리를 가지고 별도로 실행되지만, 멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유한다는 점이 다릅니다.

    멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유하므로, 시스템 자원의 낭비가 적습니다.

    또한, 하나의 스레드가 작업을 할 때 다른 스레드가 별도의 작업을 할 수 있어 사용자와의 응답성도 좋아집니다.

     

    *프로세스는 하나의 프로그램이고, 스레드는 프로세스 안에서 실제로 작업을  수행하는 단위이다.

    하나의 프로세스에 여러개의 스레드가 작업을 수행할 수 있는데, 이를 멀티 쓰레딩이라고 한다.

    멀티 쓰레딩은 하나의 프로세스 안에서 프로세스의 메모리를 공유한다. 이 때 공유 객체에 여러 쓰레드가 동시에 접근하지 못하도록 막기 위한 기법이 Lock이다. 락은 모든 객체가 힙 영역에 생성될 때 자동으로 만들어진다.

    멀티 스레드는 멀티 프로세스에 비해 상당한 이점을 가지는 반면 위험 부담도 따른다. 그 이유를 알아보자.

    자원의 효율성증대

    멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우 프로세스를 생성하여 자원을 할당하는 비용이 적고, 스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.

    응답 시간 단축 및 처리 비용 감소

    프로세스간 IPC를 사용하여 통신하는 것은 상대적으로 비용이 크다. 하지만 스레드는 프로세스의 메모리 영역을 공유하여 스레드 간의 통신 비용이 적게 든다. 또한 프로세스간의 Context Switching은 느린 반면 쓰레드간의 Context Switching 은 빠른데, 그 이유는 Context Switching  시 스레드는 Stack 영역만 처리하면 되기 때문이다.

    멀티 스레드의 안정성 문제

    여러 개의 스레드가 동일한 데이터 공간(Critical Section)을 공유하면서 이들을 수정한다는 점에 필연적으로 생기는 문제이다. 멀티 프로세스의 프로그램은 문제가 생기면 해당 프로세스가 중단되거나 중단 시키고 다시 시작 하면된다. 하지만 멀티 스레드 방식의 프로그램에서는 하나의 스레드가 자신이 사용하던 데이터 공간을 망가뜨린다면, 해당 데이터 공간을 공유하는 모든 스레드를 망가뜨릴 수 있다.

    Critical Section: 임계 구역(critical section) 또는 공유변수 영역은 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부를 말한다.

     

     

     

     

     

    DeadLock(교착상태)이란?

    • 공유 객체에 여러 스레드가 동시에 접근하지 못하도록 하기 위한 것으로, 모든 객체가 힙 영역에 생성될때 자동으로 만들어집니다.

    • 프로세스들이 더 이상 진행을 못하고 영구적으로 블록되어 있는 상태로, 시스템 자원에 대한 경쟁 도중에 발생할 수도 있고 프로세스간의 통신 과정에서도 발생할 수 있습니다.

    • 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있기 때문에 결과적으로는 아무것도 완료되지 못하는 상태를 말합니다.

    • 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태로, ‘교착 상태’라고도 하며, 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생합니다

    P1과 P2가 리소스 A, B 둘 다를 얻어야 한다고 가정할 때,

    t1에 P1이 리소를 A를 얻고 P2가 리소스 B를 얻었다면 t2때 P1은 리소스 B를, P2는 리소스 A를 기다리게 됩니다.

    하지만 서로 원하는 리소스가 상대방에게 할당되어 있기 때문에 이 두 프로세스는 무한정 기다리게 되는데 이러한 상태을 DeadLock상태라고 합니다.

     

    경쟁상태 (Race Condition) - 교착상태의 한 종류

    둘 이상의 입력이나 조작이 동시에 일어나 의도하지 않은 결과를 가져오는 경우를 말합니다.

    - 파일 또는 변수와 같은 공유 자원을 접근하는 하나 또는 그 이상의 프로세스들의 다중 접근이 제대로 제어되지 않은 것을 말합니다.

    - 프로세스들 끼리 하나의 자원을 갖기 위해 싸우는 것, 하나의 자원을 동시에 요청


    라이브락 (Livelock)

    한 프로세스가 이미 자원을 점유한 상태에서 다른 프로세스가 그 자원을 사용하기 위해 무한정 대기상태에 빠지는 것을 라이브락이라 합니다.



    출처: https://roxxy.tistory.com/entry/OS-경쟁상태-교착상태-라이브락-Race-Condition-Deadlock-Livelock [AreYou준비]
    출처: https://roxxy.tistory.com/entry/OS-경쟁상태-교착상태-라이브락-Race-Condition-Deadlock-Livelock [AreYou준비]



    코어 (H/W)

    - CPU칩셋에 물리적으로 존재하는 코어 유닛 갯수이다. 명령어를 가져와 계산하고 해석하는 반도체 유닛이 n개 있다는 것을 뜻한다.

    - 쉽게 설명하자면 주방에 요리사 숫자가 n명 이라는 것과 동일하다.

     

    쓰레드 (H/W)

    - 논리적인 부분으로 접근해야한다. 한 코어에는 하나의 쓰레드를 가지고 작업한다. 기술의 발달로 현재는 하나의 코어가 두개의 쓰레드를 가지고 작업을 한다. 

    - 쓰레드는 요리할 수 있는 프라이팬에 비유할 수 있다. 프라이팬이 m개 있다는것

    - 이 것을 응용하면 요리사(코어)n명이 프라이팬(쓰레드)를 m개 가지고 요리한다는 것을 의미한다. 


    안드로이드에서 Thread를 쓰는 이유 

    기본적으로 한 어플리케이션 내의 모든 컴포넌트들은 같은 프로세스 내에서 동작해야 한다.

    어플리케이션이 launch되면, 안드로이드 시스템은 해당 어플리케이션이 메인쓰레드를 생성한다.

    메신 쓰레드는 UI위젯을 그리는 역할을 수행하기 때문이다. 또한 UI와 상호작용한다. 즉, 메인쓰레드는 UI와 상호작용하는 중요할 역할을 하고 있기 때문에 UI 쓰레드라고 한다.

     

    안드로이드 시스템은 어플리케이션을 구성하는 각 컴포넌트 객체마다 쓰레드를 생성하지 않는다. 동일한 프로세스 내에서 실행되는 모든 컴포넌트들은 UI 쓰레드에서 인스턴스화 되며, 각 컴포넌트들에 대한 호출은 UI 쓰레드에서 실행된다. 결과적으로, 시스템 콜백에 응답하는 메소드들은 항상 프로세스의 UI 쓰레드에서 실행되는 것이다.

     

    그러나, 만약 모든 일들이 UI 쓰레드에서만 처리되는 경우, 네트워크 접근이나 데이터베이스를 쿼리해오는 긴 작업을 수행하게 되면 모든 UI 가 블록되는 현상이 발생한다. UI 쓰레드가 블록되면, 그리기 이벤트와 같은 모든 이벤트들이 실행되지 않는다. 그렇게 되면 사용자 입장에서는 어플리케이션이 죽은 것처럼 보이고, 심지어 UI 쓰레드가 5초 이상 블록되면 ANR "어플리케이션이 응답하지 않음" 다이얼로그가 표시되게 된다.

     

    안드로이드 어플리케이션은 단일 스레드 모델이다. 따라서, UI 쓰레드가 아닌 다른 쓰레드에서는 UI 를 건드릴 수가 없다. 그래서 UI 쓰레드가 블록되지 않도록 하는 것이 중요하다. UI 쓰레드가 블록되면 화면에 UI 가 그려지지 않기 때문이다. 따라서 즉각적이지 않은 수행작업이 있는 경우에는 별도의 다른 스레드에서 작업을 수행해야한다.

     

    안드로이드에서 UI 를 업데이트는 main Thread , 즉 UI 쓰레드에서만 진행되어야 한다. UI 를 메인 쓰레드 이외의 다른 쓰레드에서 처리하기 위해서 Handler 라는 개념이 나왔다. Handler 는 서브스레드에서 작업한 것들을 메시지 큐에 담아서 UI 쓰레드에 선입선출 방식으로 전달해주는 역할을 수행한다.

     



    출처: https://12bme.tistory.com/68 

     

    [병렬프로그래밍] 멀티 스레드와 동기화

    멀티 스레드와 동기화 스레드를 사용하게되면 필연적으로 만나게되는 문제가 바로 동기화(Synchronization)입니다. 아래는 여러개의 스레드가 실행되는 과정을 도식화한 그림입니다. 여러개의 스레

    12bme.tistory.com

     

    tcpschool.com/java/java_control_condition

     

    코딩교육 티씨피스쿨

    4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

    tcpschool.com

     

    salix97.tistory.com/79

     

    [Android] 안드로이드 - 안드로이드에서 쓰레드란

    What is thread in Android? 쓰레드 개념을 자바하면서 배웠던거 같은데 이제 다시 공부하려니까 막막하고 생각이 잘 안난다. 안드로이드에서 쓰레드가 무엇인지 알아보자 1. Thread의 사전적 의미 찾기 t

    salix97.tistory.com

    www.charlezz.com/?p=44590

     

    운영체제의 Process와 Thread 이야기 | 찰스의 안드로이드

    Process와 Thread 이야기 프로세스(Process) 다음과 같이 위키에서 프로세스의 정의를 발췌했다. In computing, a process is the instance of a computer program that is being executed by one or many threads. 컴퓨터 분야에서 프

    www.charlezz.com

    brunch.co.kr/@mystoryg/84

     

    안드로이드 Handler 알고 쓰자

    Message Queue & Looper | 안드로이드 개발자라면 UI 작업은 별도의 스레드(이하 워커 스레드(worker thread)가 아닌 메인 스레드(main thread)에서 해야 한다는 이야기를 들어봤을 것이다. 만약 로직상 워커

    brunch.co.kr

     

    get/ post / put / delete 개념과 차이

     

    데이터베이스에서 트랜잭션이 무엇인가요? 정규화 과정

     

     

     

     

    'Computer Science' 카테고리의 다른 글

    의존성 주입(Dependecy Injection) 이란?  (0) 2020.12.17
    커널(Kernel)  (0) 2020.12.09
    Garbage Collector 이해  (0) 2020.12.01
    PNG와 JPG 파일 차이  (0) 2020.11.30
    메모리 영역  (0) 2020.09.24
Designed by Tistory.