CS 스터디 4회차 중 2번째 시간.

📘 오늘은 프로세스와 스레드에 대해 알아보도록 하겠다.

프로그램은 실행되기 전까지는 그냥 보조기억장치에 있는 데이터지만, 프로그램을 실행하게 되면 메모리에 적재되고 실행하는 그 순간 프로세스가 된다.

이런 과정을 프로세스를 생성한다고 하기도 한다.

작업관리자를 열어보자. 나는 맥 OS 환경이기 때문에 활성상태보기를 하면 된다.

이렇게 현재 실행되고 있는 프로세스들 목록이 보인다.

모든 프로세스에는 CPU가 필요하다.
왜냐? 실행이 돼야 하기 때문에.

하지만 CPU의 자원은 한정되어 있다.

프로세스가 100개, 200개 돌고 있다고 해도 CPU가 4개면 4개의 CPU를 돌아가면서 사용해야 한다.

프로세스들은 돌아가면서 한정된 시간만큼, 자신에게 할당된 시간만큼만 CPU를 이용하고 자기 차례가 끝났다면 다음 프로세스한테 CPU의 이용권을 넘기게 된다.

📌 여기서 알고 있어야 할 건 타이머 인터럽트.

타이머 인터럽트는 "너 시간 끝났어." 하고 알려주는 인터럽트다.

좀 더 자세하게는 클럭 신호를 발생시키는 장치에 의해서 주기적으로 발생하는 하드웨어 인터럽트의 한 종류라고 말할 수 있다.

타임 아웃 인터럽트라고 부르기도 한다.

이렇게 프로세스들은 빠르게 번갈아가며 수행되는데, 이 프로세스들을 운영체제는 줄을 잘 세워서 관리를 해줘야 한다.

이걸 위해서 사용하는 자료구조가 프로세스 제어블록, PCB 라고 부른다.

📌 여기서 자료구조란, 자료를 저장하는 하나의 형태를 의미한다.

PCB 라는 것은 프로세스의 관련 정보를 저장하는 태그 같은 정보라고 기억해두면 편하다.

예시로 우리가 옷을 살 때, 옷에는 항상 태그가 달려 있고, 옷에 대한 정보들이 나열되어 있다. PCB 또한 프로세스와 관련된 정보들이 적혀있다.

PCB는 프로세스가 새롭게 생성되면 커널 영역에 이 PCB가 생성되고, 프로세스가 실행이 끝나서 종료되면 PCB 또한 삭제된다.

PCB에 담기는 정보들은 운영체제마다 차이가 있으나, 대표적인 정보들은 다음과 같은 것들이 있다.

📘 PCB에 담기는 대표적인 정보

  • 프로세스 ID(=PID)
  • 레지스터 값
  • 프로세스 상태
  • CPU 스케줄링 정보
  • 메모리 정보
  • 사용한 파일과 입출력장치 정보

📌 프로세스 ID(=PID)
\rarr 특정 프로세스에 붙은 ID 값. 프로세스를 식별하기 위해 부여한 고유 번호.

📌 레지스터 값
\rarr 이전까지 실행했던 내용을 다시 자기 차례가 오면 실행을 재개하기 위해서 저장한다.

📌 프로세스 상태
\rarr 지금 프로세스의 상태들이 담긴다. 이 프로세스가 지금 상태 준비 상태인지, 상태 대기 상태인지, 실행 상태인지 등을 알기 위해서.

📌 CPU 스케줄링 정보
\rarr 보통 프로세스들이 모두 같은 시간을 쓰지 않기 때문에, 언제 어떤 순서로 CPU를 할당 받을지에 대해서 대한 스케줄링 정보도 PCB에 명시된다.

📌 메모리 정보
\rarr 프로세스가 현재 어느 주소에 저장되어 있는지에 대한 정보를 나타낸다. 당연한 말이겠지만 프로세스들은 메모리에 저장된 위치가 다르다. 그렇기에 이 프로세스가 어디에 저장되어 있는지도 명시해 놔야 한다.

📌 사용한 파일과 입출력장치 정보
\rarr 프로세스가 어떤 특정한 입출력장치를 사용하는 경우도 있다. 또는 특정 파일을 열어서 읽는다는지, 쓴다든지. 그런 과정을 거쳤다면 PCB에 이 프로세스가 실행과정에서 어떤 입출력장치나 파일을 사용했는지를 명시하게 된다.


