1. 프로그램과 프로세스
프로그램은 저장장치에 저장되어 있는 정적인 상태이고, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태이다.
2. 프로세스의 상태
- 생성 상태: 프로그램을 메모리에 가져와 실행 준비가 완료된 상태.
- 준비 상태: 실행을 기다리는 모든 프로세스가 자기 차례를 기다리는 상태. 실행될 프로세스를 CPU 스케줄러가 선택하게됨.
- 실행 상태: 선택된 프로세스가 타임 슬라이스를 얻어 CPU를 사용하는 상태이다. 프로세스 사이의 문맥 교환이 일어난다.
- 대기 상태: 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태이다. 입출력이 완료되면 준비 상태로 간다.
- 완료 상태: 프로세스가 종료된 상태이다. 사용하던 모든 데이터가 정리됨. 정상 종료인 exit와 비정상 종료인 abort를 포함한다.
3. 프로세스 제어 블록
프로세스를 실행하는데 필요한 중요한 정보를 보관하는 자료구조로, 모든 프로세스는 고유의 프로세스 제어 블록을 가진다. 프로세스 제어 블록은 프로세스 생성 시 만들어져서 프로세스가 실행을 완료하면 폐기한다. 다양한 정보 중 대표적인 세가지는 다음과 같다.
- 프로세스 구분자: 프로세스를 구분하기 위한 프로세스 구분자(PID).
- 메모리 관련 정보: CPU는 실행하려는 프로세스가 메모리의 어디에 저장되어 있는지를 알아야 한다. 이를 위한 프로세스의 메모리 위치 정보와 메모리 보호를 위한 경계 레지스터와 한계 레지스터도 포함되어 있다.
- 각종 중간값: 프로세스 제어 블록에는 프로세스가 사용했던 중간 값이 저장되는데 이는 여러 프로세스가 번갈아가며 실행되는데 만약 A프로세스 에서 50번 행까지 작업을 했다가 B프로세스에게 CPU를 넘겨주었고, 다시 A프로세스의 차례가 되면 51번 행 코드를 실행시켜야 하기 때문.
4. 문맥 교환
두 프로세스의 프로세스 제어 블록 및 이와 관련된 값들을 교환하는 작업을 말한다. 일반적으로 문맥 교환은 한 프로세스가 자신에게 주어진 시간을 다 사용하면 발생하고, 인터럽트가 걸렸을 때도 발생한다.
5. 프로세스의 복사와 전환
- fork() 시스템 호출: 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다.(자식 프로세스 생성됨)
- exec() 시스템 호출: 기존의 프로세스를 새로운 프로세스로 전환하는 함수이다. 해당 방식은 프로세스 구조를 재활용하는 방식으로써 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출이다. exec() 시스템 호출을 하면 현재의 프로세스가 완전히 다른 프로세스로 전환된다.
(프로세스를 새로 메모리에 올리지 않고 기존 프로세스의 구조체를 활용하기 위함)
6. 프로세스의 계층 구조
부모 프로세스를 복사하여 자식 프로세스를 만드는 방법으로 프로세스끼리 계층 구조를 갖는 것을 말한다. 부모 프로세스는 자신의 자원을 자식 프로세스에 상속하고 자식 프로세스가 종료되면 그 자원을 회수한다.
7. 스레드
CPU 스케줄러가 CPU에 전달하는 일 하나를 스레드라고 하며, 하나의 프로세스에는 여러개의 스레드가 존재하기도 한다.
8. 스레드 관련 용어
- 멀티스레드: 멀티스레드는 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법이다.(스레드들은 데이터를 공유함.)
- 멀티태스킹: 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법이다.
- 멀티프로세싱: CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경을 말한다.
- CPU 멀티스레드: 한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법이다.
9. 멀티스레드의 장점
- 응답성 향상: 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있다.
- 자원 공유: 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 고융하게 되어 작업을 원활하게 진행할 수 있다.
- 효율성 향상: 불필요한 자원의 중복을 막음으로써 시스템의 효율이 향상된다.
- 다중CPU 지원: 2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 사용하면 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스의 처리 시간이 단축 된다.
느낀점
- 프로세스의 여러 상태에 대해 알 수 있었다.
- 문맥 교환이 일어났을때 프로세스 제어 블록을 활용하여 기존 작업내역을 담아두어 여러 프로세스들을 관리함을 알 수 있었다.
- 멀티스레드와 멀티프로세싱에 대해 명확히 알 수 있었다
- 웹 브라우저인 크롬과 익스플로어를 예로 설명하자면 크롬의 경우 멀티프로세싱을 활용한 브라우저로써 각 탭마다 각각의 프로세스를 생성하지만, 익스플로어의 경우 멀티스레드를 활용한 브라우저로써 각 탭마다 스레드를 생성한다. 즉, 익스플로어의 경우 하나의 프로세스에서 각 스레드가 자원을 공유하기 때문에 1번탭이 멈추면 2번탭 3번탭 또한 작동이 안된다. 반면 크롬의 경우 각각의 탭이 각자의 프로세스 영역이기에 메모리 효율은 좋지 못하지만 1번 탭이 멈춰도 2번탭 3번탭은 영향이 없다.
- 익스플러어는 과거에 만들어져 메모리의 용량이 충분치 못하여 자원을 아끼기위해 멀티스레드로 구현한걸까? 현대사회는 개인이 가지는 PC의 메모리의 용량이 갈수록 거대해지는데 내가 자바로 코딩을할때 자원을 아끼는것이 좋을까 아님 협업을 위한 가독성 좋은 코드를 짜는것이 중요할까?