프로세스는 프로세스에 의해 만들어진다.
컴퓨터가 부팅되면 운영체제가 메모리에 올라오는데 운영체제가 처음으로 수행하는 일 중 하나가 최초의 프로세스를 생성하는 것이다.
최초의 프로세스는 init이다.
이 이름은 운영체제마다 다르고 init은 UNIX 운영체제 기준 이름이다.
위 그림처럼 트리모양이 되는데 프로세스를 생성한 쪽을 부모 프로세스, 만들어진 프로세스를 자식 프로세스라고 한다.
같은 부모를 갖는 자식 프로세스끼리는 Sibling(형제) 프로세스라고 한다.
프로세스는 각각 고유의 번호를 갖는데 이를 PID(Process Identifier)라고 한다.
PID는 일반적으로 정수형(integer)로 표현한다.
PPID는 부모의 PID를 말한다.
fork()
exec()
를 이용한다.exit()
이다.스레드(Thread)는 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.
두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(Multi-Threaded Process) 라고한다.
한 프로그램에 여러개의 스레드가 있을 수 있는 이유는 스레드가 빠른 시간간격으로 스위칭되기 때문이다.
사용자에게는 여러 스레드가 동시에 실행되는 것처럼 보인다.
이처럼 CPU가 하나인 환경에서 여러 스레드가 스위칭에 의해 동시에 수행되는 효과를 concurrent라고 한다.
반면 여러 CPU환경에서 실제로 동시에 수행되는 것은 simultaneous라고 한다.
다중 스레드를 사용하는 대표적인 예로 Web browser이다.
화면을 출력하는 스레드와 데이터를 읽어오는 스레드가 기본적으로 따로 일을 수행한다.
이외에도 Word Processor, Media Player 등 현재의 대부분의 프로그램은 다중 스레드로 동작한다.
현재 운영체제에서는 대부분 다중 스레드를 지원하기 때문에 하나의 프로세스 안에서 여러 스레드를 수행하다가 다른 프로세스로 넘어가 그 프로세스의 스레드를 수행한다.
현대의 운영체제의 context switching 단위는 프로세스가 아닌 스레드 단위이다.
한 프로세스에는 기본적으로 하나의 스레드가 존재한다.
프로세스는 code, data 메모리 공간이 존재하는데 이는 여러 스레드가 같이 공유한다.
이외에도 프로세스의 자원인 file, I/O 등은 여러 스레드가 공유하지만 각 스레드가 고유하게 가지고 있는 것은 PC(Program Counter), SP(Stack Pointer), registers, stack 등이 있다.
동시성(Concurrency)와 병렬성(Parallelism)은 헷갈리기 쉬운 개념이다.
이 둘의 특징을 정리하면 다음과 같다.
Parallelism은 여러 코어에서 여러 작업을 동시에 수행하는 것이다. 코어가 하나밖에 없다면 병렬적으로 프로그램을 실행할 수 없다.
CPU는 싱글코어에서 한계를 느끼고 multi-core 체제로 넘어갔다.
여러 코어에서 여러 작업을 동시에 수행하면서 성능을 올리기 위함이다.
여러 작업을 동시에 수행하다보니 race condition 혹은 동기화 문제가 발생할 수 있다.
Concurrency는 빠르게 전환하며 여러 작업을 수행하여 동시에 여러작업이 실행되는 것처럼 보인다.
한개의 코어에서도 여러 작업을 Concurrent하게 실행할 수 있고 작업간에는 context switch가 일어난다.
Task가 동시에 수행될 때 생길 수 있는 문제점, 대표적으로 동기화 문제가 발생할 수 있다.
동기화 문제는 여러 작업이 동시에 공유된 자원에 접근하려 할 때 발생한다.
https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-7.-%EC%93%B0%EB%A0%88%EB%93%9CThread
https://spacebike.tistory.com/22
http://www.tcpschool.com/java/java_thread_concept
https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)