📘 문맥 교환(context switching)

다음 알아볼 것은 문맥 교환이다.

CPU에 대한 자원은 한정되어 있지만 모든 프로세스들은 CPU를 사용해야 한다. 그렇기 때문에 CPU를 돌아가면서 사용하게 된다.

이 내용이 실질적으로 어떻게 이루어 지는지에 대한 내용이다.

예를 들어보자.

프로세스 A와 프로세스 B가 있다.

프로세스 A는 먼저 실행되어 CPU를 사용하고 있었지만, 프로세스 B로 순서가 넘어가게 된다면 어떤 작업을 거쳐야 할까?

이 때, 타이머 인터럽트가 발생해 프로세스 A한테 사용 시간이 다 끝났다고 알려준다.

그 뒤 프로세스 B가 CPU를 할당받아 실행된다.

그리고 프로세스 A는 일단 지금까지의 중간 정보를 백업해야 한다.

위에서 알아봤던 프로그램 카운터를 비롯한 각종 레지스터 값, 메모리 정보 등등을 말이다.

이 중간 정보를 문맥, context라고 한다.

다시 말해 문맥은 다음 차례가 왔을 때 실행을 재개하기 위한 정보다.

이렇게 문맥 정보를 백업해두면 언제든지 프로세스 B에서 프로세스 A로 다시 넘어갈 수 있게 된다.

이걸 context switcing, 문맥 교환이라고 한다.

📘 이번엔 프로세스가 사용자 영역에 어떤 식으로 저장되는지 알아보자.

사용자 영역에서 프로세스는 특정 영역을 나누어 저장된다.

크게 프로세스를 차지하고 있는 메모리의 영역이 나눠지는 4개의 영역을 코드영역(텍스트 영역이라고도 부른다), 데이터 영역, 힙 영역, 스택 영역이라고 부른다.

이게 전부는 아니지만 대표적으로 이렇게 4개의 영역이 있다.

📌 코드 영역
\rarr 텍스트 영역이라고도 부른다. 코드 영역은 말 그대로 코드, 기계어로 이루어진 명령어가 저장되는 영역을 의미한다.
코드 영역에는 데이터가 아니라 CPU가 실행할 명령어가 담기는 공간이다. 프로그램을 이루는 명령어가 갑자기 바뀌는 일은 없기 때문에 코드 영역에는 쓰기가 금지 되어 있다.
그래서 read-only 영역이라고 말하기도 한다.

📌 데이터 영역
\rarr 데이터가 담기는 영역. 모든 데이터가 담기는 게 아니다.
잠깐 썼다가 없앨 데이터가 담기는 게 아니라 프로그램이 실행되는 동안 유지할 데이터들이 저장되는 영역을 데이터 영역이라고 한다.

전역변수를 생각하면 된다.
전역변수는 말 그대로 전체 영역에서 쓸 수 있는 변수인데, 전역변수는 한 번 썼다가 금세 없애버릴 변수가 아니라 프로그램이 실행되는 내내 유지할 데이터를 전역변수로 설정한다.
그리고 데이터 영역에는 이러한 전역변수의 값이 담긴다고 생각하면 된다.

📌 참고로, 코드 영역과 데이터 영역의 크기는 고정되어 있다.
중간에 코드가 바뀌거나 데이터가 바뀌는 것이 아니기 때문.
그래서 크기가 고정된 영역이라고 하는 점에서 정적할당 영역이라고도 부른다.

📌 힙 영역
\rarr 힙 영역은 사용자가 할당할 수 있는 공간이다. 쉽게 말해 프로그래머가 직접 할당할 수 있는 저장공간이다.
프로그래밍을 하는 과정에서 힙 영역에다 메모리 공간을 할당했다면, 언젠가는 이 힙 영역에 할당한 메모리 공간을 반환해야 한다.
프로그래밍 언어가 알아서 반환해 주는 경우도 있는데, 이걸 가비지 컬렉션(garbage collection)이라고 한다.

일부 프로그래밍 언어, 특히 오래된 언어 같은 경우, 예를 들어 C 언어 같은 경우에는 가비지 컬렉션 기능이 없기 때문에 일일이 메모리를 반환하는 과정을 거쳐야 하니 주의하자.
그렇지 않다면 계속해서 메모리 공간을 차지하면서 메모리 낭비를 초래한다.
이걸 메모리 누수(memory leaks)라고 한다.

