/* 해당 자료는 반효경 교수님의 운영체제 강의 자료를 기반으로 정리되었습니다. ! */
첫 주차 project1을 들어가기 전에 project1을 진행하기 위해 알아야할 개념들을 정리하고 진행하려고 한다.
Process is a program in execution!
프로세스 상태(status)는 개념적으로 5가지 정도로 나눌 수 있다.
위에 그림에서 볼 수 있듯이, 현재 cpu에서 돌고 있는 process는 running의 상태이고, running을 기다리는 ready 상태의 프로세스들은 ready queue에서 기다리고 있다.
더불어 I/O를 기다리는 process 들은 당장 cpu가 준비되더라도 I/O가 되어야 실행할 수 있는 process들은 blocked 상태로 I/O queue에서 기다리고 있다.
더불어 공유 데이터를 사용하려고 기다리는 프로세스도 blocked 상태로 resource queue 에서 기다리고 있다.
운영체제가 각 프로세스들을 관리하기 위해서 PCB에 프로세스에 관한 정보를 담아둔다. 위에서 프로세스의 상태를 여기다 저장 한다.
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정을 말한다.
만약 A프로세스에서 B프로세스로 context swithch 가 일어난다고 하면, 다음과 같은 절차를 거친다.
여기서 무조건 인터럽트나 시스템 콜이 발생한다고 해서 문맥교환이 일어나는게 아니다.
만약 A프로세스를 실행하다가 인터럽트가 들어오면, 인터럽트 관련 루틴을 돌고 다시 A프로세스로 돌아가는 경우가 있다. 이럴 경우 프로세스가 변경되지 않는다. 즉 문맥교환이 일어난게 아니다.
하지만 timer interrupt나 I/O 요청 시스템 콜이 호출되면,
프로세스가 변경되기 때문에 문맥교환이 일어난다.
쓰레드는 프로세스 내에서 실행되는 흐름의 단위를 말한다. (가장 작은)
위의 그림 처럼 PCB내에 여러 쓰레드에 대한 정보가 들어간다.
쓰레드 별로 프로그램 카운터, 레지스터 세트, 스택 스페이스를 포함한다.
쓰레드를 사용하면 좋은 점이 몇 가지 있다.
1. 응답이 빠르고 2. 자원을 공유하고 3. 경제적이고 4. cpu가 여러 개면 병렬로 사용이 가능
만약에 쓰레드가 없이 프로세스들로만 프로그램이 작동된다면, 위에서 문맥 교환이 일어날때 처럼, 매번 프로세스가 변경될 때마다, 데이터들을 저장하고 cpu에게 정보를 넘겨주는 작업들이 반복된다. 왜냐하면 프로세스 별로는 메모리를 공유하지 않기 때문이다.
그런데 쓰레드를 사용하게 되면, 메모리를 공유하게 되어 문맥 전환에 부하가 적고, 응답이 빠르다. 즉 경제적이다.
하지만 메모리를 공유하게 되면서 동기화의 문제를 겪게된다. 그런 동기화를 잘 이루게 해줄 수 있는 방법이 몇 가지 있다.
현재 running 중인 쓰레드가 공유 자원을 사용하려고 할 때,
lock을 소유하는 다른 쓰레드가 있는지 확인하고(holder 확인), 없다면 자신이 소유하면서 다른 쓰레드가 접근하지 못하도록 lock을 걸어, 자신이 사용하는 동안 사용하지 못하게 하는 방법이다.
lock의 holder는 즉 뮤텍스이다.
뮤텍스는 프로세스나 스레드가 공유자원을 lock()을 통해 잠금을 설정하고, 사용한 후에는 unlock()을 통해 잠금을 해제하는 객체이다.