📌 Main References
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://zangzangs.tistory.com/128
사용자가 하드웨어를 사용하기 위해 필요한 소프트웨어로. 컴퓨터로 실행하는 모든 프로그램들은 운영체제에서 관리하고 제어한다.
(Windows, Mac OS, Linux, Unix ...)
운영체제는 응용 프로그램이 하드웨어에게 일을 시킬 수 있도록 돕고, 자원을 효율적으로 사용할 수 있게 한다.
응용 프로그램이 실행되고, 시스템 자원을 사용할 수 있도록 권한과 사용자를 관리한다. 따라서 프로그램은 하드웨어 자원을 직접적으로 사용하지 않고 운영체제가 제공하는 자원만을 사용할 수 있다.
크게 커널과 명령어 해석기로 나뉜다.
커널
운영체제가 수행하는 모든 것이 저장되어 있다.
명령어 해석기
사용자가 커널에 요청하는 명령어를 해석하여 커널에 요청하고 결과를 출력한다.
(사용자는 GUI/CLI와 같은 방식으로 운영체제에 명령을 요청할 수 있다.)
📞 시스템 콜 (System call)
응용 프로그램이 시스템 자원을 사용할 수 있도록, 운영체제 차원에서 다양한 함수를 제공하는 것
- 운영체제에서 실행중인 하나의 어플리케이션
- 메모리에 올라와 실행되고 있는 컴퓨터 프로그램 / 운영체제로부터 시스템 자원을 할당받는 작업의 단위
각 프로세스가 운영체제로부터 할당받는 시스템 자원
✔️ CPU 시간
✔️ 운영에 필요한 별도의 주소 공간
✔️ Code/Data/Stack/Heap 구조로 되어 있는 독립된 메모리 영역
기본적으로 프로세스당 최소 1개의 메인 스레드를 가지고 있다.
각 프로세스들은 다른 프로세스의 변수/자료구조에 접근할 수 없으며, 다른 프로세스의 자원에 접근하려면 IPC, inter-process-communication 등의 통신을 사용해야 한다.
(Ex. 파이프, 파일 소켓 ...)
- 코드가 실행되는 하나의 흐름
- 프로세스가 할당받은 자원을 이용하는 실행의 단위
프로세스 내의 각각의 스레드는 각각의 Stack을 따로 할당받으며, Code/Data/Heap 영역을 공유한다.
따라서 어떤 스레드가 프로세스 자원을 변경하면, 이웃 스레드들이 변경 결과를 볼 수 있다.
📚 멀티 태스킹
운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법이다. 쉽게 말해 두 가지 이상의 작업을 동시에 처리하는 것으로 멀티 프로세스 혹은 멀티 스레드를 의미한다.
🔁 Context Switching - CPU에서 여러 task(process, thread)를 돌아가며 작업을 처리하는 과정
- 동작 중인 task는 대기로 넘어가면서 해당 task의 Context를 보관하고, 대기하고 있던 다음 task가 동작을 시작하면서 이전에 보관했던 Context를 복구한다.
- multi process의 경우, Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 시간이 많이 소요되기 때문에 오버헤드가 발생하기 쉽다.
멀티 스레드를 동작하는 두 가지 방식
Concurrent (동시성/병행성)
싱글 코어 환경에서 여러 개의 스레드가 시분할 방식으로 동시에 수행되는 것 처럼 보인다. 이 때 Context Switching이 발생한다.
Parallelisma (병렬성)
멀티 코어 환경에서 여러 개의 스레드가 실제로 동시에 수행된다.
멀티 스레드
하나의 애플리케이션 내부에서의 멀티 태스킹
멀티 프로세스로 처리하던 일을 멀티 스레드로 구현할 경우, 공유 자원(전역 변수, Heap)을 이용하기 때문에 멀티 프로세스처럼 프로세스마다 자원을 할당하는 시스템 콜을 자주 할 필요가 없어 자원을 효율적으로 관리할 수 있다. 또한 프로세스간 통신보다 스레드간 통신의 비용이 적고 응답 시간이 단축된다.
하지만, 자원을 공유한다는 점 때문에 동기화 문제와 충돌 문제가 발생할 수 있으며 하나의 스레드에 문제가 생기면 전체 프로세스에서 영향을 받는다.
두 개 이상의 스레드(혹은 프로세스)가 서로 끝나기를 기다리고 있는 상태, 각 스레드가 자원을 하나씩 hold하고 있으면서 상대방이 가진 자원을 원하며 기다리고 있어서 어떠한 작업도 실행되지 못하고 무한정 대기한다.
📌 식사하는 철학자 문제
https://namu.wiki/w/%EC%8B%9D%EC%82%AC%ED%95%98%EB%8A%94%20%EC%B2%A0%ED%95%99%EC%9E%90%20%EB%AC%B8%EC%A0%9C
🔍 교착 상태 발생 조건 (상호 배제 / 점유 대기 / 비선점 / 순환 대기)
이 중 상호 배제 조건을 해결하기 위한 프로세스 동기화 기법으로 세마포어와 뮤텍스가 있다.
자원에 대한 접근 제한을 강제하기 위한 동기화 매커니즘이다. Boolean 타입의 Lock 변수를 사용하여 자원에 대한 접근을 제한한다.
변수를 통해 접근 가능한 스레드를 제한한다. 뮤텍스는 1개의 스레드만 자원을 사용할 수 있으나 세마포어는 변수만큼 공유 자원에 접근할 수 있다.