📌 스택 영역
\rarr 스택 영역은 데이터를 일시적으로 저장하는 공간이다.
앞서 데이터 영역은 프로그램을 실행하는 내내 유지할 데이터가 담기는 공간이라고 했다면, 스택 영역은 잠깐 쓰다 버릴 값들을 저장하는 공간이다.

코드 영역과 데이터 영역은 크기가 변하지 않는 정적할당 영역이라고 했다.
하지만, 힙 영역과 스택 영역은 프로그램이 실행되는 과정에서 동적으로 크기가 변할 수 있다.
사용자가 언제 힙 영역에 메모리를 할당할 지 모르고, 스택 영역 또한 잠깐 쓰다 버릴 값들이 언제든지 스택 영역에 쌓일 수 있기 때문이다.
그래서 이 두 영역을 합쳐서 동적할당 영역이라고 부른다.

일반적으로 힙 영역은 낮은 주소에서 높은 주소로 할당된다.
스택 영역은 높은 주소에서 낮은 주소로 할당된다.

왜일까?

힙 영역과 스택 영역은 실행 과정에서 크기가 가변적으로 변할 수 있다.
힙 영역과 스택 영역이 딱 붙어 있으면 언젠가는 메모리 영역이 충돌이 일어날 수 있기 때문이다.

힙 영역도 스택 영역도 같은 방향으로 커지면 커질 수 있는 공간의 한계가 생길 수 밖에 없다.

그래서 이 두 영역은 반대 방향으로 차오르게 된다.
그러니 주소가 겹칠 일도 없다.

이러한 이유로 대부분의 힙 영역과 스택 영역은 할당되는 방향이 반대가 된다.


📘 이제 프로세스의 상태프로세스의 계층 구조에 대해 알아보자.

프로세스 상태(process status)는 운영체제마다 차이가 있지만 대부분의 운영체제에서 공통적으로 사용하고 있는 프로세스의 상태는 다섯 가지가 있다.

📘 프로세스의 상태

  • 생성 상태(new)
  • 준비 상태(ready)
  • 실행 상태(running)
  • 대기 상태(bloked)
  • 종료 상태(terminated)

📌 생성 상태
\rarr 생성 상태는 말 그대로 생성된 상태이다. 이제 막 메모리에 적재되어 PCB를 할당 받은 상태이다. 프로세스가 생성 단계를 거쳐서 이제 언제든지 CPU를 할당받아서 실행할 수 있는 상태가 되면 준비 상태로 넘어간다.

📌 준비 상태
\rarr 준비 상태는 당장이라도 CPU를 할당 받아 실행할 수 있는 상태지만 아직 차례가 오지 않아 기다리고 있는 상태다. 차례가 된다면 실행 상태가 된다. 준비중이던 프로세스가 실행상태로 바뀌는 것을 디스패치(dispatch)라고 한다.

📌 실행 상태
\rarr 실행 상태는 CPU를 할당 받아 실행 중인 상태를 말한다. 할당된 시간을 모두 사용하면, 타이머 인터럽트가 발생하고, 다시 준비상태가 된다. 실행 도중 입출력장치를 사용하면 입출력장치의 작업이 끝날 때까지 대기 상태가 된다.

📌 대기 상태
\rarr 대기 상태는 프로세스가 실행 도중 입출력작업을 하는 과정을 말한다. 입출력 작업은 CPU에 비해 속도가 느리기 때문에 계속해서 프로세스가 점거하고 있을 수 없기 때문이다. 입출력 완료 인터럽트를 받으면 다시 준비 상태로 되돌아 가게 된다.

📌 종료 상태
\rarr 프로세스가 종료된 상태. 프로세스가 종료되면 이 프로세스가 차지하고 있던 메모리 영역 정리를 해야 하고 할당받은 PCB는 폐기해야 한다.


📘 다음은 프로세스의 계층 구조다.

대부분의 운영체제에서 프로세스를 계층적으로 관리한다.
물론 예외는 있다. 윈도우 운영체제 같은 경우엔 프로세스를 계층적으로 관리하지 않는다.
하지만, 개발자들이 많이 사용하는 맥OS, 리눅스, 넓게 보면 유닉스까지 프로세스를 계층적으로 관리하고 있기 때문이다.

