[Operating System] 프로세스와 스레드

임수정·2024년 6월 17일
0

📝 Learning Log

목록 보기
3/47
post-thumbnail

📍 프로세스란?

  • 프로세스(process)란 실행중에 있는 프로그램(Program)을 의미

    프로그램(Program) : 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태

  • 스케줄링의 대상이 되는 작업(task)과 같은 의미로 사용

  • 프로세스 내부에는 최소 하나의 스레드(thread)를 가지고 있는데, 실제로는 스레드(thread)단위로 스케줄링

  • 하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게되는데 이 순간부터 프로세스라고 명명

  • 프로세스는 독립된 객체로서 생성되면 각각의 메모리 자원을 할당받고 서로에게 접근 불가능

  • 접근이 불가능하기 때문에 여러개의 프로세스를 처리하기 위해서 서로의 상태 자원을 공유하려면 IPC라는 커뮤니케이션 기법이 필요

    IPC(Inter Process Communication) : 커널의 공유 메모리를 활용하여 프로세스들간의 상태 정보를 주고받음

ex. 본인은 엑셀 프로그램(excel.exe)을 켰다. 이때 엑셀을 실행시키기 위해 컴퓨터는 엑셀 프로그램을 읽어야 한다. 컴퓨터에서 모든 프로그램은 코드로 작성되어 있다. 이 코드 파일을 컴퓨터가 읽으려면 CPU가 이해할 수 있는 형태인 저급 언어(0과 1로 이루어진 기계어)로 프로그램이 만들어져야 한다. 0과 1로 작성된 실행 프로그램을 코드 이미지 또는 바이너리라고 부르며, 보통 exe란 확장자가 붙는다. 이 exe 프로그램을 실행하면 메모리에 실행할 데이터가 올라가고, CPU가 이 데이터의 코드를 한줄씩 읽어 나가며 실행한다. 이때, 메모리에 올려진 데이터를 프로세스라고 한다.

📖 IPC(Inter Process Communication) 종류

프로세스들 간의 의사소통을 하는 것을 IPC라고 한다.
프로세스가 통신 가능하다는 것은 서로 다른 프로세스가 데이터를 주고받을 수 있다는 것이며, 동시에 접근 가능한 메모리 즉, 프로세스들이 공유하는 메모리가 필요하다는 뜻

따라서 컴퓨터 내부에서 보다 효율적으로 정보를 주고받기 위한 통신의 일종이라고 생각하면 되고, 인터넷 통신을 IPC의 확장으로 이해할 수 있다. (프로세스간 통신이 서버-클라이언트 간 통신과 유사하기 때문)

① 공유 메모리

  • 공유 메모리가 데이터 자체를 공유하도록 지원하는 설비. 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 혀용
  • 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당, 이후 어떤 프로세스건 해당 메모리 영역에 접근 가능
    • 공유 메모리가 각 프로세스에게 첨부(attach)하는 방식으로 작동 == 각 프로세스가 메모리 영역에 첨부됨
  • 프로세스간 Read, Write를 모두 필요로 할때 사용
  • 대량의 정보를 다수의 프로세스에게 배포 가능
  • 중개자 없이 곧바로 메모리에 접근할 수 있기 때문에 모든 IPC 중에서 가장 빠르게 작동

② 파이프(pipe)
통신을 위한 메모리공간(버퍼)을 생성하여 프로세스가 데이터를 주고받게끔 함

  1. 익명 파이프(Anonymous PIPE)
  • 일반적인 파이프
  • 통신할 프로세스가 명확하게 알 수 있는 경우 사용
    • 부모/자식 or 형제 프로세스 간 통신에 사용
    • 외부 프로세스에 사용 X
  • 파이프는 두개의 프로세스를 연결하고, 하나의 프로세스는 데이터를 쓰기만, 나머지 하나는 데이터를 읽기만 가능 == 한쪽 방향으로만 통신이 가능한 파이프의 특징때문에 반이중(Half-Duplex)라고 부르기도 함
  • 송/수신을 모두 하기 원한다면 두 개의 파이프를 만들어서 가능
  • 간단하게 사용 가능
  • pipe 함수로 생성
  • 반이중 통신이라 읽기쓰기를 구현하는게 복잡해질 수 있고, 전이중 통신을 고려해야할 상황이면 낭비가 심해서 좋은 선택은 아님
  1. 네임드 파이프(Named PIPE)
  • 전혀 모르는 상태의 프로세스들 사이의 통신에 사용
  • 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신 가능
    • 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문에 가능
    • FIFO라 불리는 특수 파일을 이용해 서로 관련 없는 프로세스 간 통신에 사용 == 외부 프로세스와 통신 가능
    • mkfifo or mknod 함수로 생성
    • 반이중 통신이라, 전이중 통신을 위해서는 익명 파이프처럼 2개를 만들어야 가능

