저장 장치에 저장은 되어있지만, 아직 메모리에 올라가지 않은, 정적인 상태를 의미한다. 그러니까 사용자가 클릭해서 실행하기 이전의 파일을 의미한다. 그저 코드 덩어리다.
프로세스는 운영체제 위에서 연속적으로 실행 되고 있는 독립된 메모리를 가진 프로그램을 의미한다. 따라서 프로세스 끼리는 서로 접근 할 수 없다.(진짜?)
프로세스에서 다루는 일꾼이다. 하나의 프로세스에서 여러개가 동작할 수 있다. 프로세스는 운영체제로부터 독립적인 자원을 할당받는다면 스레드는 프로세스 내부의 자원을 공유해서 사용한다.
프로세스는 각각 Code, Data, Stack, Heap 형식의 메모리 구조를 가진다. 프로세스는 독립된 메모리 영역을 가지기 때문에 다른 프로세스의 메모리에 접근 할 수 없다. 반면에 스레드는 프로세스내의 stack 을 제외한 부분의 메모리를 공유한다. 스레드도 자기 할일이 있기 때문에 본인들의 stack이 있다.
프로세스는 오류가 발생하면 자기 혼자만 실행을 멈추고 종료된다. 스레드는 경우가 다른데, Code, Data, Heap 메모리 영역을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생하면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.
하나의 프로세스에서 하나의 스레드가 실행된다.
자원 접근에 대한 동기화를 신경 쓸 필요가 없다. Context Switching을 요구하지 않는다.
여러개의 CPU를 활용하지 못한다.
하나의 운영체제 안에서 여러 프로세스가 실행되는 것이다. 여러개의 프로세스가 동시에 실행되는 것처럼 보이게 한다.
하나의 프로세스 안에서 여러 스레드가 동작하는 것을 의미한다.
여러 스레드가 전역 변수를 사용하고 있는 경우라고 해 보자. A 스레드에서 자원 사용하다, 해당 자원에 대한 제어권이 다른 스레드로 넘어가고, 수정이 되었다. 그리고 다시 A 스레드에게 제어권이 돌아갔을 때 해당 자원에 접근하지 못하게 되거나, 수정된 자원에 접근하지 못하는 오류가 발생한다. 이처럼 여러 스레드가 함께 전역 변수를 사용할 경우 발생할 수 있는 충돌을 동기화 문제라고 한다. 스레드의 스케쥴링은 프로그래머의 영역이다. 신중하게 접근해야겠다.
처음에 적어놓은 링크다.
1. IPC(Inter-Process Communication)을 사용한다.
2. LPC(Local inter-Process Communication)을 사용한다.
3. 별도로 공유 메모리를 만들어서 정보를 주고받도록 설정해주면 된다.