프로세스의 계층 구조에 대해 이해하려면 먼저 부모 프로세스와 자식 프로세스의 개념에 대해서 이해해야 한다.

프로세스는 실행 되는 도중에 시스템 호출, 그러니까 다른 프로세스를 생성해주는 시스템 호출을 통해서 다른 프로세스를 생성할 수가 있다.

이 때, 새로운 프로세스를 생성한 프로세스를 부모 프로세스.
부모 프로세스에 의해서 이제 막 새로 생성된 프로세스를 자식 프로세스라고 한다.

부모 프로세스랑 자식 프로세스는 별개의 프로세스이기 때문에 각기 다른 PID 값을 가진다.
똑같은 프로그램을 두 번 실행했더라도 말이다.

일부 운영체제에서는 자식 프로세스의 PID 값, 이것을 줄여서 PPID(Parent PID)라고 부르고 PPID 값을 명시하기도 한다.

부모 프로세스로부터 생성된 자식 프로세스 또한 또다른 자식 프로세스를 낳을 수가 있다. 그렇게 생성된 자식 프로세스는 또 새로운 자식 프로세스를 낳을 수 있다.

이렇게 프로세스의 계층 구조가 형성된다.

컴퓨터가 부팅되는 시점에 실행되는 최초의 프로세스가 있다.
이 최초의 프로세스는 자식 프로세스들을 생성하고, 그 자식 프로세스들이 새로운 자식 프로세스들을 생성한다.

그렇게 그림을 따져보면 총 10개의 프로세스가 실행되고 있다는 걸 알 수 있다.

이 프로세스 계층 구조를 예시를 통해서 알아보자.

📌 참고사항으로, 데몬 프로세스가 있다.
데몬 프로세스(Daemon Process) 는 백그라운드에서 지속적으로 실행되며 특정 작업을 수행하는 프로세스를 의미한다. 사용자가 직접 실행하지 않아도 시스템이 자동으로 실행하고 관리하는 프로세스다.

만약 컴퓨터를 부팅했을 때, 생성된 최초의 프로세스가 있다고 가정을 해보자.

최초의 프로세스는 로그인을 담당하는 프로세스를 자식 프로세스로 생성했다.

그리고 로그인 프로세스는 사용자로부터 입력을 받을 수 있는, 사용자 인터페이스 bash 프로세스라고 하는 사용자 인터페이스 프로세스를 자식 프로세스로 생성을 한 것이다.

그리고 사용자 인터페이스 프로세스는 Vim 프로세스를 자식 프로세스를 생성했다.

이런식으로 최초의 프로세스가 로그인 프로세스를 만들고 로그인 프로세스는 bash를 bash는 Vim을. 이런식으로 순차적으로 자식 프로세스를 생성함으로써 여러개의 프로세스가 동시에 실행되는 구조로써 컴퓨터가 실행된다는 것을 알 수 있게 된다.




📘 프로세스 생성 기법

윈도우 운영체제와는 관계가 없지만 다른 운영체제에서는 알아둘 필요가 있고, 개발자라면 필요한 지식이니 참고하자.

로그인 프로세스가 bash 프로세스를 자식 프로세스로서 생성했다고 가정을 해보자.

그러면 로그인 프로세스라고 하는 부모 프로세스는 bash 프로세스라고 하는 자식 프로세스를 어떻게 생성한 걸까?

또, bash 프로세스는 이 프로세스를 차지하는 메모리 상의 위치가 있지 않을까?

로그인도 로그인 나름대로 메모리 안에 어떤 공간을 차지하고 있을거고, bash 또한 메모리 안에 자신만의 공간을 차지하고 있을 거다.

그리고 로그인과 bash는 서로 하는 일이 다르기 때문에 메모리 안에 저장된 내용들이 다를 것이다.

이 로그인 프로세스로부터 생성된 자식 프로세스인 bash 프로세스가 어떻게 자신만의 코드를 메모리안에 적재해서 실행할 수 있었을까 하는 질문에서부터 시작되는게 이 프로세스 생성 기법이다.

비유를 하자면 복제와 옷 갈아입기다.

복제와 옷 갈아입기라고 하는 이 두 과정을 거쳐서 프로세스가 생성된다.

첫 번째, 부모 프로세스는 Fork라고 하는 시스템 호출을 통해서 자신의 복사본을 자식 프로세스로 생성을 한다.