③ 소켓(Socket)

  • Unix 도메인 소켓 또는 IPC 소켓은 동일한 호스트 운영 체제에서 실행되는 프로세스간 데이터를 교환하기 위한 데이터 통신 엔드포인트
  • 네트워크 소켓 통신을 통해 데이터 공유
    • 데이터 교환을 위해 양쪽 PC에서 각각 임의의 포트를 정하고 해당 포트 간의 대화를 통해 데이터를 주고받는 형식
    • 이때 각각 PC와 PORT를 담당하는 소켓은 각각 하나의 프로세스
    • 즉, 해당 프로세스는 임의의 PORT를 맡아 데이터 송수신 하는 역할을 진행하는 프로세스이다.
    • 각각의 PC에서 프로세스를 통해 타 PC PORT에 연결하라는 명령을 보내게 되면 두 프로세스는 서로 확인과정을 거쳐 연결을 진행하고 연결 후 마치 PIPE와 같이 1 대 1로 데이터를 주고받는 방식
  • 클라이언트와 서버가 소켓을 통해서 통신하는 구조, 원격에서 프로세스 간 데이터를 공유할 때 사용
  • 전이중(Full Duplex, 양방향) 통신이 가능
  • 서버/클라이언트 환경을 구축하는데 용이
  • 서버(bind, listen, accept), 클라이언트(connect)
  • 중대형 어플리케이션에서 주로 사용

④ 메시지 큐(Message Queue)

  • 입출력 방식은 Named PIPE와 동일
  • 다른점
    • 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간(메모리를 사용한 PIPE)
    • PIPE나 FIFO와는 달리, 다수의 프로세스간 메시지 전달 가능
    • 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
    • 메시지의 접근을 위해서는 키(Key)가 필요

⑤ 메모리 맵(Memory Map)

  • 공유 메모리처럼 메모리를 공유
  • 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식(즉, 공유 매개체가 파일+메모리)
  • 주로 파일로 대용량 데이터를 공유해야 할 때 사용
  • FIFO IO가 느릴때 사용하면 좋음
  • 대부분 운영 체제에서는 프로세스를 실행할 때 실행 파일의 각 세그먼트를 메모리에 사상하기 위해 메모리 맵 파일을 이용
  • 메모리 맵 파일은 파일의 크기를 바꿀 수는 없으며 메모리 맵 파일을 사용하기 이전, 또는 이후에만 파일의 크기를 바꿀 수 있다.

⑥ RPC(Remote Procedure Call)

  • RPC 방법은 분산 네트워크 망에서 많이 사용되는 방식
  • 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게 하는 프로세스 간 통신 기술. 다시 말해, 원격 프로시저 호출을 이용하면 프로그래머는 함수가 실행 프로그램에 로컬 위치에 있든 원격 위치에 있든 동일한 코드를 이용 가능
  • 해당 방법은 분리된 PC에 저장된 데이터를 마치 내 PC에 존재하는 것 처럼 데이터를 가져와 사용하는 통신 방법
    • 스텁(stub)을 통해서 마치 자신의 디스크에 존재하는 것처럼 착각을 일으켜 사용하는 방식
      • 스텁(stub) : 리눅스에서 공유 라이브러리의 일부분 중
      • 프로시저 : 루틴, 서브루틴, 함수와 같은 뜻으로 사용되며 하나의 프로시저는 특정 작업을 수행하기 위한 프로그램의 일부, 또는 어떤 행동을 수행하기 위한 일련의 작업순서를 말함

