기능
- 프로세서, 기억장치, 입출력장치, 파일 및 정보 등의 자원을 관리.
- 자원을 효율적으로 관리하기 위해 자원의 스케줄링 기능을 제공
(스케줄링이란 어떤 자원을 누가, 언제, 어떤 방식으로 사용할지를 결정해주는 것)- 사용자와 시스템 간의 인터페이스를 제공.
- 시스템의 각종 하드웨어와 네트워크를 관리하고 제어.
운영체제가 없다면, 응용 프로그램이 실행될 수 없다.
프로세스는 프로그램이 실행 중인 상태로 특정 메모리 공간에 프로그램의 코드가 적재되고 CPU 가 해당 명령어를 하나씩 수행하고 있는 상태를 의미한다.
결론은 다르다
- 프로세서(Processor)
프로세서는 하드웨어적인 측면과 소프트웨어적인 측면으로 나누어 볼 수 있다.
하드웨어적인 측면
: 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛으로, 중앙처리장치(CPU)를 의미한다
적어도 하나 이상의 ALU와 레지스터를 내장하고 있다.
소프트웨어적인 측면
: 데이터 포맷을 변환하는 역할을 수행하는 데이터 처리 시스템을 의미한다.
워드프로세서나 컴파일러 등이 여기에 속한다.- 프로세스(Process)
프로세스는 특정 목적을 수행하기 위해 나열된 작업의 목록을 의미한다.
메모리에 적재 되어 프로세서에 의해 실행 중인 프로그램을 프로세스라고 볼 수 있다.
즉, 실행중인 프로그램이라고 봐도 무방하다.
명령어가 CPU 를 통해서 수행되는 객체의 단위이다.
하나의 프로세스 내에는 반드시 1개 이상의 스레드가 존재하며,
이러한 스레드는 같은 프로세스에 있는 자원과 상태를 공유합니다.
즉, 여러개의 스레드가 프로세스를 만든다?
하나의 프로세스 안에서 여러 개의 루틴을 동시에 수행하여서 수행 능력을 향상하려고 할 때 스레드를 사용하게 되는데,
독립적으로 수행하여 처리하려고 할 때 사용하게 된다.
예를 들어, 워드 프로세서에서 사용자로부터 키보드 입력 받거나, 그래픽이나 UI를 그리고 문법 오류를 체크하는 등 워드 프로세서 내에서 여러 요청들을 동시에 처리해야 하는데, 이때 스레드가 필요하게 된다.
스레드는 가상 CPU, 수행 코드, 처리 데이터로 구성.
프로세스가 단일 스레드로 동작하는 방식으로 일련의 처리를 단일 스레드만으로 직렬 처리하는 프로그래밍 방법.
하나의 레지스터, 스택으로 표현한다.
자바스크립트가 가장 대표적인 싱글 스레드 언어이다.
(런타임 환경이 싱글 스레드의 약점을 보완해준다.)
자원 접근에 대한 동기화를 신경쓰지 않아도 된다.
여러 개의 스레드가 프로세스의 자원을 공유할 경우,각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근을 제어해야 합니다. 쉽게 말해서, 모든 스레드가 일정 자원에 동시에 접근하거나, 똑같은 작업을 실행하려는 경우,에러가 발생하거나 원하는 값이 나오지 않습니다. 그래서, 스레드들이 동시에 같은 자원에 접근하지 못하도록 제어해줘야만 합니다.
자원 접근에 대한 동기화를 신경쓰지 않아도 되므로 문맥 교환(context switch) 작업 또한 요구하지 않습니다. 문맥 교환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 합니다.
프로그래밍 난이도가 쉽고, CPU 메모리를 적게 사용합니다.
여러 개의 CPU를 활용하지 못합니다.
싱글 스레드는 하나의 물리적 코어밖에 사용하지 못해 멀티 코어 머신에서 CPU 사용을 최적화할 수 없습니다.
최적화를 위해선 Cluster 모듈을 이용하여 여러 프로세스를 사용할 수 있습니다.
하지만 앞서 프로세스끼리의 자원 공유는 어렵기 때문에 Redis와 같은 부가 인프라가 필요합니다.
연산량이 많은 작업을 하는 경우, 그 작업이 완료되어야 다른 작업을 수행할 수 있습니다.
싱글 스레드 모델은 에러 처리를 못하는 경우 멈춰버리게 됩니다.
멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복할 수 있습니다.
- 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미
- 멀티 프로세스(multi process)는 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것을 의미합.
- 시스템 자원의 활용 극대화 및 처리량 증대할 수 있어 단일 프로세스 시스템의 효율성을 높일 수 있다.
싱글 스레드인 경우, 작업이 끝나기 전까지 사용자에게 응답하지 않지만 반면 멀티스레드인 경우 작업을 분리해서 수행하므로 실시간으로 사용자에게 응답할 수 있습니다.
싱글 스레드인 경우 한 프로세스는 오직 한 프로세서에서만 수행 가능하지만 반면 멀티 스레드인 경우 한 프로세스를 여러 프로세서에서 수행할 수 있으므로 훨씬 효율적입니다.
주의 깊은 설계가 필요하며, 디버깅이 까다롭습니다.
단일 프로세스 시스템의 경우 효과를 기대하기 어려우며 다른 프로세스에서 스레드를 제어할 수 없습니다.
(즉, 프로세스 밖에서 스레드 각각을 제어할 수 없습니다.)
멀티 스레드의 경우 자원 공유의 문제가 발생합니다.
하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받게 됩니다.
문맥 교환 작업을 요구합니다.
CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 문맥 교환(Context Switching)이라 합니다.
문맥 교환이란 다른 태스크(프로세스, 스레드)가 시작할 수 있도록 이미 실행 중인 태스크(프로세스, 스레드)를 멈추는 것을 말합니다.
데드락(Deadlock, 교착 상태), 뮤텍스(Mutex), 세마포어(Semaphore) 와 같은 키워드를 알아두자.
동시에 돌릴 수 있는 스레드 수는 컴퓨터에 있는 코어 개수로 제한된다.
운영체제(또는 가상 머신)는 각 스레드를 시간에 따라 분할하여, 여러 스레드가 일정 시간마다 돌아가면서 실행되도록 한다.
이런 방식을 시분할이라고 한다.
Concurrency(동시성, 병행성): 여러 개의 스레드가 시분할 방식으로 동시에 수행되는 것처럼 착각을 불러일으킴
Parallelism(병렬성): 멀티 코어 환경에서 여러 개의 스레드가 실제로 동시에 수행됨