그리고 두 번째, 자식 프로세스는 Execution이라고 하는 시스템 호출을 통해서 자신의 메모리 공간을 다른 프로그램으로 교체한다.

이 두가지의 방법을 통해서 부모 프로세스는 자식 프로세스를 생성해 내고 자식 프로세스는 자기 자신만의 프로그램을 실행할 수 있게 되는 것이다.

첫 번째를 복제에, 두 번째를 옷 갈아입기에 빗댄 것.

좀 더 자세히 들어가보자.

fork라는 시스템 호출이 있다.

fork라는 시스템 호출은 자신의 복사본을 자식 프로세스로서 생성해라 라고 하는 시스템 호출이기 때문에 fork라고 하는 시스템 호출을 호출하면 그 호출한 프로세스, 부모 프로세스의 자원들, 예를 들어 메모리의 내용, 열린 파일들의 목록 등 기존에 부모 프로세스가 가지고 있던 자원들이 자식 프로세스에 상속된다.

fork 라는 시스템 호출을 하면 부모 프로세스와 동일한 복사본인 자식 프로세스가 생성된다고 보면 된다.

물론, 완전한 복사본이긴 하지만 엄연히 별개의 프로세스이기 때문에 PID라던지 저장된 메모리의 위치는 다르다.

fork 시스템 호출이 끝났다면, 자식 프로세스는 부모 프로세스와 완전히 동일한 내용을 갖고 있을 것이다.

이 상태에서 부모 프로세스와 자식 프로세스를 쭉 실행시킨다면 똑같은 일을 하는 두 개의 프로세스를 동시에 실행해라가 된다.

근데 여기서, 자식 프로세스가 exec라고 하는 시스템 호출을 또 할 수가 있다.

이건 어떤 시스템 호출이냐면, 내가 지금 갖고 있는 내 메모리 공간을 새로운 프로그램으로 덮어쓰라고 말하는 시스템 호출이다.

다시 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출.

새로운 프로그램 내용으로 전환해서 실행하는 시스템 호출인 셈.

이 시스템 코드를 호출하게 되면 코드 영역, 데이터 영역은 새롭게 실행할 프로그램의 내용으로 바뀌게 되고 나머지 영역은 초기화 된다.

부모 프로세스가 자신의 복사본을 fork 시스템 호출을 통해서 자식 프로세스를 생성했다.

그리고 자식 프로세스가 exec 라고 하는 시스템 호출을 통해서 스택 영역, 힙 영역, 데이터 영역, 코드 영역에 해당하는 프로그램들이 지금부터 실행할 새로운 프로그램으로 바뀌게 된다.

여기서부터는 이제 부모 프로세스와 자식 프로세스가 갖고 있는 프로그램의 내용과 지식이 달라지게 된다.

서로 다른 프로그램을 실행하게 되는 것.

정리하자면.

부모 프로세스가 자식 프로세스를 실행하고 프로세스의 계층 구조를 이루는 과정은 fork 시스템 호출과 exec 시스템 호출이 반복되는 과정이라고 말할 수 있다.

물론 자식 프로세스가 부모 프로세스로부터 fork 된 이후에 exec 시스템 호출을 하지 않는 경우도 있다.

이럴 경우에는 그냥 똑같은 프로세스, 동일한 일을 수행하는 프로세스가 병행되는 구조라고 볼 수 있다.

이렇게 프로세스의 생성 기법을 Fork-exec 구조라고도 한다.


📘 이제 스레드에 대해 알아보자.

스레드는 CPU 스펙을 볼 때 여러가지 상황에서 아주 자주 접하게 되는 단어인데, 이 책에서는 소프트웨어적인 스레드를 의미하고 있다.

스레드는 프로세스를 구성하는 실행 흐름의 단위이다.

프로세스를 구성하는 실행 흐름의 단위이기 때문에, 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.

예를 들어보자.

웹 브라우저 프로세스라고 하는 프로세스가 현재 메모리에 적재 되어 있다고 가정한다.

하나의 프로세스만으로 이 웹 브라우저 프로세스를 처리하게 된다면 그냥 쭉 하나의 흐름만 가지고 처리가 되겠지만 별도의 스레드를 만들면 웹 브라우저 프로세스라고 하는 하나의 프로세스를 동시에 이 스레드 갯수만큼 병행해서 실행할 수 있게 되는 것이다.