이러한 IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어뮤텍스를 사용한다.(공유된 자원에 한번에 하나의 프로세스만 접근시킬 때)

세마포어(Semaphore)

  • 위의 다른 IPC 설비들이 대부분 프로세스간 메시지 전송을 목적으로 하는 것에 반해, 세마포어는 프로세스간 데이터를 동기화하고 보호하는데 목적을 둔다.
  • 공유된 자원에 여러개의 프로세스가 동시에 접근하면 안되며, 한번에 하나의 프로세스만 접근 가능하도록 할 때 사용

📍 프로세스 스케줄링

  • CPU는 하나인데 동시에 실행되어야 할 프로세스가 여러개일 때, CPU가 고속으로 여러 프로세스를 일정한 기준으로 순서를 정해서 실행
  • CPU 할당 순서 및 방법을 결정하는 일(어떤 프로세스를 running 상태로 만들지)이 스케줄링(Scheduling), sceduling algorithm을 통해서 결정

📍 프로세스 구조

프로세스당 하나씩 존재
프로세스를 실행시키기 위해서는 코드의 데이터를 메모리에 올려 실행, 이때 프로세스마다 고유한 가상 메모리 공간을 제공하고 이 공간은 4개로 나눔

  • Code 영역(Text Segment)

    • 내가 작성한 코드가 저장되는 공간으로, 코드는 컴파일되어 0과 1로 변환된 기계어가 저장
    • 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라감(쉽게 말하면 소스코드)
  • Data 영역(Data Segment)

    • 내가 작성한 코드에서 선언된 전역 변수, 정적 변수, 상수 등을 저장
    • 초기화된 변수와 초기화되지 않은 변수들이 나눠서 저장
    • 데이터 영역은 프로그램의 시작 시 초기화되며, 프로세스가 종료될때까지 유지
  • Heap 영역

    • 내가 작성한 코드에서 동적으로 생성되는 구조나 객체들을 저장
    • 예를들어 객체나 배열을 생성했을 때 프로그램 실행마다 얼마만큼 데이터가 추가될지 모르기때문에 데이터가 추가됨에 따라 유동적으로 공간을 늘릴 수 있음
    • Heap은 동적으로 할당되는 메모리 영역으로, 프로세스가 실행 중인 동적으로 메모리를 할당받고 해제하는데 사용
    • Heap은 프로세스의 주소 공간의 나머지 영역에 위치하며, 크기는 동적으로 확장
  • Stack 영역

    • 내가 작성한 함수에서 지역변수, 매개변수, return 주소들을 저장
    • 알고리즘에서 사용하는 stack 구조를 사용해서 stack이라고 명명
    • 프로세스마다 독립적인 stack을 가질 수 있고, stack 포인터를 통해 스택 상태를 관리
    • 함수가 호출되면 stack 공간이 생성되고, 함수가 종료되면 소멸

📍 프로세스의 상태


① 프로세스 생성(new)

  • 프로세스가 생성된 상태, 생성만 되었고 아직 실행되기 위한 자원은 할당받지 못한 상태

② 실행 가능(Ready)

  • 프로세스가 실행을 기다리는 상태, 프로세스가 필요한 자원을 모두 할당받았으며 실행을 위한 준비가 완료되었지만 CPU를 할당받지 못한 상태
  • 이 상태에서는 CPU를 할당받기 위해 스케줄링 대기열(Queue)에 들어감

③ 실행 상태(Running)

  • 프로세스가 CPU를 할당받아 실제로 코드를 실행하는 상태
  • 이 상태에서는 프로세스가 작업을 처리하고 결과를 만들어냄

④ 대기(Blocked)

  • 프로세스를 처리중에 작업 시간이 초과되거나 자원 사용을 위해 대기해야하는 이벤트가 발생해서 프로세스가 잠시 멈춘 상태, 이 상태에서는 CPU를 사용하지않음
  • 특정 자원을 사용할 수 있을 때까지 실행을 멈추고 다시 대기열(Ready Queue)로 들어가게되며, 프로세스 처리 기능 상태가 되면 실행(Running)상태로 변경

