컴퓨터나 스마트폰 기기는 스스로 일을 할 수 없다. 누군가가 시켜야 하는데 그것이 운영체제다. 즉 하드웨어(기계)에게 일을 시키는 체제다.
운영체제가 없다면, 응용 프로그램이 실행될 수 없다.
하드웨어가 일을 하도록 하는 주체는 CPU
, RAM
, 디스크
등이 있다.
응용 프로그램은 시스템의 자원을 관리한다.
응용 프로그램을 마음대로 사용한다면, 해커에 의한 공격에 무방비한 상태가 된다. 그렇기 때문에 응용 프로그램이 실행되었을 때 시스템 자원을 사용할 수 있는 권한과 사용자에 대한 관리가 필요하다. 또한 여러 사람이 하나의 기기를 사용하는 경우에는 사용자를 관리하는 일도 매우 중요하다.
우선 운영체제가 응용 프로그램에게 컴퓨터를 조작할 수 있는 권한을 부여하면 그때 컴퓨터 내 시스템을 관리할 수 있다.
운영체제와 응용 프로그램이 소통하기 위해선 운영체제가 API를 응용 프로그램에게 제공해야 한다. 또한 응용 프로그램이 시스템 자원을 잘 활용할 수 있도록 운영체제 차원에서 다양한 함수를 제공하는 것을 시스템 콜(System call)
이라고 부른다.
프로세스는 프로그램이 실행된 것을 말한다.
예를 들어 chrome 브라우저를 두 개 실행하면, 두 개의 프로세스가 실행된다.
멀티 프로세스는 하나의 프로세스가 일을 처리하기 힘들 때 자식 프로세스를 fork 해서 사용하는 방식이다.
각 프로세스는 독립적으로 자원을 소모하고 독립적으로 메모리를 사용한다. 또한 다른 task(프로세스, 스레드)가 실행될 수 있도록 이미 실행 중인 task를 멈추게 하는 context-switching 비용이 든다.
스레드는 한 프로세스 내에서 나뉘어진 하나 이상의 실행단위 이다. 만약 한 프로세스 내에 스레드가 두개라면, 코드가 실행되는 흐름이 두 개 생긴다는 의미로 이해하면 될 것이다.
멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 의미한다. 멀티 프로세스로 작업을 할 수 있는 애플리케이션도 있는데 이 둘의 장단점을 확인하고 자신의 서비스에 더 fit한 것으로 택하면 될 것이다.
멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면,
멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이라고 할 수 있다.
멀티 스레드는 멀티 프로세스와 달리 스레드끼리 연결되어 있고 공유된 자원을 사용하기 때문에 통신비용이 절감되고,
공유된 메모리를 사용하기 때문에 효율적이다.
또한 context-switching 비용이 적다.
그렇기 때문에 자연스럽게 프로그램의 응답 시간이 단축된다.
하지만 같은 자원을 공유하기 때문에 서로 다른 스레드가 같은 데이터에 접근하고, 힙 영역을 공유하기 때문에 서로 다른 스레드가 서로 사용 중인 변수나 자료구조에 접근해 엉뚱한 값을 읽어오거나 수정하는 일이 발생할 수 있다.
그렇기 때문에 멀티스레드 환경에서는 동기화 작업이 필요하다.