하나의 스레드에는 화면 출력 역할을 맡기고 또 하나의 스레드는 사용자로부터 입력을 받아들이는 스레드로서 사용을 하고 또 다른 스레드는 검색을 하는 스레드로서 사용을 하고.

이런 식으로 하나의 프로세스를 여러 개의 스레드로 동시에 사용 할 수가 있다.

이렇게 실행 흐름이 여러개인 프로세스를 멀티 스레드 프로세스라고 한다.

이것은 프로그래밍 언어로서 스레드를 여러 개 만들어서 사용할 때도 마찬가지이다.

프로그래밍 언어를 통해서 여러개의 스레드를 만든다면 프로그램을 이루고 있는 여러 부분을 동시에 실행하도록 할 수 있다.

근데, 여기서.

이 스레드는 무엇으로 구성되어 있길래 하나의 프로세스를 이루고 있는 여러개의 스레드가 별도로 실행될 수 있을까?

어떻게 이렇게 실행 흐름의 단위를 스레드로서 나누어서 실행할 수 있나?

이걸 알기 위해선 스레드의 구성요소를 먼저 알아야 하는데.

하나의 스레드는 프로세스 내에서 각기 다른 값을 갖고 있는 스레드 ID. PID랑 비슷하다.

스레드 ID 그리고 프로그램 카운터를 비롯한 여러가지 레지스터 값 그리고 스택처럼 실행에 필요한 최소한의 정보를 가지고 있다.

📌 스레드는 프로세스를 이루는 실행 흐름의 단위이고, 각기 다른 부분을 실행하기 위해서 스레드마다 각각 다른 스레드 ID, 프로그램 카운터를 포함한 레지스터 값, 스택처럼 실행에 필요한 최소한의 정보를 유지한 채 실행이 된다. 하지만 모든 스레드들은 프로세스의 자원을 공유하면서 실행된다.


📘 멀티 프로세스와 멀티 스레드의 차이점

여러 프로세스를 동시에 실행하는 것을 멀티 프로세스.

여러 스레드로서 프로세스를 동시에 실행하는 것을 멀티 스레드.

이 둘의 차이는 무엇인가.

예를 들어보자.

예를 들어 화면에다 "hello, os" 라는 문자열을 출력하는 프로그램이 있다고 가정하자.

이 프로그램을 3번 fork 해서 실행을 하면 똑같은 프로세스가 3개 만들어져서 실행이 된다.

그러면 실행 흐름이 각각 하나씩 있으니까 결과적으로는 "hello, os" 라는 문자열이 동시에 3번 실행된다.

그리고

"hello, os" 라고 하는 문자열을 출력하는 프로세스에다 실행 흐름을 3개 만들면 마찬가지로 "hello, os"라고 하는 문자열이 화면에 3번 출력된다.

출력 결과는 같지만, 여기엔 큰 차이점이 존재 하는데.

프로세스끼리는 기본적으로 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내의 자원을 공유한다는 점이다.

똑같은 프로세스의 복제본이지만 별개의 프로세스로서 존재하고 실행된다.
확실한 남이다.

스레드들은 실행에 꼭 필요한 정보만 가지고 프로세스의 자원은 함께 공유한다.

그래서 멀티 프로세스는 PCB 값도 모두 다르지만, 멀티 스레드는 PCB 값도 같을 수 밖에 없다. 아니, PCB가 하나밖에 없다.

📌 프로세스끼리는 자원을 공유하지 않는다.
\rarr 남남처럼 독립적으로 실행된다.

📌 스레드는 프로세스의 자원을 공유한다.
\rarr 협력과 통신에 유리하다.

물론 자원을 공유하기 때문에 협력과 통신에 유리한 장점이 있지만, 하나의 스레드에 문제가 생기면 전체 프로세스에 문제가 생길 수도 있다.

참고로, 프로세스끼리는 자원을 공유하지는 않는다고 했지만
프로세스 간에 자원을 주고 받을 수도 있는데

이것을 프로세스 간 통신(IPC, Inter Process Communication)이라고 한다.

통신이라고 한다면 네트워크를 통해서 데이터를 주고 받는 것을 떠올리지만 컴퓨터 내에 프로세스나 스레드들끼리 데이터를 주고 받는 것도 모두 통신이라고 한다.

IPC에는 공유 메모리, 소켓, 파이프 등 다양한 통신 기법들이 있다.

오늘은 여기까지...!

0개의 댓글

관련 채용 정보