⑤ 종료(Terminated, exit)

  • 프로세스의 실행이 완료되어 종료된 상태
  • 이 상태는 할당된 자원들이 해제되고, 프로세스의 메모리 공간은 운영체제에 반환

📍 프로세스의 PC & SP

컴퓨터에서는 프로세스를 처리하기위한 PCSP라는 레지스터가 존재
프로세스의 실행 및 메모리 관리와 관련된 역할 수행

레지스터란?
CPU의 빠른 데이터 처리를 돕기 위해 사용되는 임시 저장 공간으로, 처리중인 데이터나 처리결과가 담기게되는 공간

PC(Program Counter)

  • 실행 할 명령어의 주소를 가리키는 레지스터
  • 코드를 실행시키면 코드가 한줄씩 내려가면서 실행되는데, 프로세스는 한 줄을 처리 후 다음 실행할 코드가 어딘지 알려줘야 코드를 실행할 수 있음 == 이때 다음 실행할 코드의 주소를 저장하는 레지스터가 PC
  • 프로세스는 명령어를 순차적으로 실행하면서 PC값을 증가시켜 다음에 실행할 명령어를 가리킴
  • 프로그램의 흐름을 제어하는 역할, 프로세스가 명령어를 실행하다가 분기나 점프 명령어를 만나면 PC의 값을 분기된 주소로 변경하여 해당 명령어 실행
  • 프로세스가 중단되거나 인터럽트(예외 상황)이 발생했을 때 실행중이던 명령어의 주소를 저장하고, 이후 다시 프로세스가 실행되었을 때 주소를 찾아가 재실행 가능 역할

SP(Stack Pointer)

  • 현재 실행 중인 프로세스의 스택(stack)의 최상단을 가리키는 레지스터
  • 코드를 작성할 때, 재귀함수처럼 함수 안에 함수를 호출해야하는 경우 가장 최근에 호출한 순서대로 stack에 쌓이게 되는데, 가장 최근에 호출된 함수(==최상단 함수)의 위치를 알고 있으면 어디까지 함수가 호출되어 있는지 프로세스가 알수 있음
  • 스택 프레임(Stack Frame, 스택공간이라는 뜻)의 시작 주소를 가리키며, 스택에 데이터를 저장하거나 불러올 때 사용
  • 함수 호출 시에는 SP가 감소하여 스택에 새로운 스택 프레임(스택 공간)을 생성하고, 함수가 반환되면 SP가 증가하여 이전 스택 프레임으로 되돌아감
  • 프로세스와 스택 영역을 관리하고, 스택 오버 플로우(Stack Overflow, 스택 영역 밖으로 메모리가 넘어가는 현상)와 같은 문제를 방지하기 위해 제한된 메모리 영역을 사용하는 등의 역할 수행

📍 Process Control Block(PCB)

프로그램이 실행되면 프로세스의 정보를 저장하는 별도의 공간이 따로 생기게 되는데 운영체제의 커널(Kernel) 또한 하나의 프로그램이므로 프로세스와 같이 정보를 저장할 수 있는 공간(stack, data, heap...)이 생김. 이때 커널의 데이터(Data) 영역에서는 각 프로세스의 상태, CPU 사용의 정보, 메모리 사용 정보 등 각종 자원을 관리하기 위해서 PCB라는 공간을 만듦

  • 커널(Kernel)이란?
    운영체제의 핵심부로 컴퓨터 자원들을 관리하는 역할을 수행
    (컴퓨터 자원(system resource) : CPU, 메모리, 파일, 네트워크, 입출력 장치 등)
    하드웨어와 응용 프로그램 간의 상호작용을 관리
    주요 기능은 프로세스 관리, 메모리 관리, 입출력 관리, 파일 시스템 관리 등
    시스템 최상위 권한을 가지고 있어 하드웨어 자원에 직접 접근하고, 응용 프로그램이 원활하게 실행될 수 있도록 관리
    즉, 커널은 항상 컴퓨터 자원만 바라보고 있는데 사용자와의 상호작용은 전혀 지원 X
    그래서 시스템 프로그램 쉘(Shell)을 사용
  • 쉘(Shell)이란?
    사용자가 컴퓨터에게 전달하는 명령을 해석하는 프로그램, 커널과 사용자간의 다리 역할 수행
    사용자와 운영체제 간의 인터페이스 역할 수행
    사용자는 이것을 통해 운영체제와 상호작용하고 작업을 수행할 수 있으며, 커널을 호출해 운영체제 기능과 서비스 조작 가능

    인터페이스 : 사용자가 운영체제에게 정보, 명령, 신호 등을 교환하기 위한 규칙

즉, PCB란 운영체제가 프로세스를 관리하기 위해 사용하는 데이터 구조
각 프로세스마다 유지되며, 해당 프로세스의 상태 정보와 제어정보를 저장
프로세스가 생성되면 운영체제는 PCB를 할당하고 프로세스가 종료되면 해당 PCB를 해제

PC와 SP 값이 PCB에 저장되고 필요하면 PCB에서 불러와 코드 실행이 멈춰 있던 곳의 주소를 찾아가 다시 실행할 수 있게 해줌
프로그램이 잠시 중단된 상태에서 다시 실행할 때, 처음부터 되돌아가서 실행하지 않고 실행을 이어서 처리할 수 있게 해줌

📖 PCB에 저장되어있는 정보

  • 현재 Process State
    New, Ready, Wait, Running, Terminated
    이 상태 정보는 프로세스의 스케줄링과 상호작용하여 프로세스의 실행을 관리

  • Process ID, Parent Process ID

  • CPU registers
    프로세스의 레지스터 상태를 저장하는 공간

  • Program Counter
    프로세스가 다음에 실행할 명령어(코드)의 주소를 가리키는 포인터
    프로세스가 중단되었을 때 다시 시작할 위치를 알려주는 중요한 역할

  • CPU Sceduling 정보
    CPU Sceduling에 필요한 우선순위 및 scheduling queues의 pointer

  • Memory 관리 정보
    프로세스가 사용하는 메모리 공간의 주소 범위, 페이지 테이블, 메모리 할당 정보 등과 같이 메모리 관리에 필요한 정보를 저장

    페이지 테이블 : 페이징 프로세스의 메모리 주소를 관리할 때 프로세스의 페이지 정보({페이지 번호:페이지에 해당하는 데이터의 실제 물리주소})를 저장하고 있는 테이블
    세그먼트 테이블 : 프로세스를 논리적 내용으로 잘라 메모리에 배치하는 방식을 세그멘테이션이라고 함, 세그먼트 테이블은 이 세그먼트들의 실제 물리적 메모리 주소 정보를 담고 있음(base: / limit)쌍으로 이루어짐

  • Accounting 정보
    process를 실행한 user의 정보

  • I/O 상태 정보
    프로세스가 현재 사용 중인 입출력 장치와 관련된 정보를 포함
    어떤 입출력을 보내고 있는지, 어떤 파일을 열어두었는지 등

PCB는 현재 프로세스가 instruction의 어떤 곳 까지 실행하였는지, register에는 어떤 값들이 저장되어 있는지 등 현재 시점의 모든 상태를 가지고 있음
따라서 운영체제의 sceduler가 현재 프로세스를 정지하고 다른 프로세스를 Dispatch하기 전에 현재 프로세스의 상태를 PCB에 저장한다면 다시 원래 프로세스의 실행 순서가 돌아왔을 때 이전에 하던 작업을 PCB를 통해 그대로 복원 가능


📍 스레드(thread)란?

  • 운영체제에서 프로세스 내부에서 실행되는 작은 단위
  • 프로세스의 실행 흐름을 구성하는 단위
  • 하나의 프로세스는 내부에 여러개의 스레드가 포함될 수 있음

📍 스레드(thread)의 특징

  1. 프로세스는 서로의 데이터에 접근하는것이 직접적으로 불가능한것에 반해, 스레드는 프로세스 내부에 존재하기때문에 프로세스의 Code/Data/Heap 메모리 영역을 공유할 수 있다. 또한 스레드들끼리 서로의 데이터에도 접근 가능(IPC가 필요없음), 한 스레드가 프로세스 자원을 변경하면 다른 이웃 스레드(sibling thread)도 변경 사항을 확인 가능

  2. 스레드도 일종의 작업단위라서 프로세스처럼 작업 처리. 즉, 스레드도 프로세스처럼 작업을 병렬로 처리하여 속도를 증가시킬 수 있음

  3. 스레드는 일종의 함수로 구현. 스레드도 함수라서 데이터(지역 변수)를 다루고, 데이터를 관리하기위해 stack 메모리 영역을 가짐. 이 stack 공간은 프로세스가 가지는 stack 메모리 영역과는 별개이며 스레드의 메모리 영역을 thread stack이라고 명명
    프로세스는 메모리 영역을 4가지(code, data, stack, heap)으로 나누지만 스레드는 thread stack 메모리 공간만 가지고 있음
    스레드 안에 포함된 데이터(지역변수)는 thread stack에 저장(단, 프로세스의 stack 영역에는 스레드 지역변수 포함 X)

  4. 하나의 프로세스는 내부에 여러개의 스레드를 가질 수 있음

하나의 프로세스 안에 스레드는 몇개까지 만들 수 있을까?

쓰레드는 남은 램의 크기 이상은 만들수 없다!


📍 멀티 스레드 VS 멀티 프로세스

📖 멀티 스레드

하나의 프로세스 내부에서 여러개의 스레드로 자원을 공유하며 작업을 나누어 수행하는 것

장점

  • 시스템 자원소모 감소(자원의 효율성 증대)
    • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리 가능
  • 시스템 처리율 향상(처리비용 감소)
    • 스레드 간 데이터를 주고받는 것이 간단해지고 시스템 자원 소모가 줄어듦
    • 스레드 사이의 작업량이 작아 context switcing이 빠름(캐시 메모리를 비울 필요가 X)
  • 간단한 통신 방법으로 프로그램 응답시간 단축
    • 스레드는 프로세스 내 스택 영역을 제외한 메모리 영역을 공유하기에 통신 비용이 ↓
    • 힙(Heap)영역을 공유하므로 데이터 주고받기 가능

단점

  • 자원을 공유하기 때문에 동기화 문제 발생 가능성(병목현상, 데드락 등..)
  • 주의 깊은 설계가 필요하고 디버깅이 어려움(불필요한 부분까지 동기화하면 대기시간으로 인해 성능저하 발생)
  • 하나의 스레드에 문제가 생기면 전체 프로세스에 영향을 미침
  • 단일 프로세스 시스템의 경우 효과 ↓

📖 멀티 프로세스

두개 이상의 다수 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)를 동시에 처리하는 것(병렬처리)
각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용

장점

  • 독립된 구조로 안정성이 높음
  • 프로세스 중 하나가 문제가 생겨도 다른 프로세스에 영향을 미치지않아 정지하는 문제가 생기지않음(다만, 작업 속도는 조금 느려질 수 있음)
  • 여러개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세스(CPU)가 이를 공유하면 비용적으로 저렴

단점

  • 독립된 메모리 영역이기 때문에 작업량이 많을수록(Context switching이 자주일어나서 주소 공간의 공유가 잦을 경우) 오버헤드가 발생하여 성능저하 발생

Context Switching

  • CPU는 한번에 하나의 프로세스만 실행 가능
  • CPU에서 여러 프로세스를 돌아가면서 작업하는 것 == context switching
  • 구체적으로, 동작중인 프로세스가 대기를 하면서 해당 프로세스의 상태(context)를 보관, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업

📖 스레드 간 통신보다 프로세스 간 통신이 어려운 이유

프로세스는 생성되면서 PC를 포함하여 메모리 공간 등을 복사하여 별도의 자원을 할당하지만, 스레드는 메모리 공간과 자원을 공유하기 때문

따라서 프로세스는 통신할 수 있는 공간이 없기 때문에 통신을 위한 별도의 공간을 만들어줘야해서 스레드 간 통신보다 어렵다고 볼수 있다.

이를 위해서 커널 영역에서 IPC라는 내부 프로세스간 통신(Inter Process Communication)을 제공하게 되고, 프로세스는 커널이 제공하는 IPC 설비를 이용해서 프로세스간 통신이 가능

profile
언어는 거들 뿐...

0개의 댓글