1. 프로그램과 프로세스
프로그램 : 저장장치에 저장되어 있는 정적인 상태
프로세스 : 실행을 위해 메모리에 올라온 동적인 상태
2. 프로세스의 상태
운영체제에서는 여러가지 이유로 프로세스의 상태가 있는데
생성 상태, 준비 상태, 실행 상태, 대기 상태, 완료 상태 5가지가 있습니다.
- 생성 상태 : 프로그램을 메모리에 가져와 실행 준비가 완료된 상태
- 준비 상태 : 실행을 기다리는 모든 프로세스가 자기 차례를 기다리는 상태입니다.(실행될 프로세스를 CPU 스케줄러가 선택합니다.)
- 실행 상태 : 선택된 프로세스가 타임 슬라이스를 얻어 CPU를 사용하는 상태입니다. 프로세스 사이의 문맥 교환이 일어납니다.
- 대기 상태 : 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태입니다. (입축력이 완료되면 준비 상태로 갑니다.)
- 완료 상태 : 프로세스가 종료된 상태입니다. 사용하던 모든 데이터가 정리됩니다. 정상 종료인 exit 와 비정상 종료인 abort 를 포함합니다.
3. 프로세스 제어 블록
프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료 구조로, 모든 프로세스는 고유의 프로세스 제어 블록을 가진다. 프로세스 제어 블록은 프로세스 생성 시 만들어져서 프로세스가 실행을 완료하면 폐기됩니다.
프로세스 제어 블록은 다음과 같이 구성됩니다.
포인터 | 프로세스 상태 |
프로세스 구분자 | |
프로그램 카운터 | |
프로세스 우선 순위 | |
각종 레지스터 정보 | |
메모리 관리 정보 | |
할당된 자원 정보 | |
계정 정보 | |
PPID와 CPID | |
. . . |
- 포인터 : 프로세스 제어 블록을 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 사용됩니다.
- 프로세스 상태 : 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등의 프로세스가 현재 어떤 상태인지를 나타냅니다.
- 프로세스 구분자 : 운영체제 내에 있는 여러 프로세스를 구별하기 위한 구분자를 저장합니다.
- 프로그램 카운터 : 다음에 실행될 명령어와 위치를 가리키는 프로그램 카운터의 값을 저장합니다.
- 프로세스 우선순위 : 프로세스의 중요도는 각각 다릅니다. 사용자 프로세스보다 중요도가 큰 커널 프로세스는 우선순위가 높고, 사용자 프로세스끼리도 우선순위가 다릅니다. CPU 스케쥴러가 분비 상태에 있는 프로세스 중 실행상태로 옮겨야 할 프로세스를 선택할 때는 프로세스 우선순위를 기준으로 삼는다.
- 각종 레지스터 정보 : 프로세스가 실행되는 중에 사용하던 레지스터의 값이 저장됩니다. 이전에 실행할 때 사용한 레지스터의 값을 보관해야 다음에 실행할 수 있기 때문에 자신이 사용하던 레지스터의 중간값을 보관합니다.
- 메모리 관리 정보 : 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등이 저장됩니다.
- 할당된 자원 정보 : 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보를 저장합니다.
- 계정 정보 : 계정번호, CPU 할당 시간, CPU 사용 시간 등으로, 이러한 정보가 저장됩니다.
- PPID 와 CPID : 부모 프로세스 구분자와 자식 프로세스 구분자의 정보도 저장됩니다.
4. 문맥 교환
두 프로세스의 프로세스 제어 블록 및 이와 관련된 값들을 교환하는 작업을 말합니다. 일반적으로 문맥 교환은 한 프로세스가 자신에게 주어진 시간을 다 사용하면 발생하고, 인터럽트가 걸렸을 때도 발생합니다.
5. 프로세스의 복사와 전환
- fork() 시스템 호출 : 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수입니다.
- exec() 시스템 호출 : 기존의 프로세스를 새로운 프로세스로 전환하는 함수입니다.
6. 프로세스의 계층 구조
부모 프로세스를 복사하여 자식 프로세스를 만드는 방법으로 프로세스끼리 계층 구조를 갖는 것을 말합니다.
부모 프로세스는 자신의 자원을 자식 프로세스에 상속하고 자식 프로세스가 종료되면 그 자원을 회수합니다.
7. 스레드
CPU 스케줄러가 CPU에 전달하는 일 하나를 스레드 라고 하며, 하나의 프로세스에는 여러개의 스레드(멀티 스레드)가 존재하기도 합니다.
8. 스레드 관련 용어
- 멀티 스레드 : 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법입니다.
- 멀티태스킹 : 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법입니다.(시분할 시스템)
- 멀티프로세싱 : CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경을 말합니다.
- CPU 멀티스레드 : 한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법입니다.
스레드의 탄생 배경
프로세스와 스레드의 개념이 복잡한 이유는 탄생 배경에 있습니다.
프로세스라는 개념은 운영체제가 설계될 당시에 만들어졌지만 스레드라는 개념이 만들어진 것은 한참 후의 일입니다.
초기의 운영체제에서는 작업의 단위가 프로세스 하나 뿐이었습니다. 당시 프로세스는 위에서 아래로 순차적으로 실행됐습니다.
따라서 프로세스의 내부 작업을 여러개로 나누기 어려웠습니다.
지금의 스레드 개념에 비교하면 1개의 스레드를 가진 프로세스만 있는 셈입니다.
CPU와 프로그래밍 기술이 발전하면서 여러 개의 코어를 가진 CPU가 생겨나 멀티스레드를 지원하기 시작했습니다.
프로세스에 하나의 스레드만 있다면 여러 코어에 나누어 동시에 작업하는 멀티스레드의 장점을 살릴 수 없습니다.
따라서 오늘날의 운영체제는 프로세스를 다양한 스레드로 나누어 여러개의 코어에 배분함로써 시스템의 효율을 높입니다.
9. 멀티스레드의 장점
- 응답성 향상 : 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있습니다.
- 자원 공유 : 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 작업을 원할하게 진행할 수 있습니다.
- 효율성 향상 : 불필요한 자원의 중복을 막음으로써 시스템의 효율이 향상됩니다.
- 다중 CPU 지원: 2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 사용하면 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스의 처리 시간이 단축 됩니다.
10. 멀티스레드 모델
프로세스는 커널 프로세스와 사용자 프로세스로 나뉘며 스레드에도 커널 스레드 와 사용자 스레드가 있습니다.
- 커널 스레드 : 커널이 직접 생성하고 관리하는 스레드
- 사용자 스레드 : 라이브러리에 의해 구현된 일반적인 스레드
사용자가 커널 스레드를 사용하려면 시스템 호출로 커널 기능을 이용해야 합니다.
이때 커널 스레드와 사용자 스레드의 대응 방식에 따라 다음과 같이 분류할 수 있습니다.
- 사용자 레벨 스레드 : 사용자 레벨에서 관련 라이브러리를 사용하여 구현하며, 라이브러리는 커널이 지원하는 스케줄링이나 동기화 같은 기능을 대신 구현해줍니다.
- 커널 레벨 스레드 : 커널이 멀티스레드를 지원하는 방식입니다.
- 멀티레벨 스레드 : 사용자 레벨 스레드와 커널 레벨 스레드를 혼합한 방식으로 하이브리드 스레드 라고도 합니다.
'CS > 운영체제' 카테고리의 다른 글
6) 교착 상태 (0) | 2020.09.14 |
---|---|
5) 프로세스 동기화 (0) | 2020.09.10 |
4) CPU 스케줄링 (0) | 2020.09.06 |
2) 컴퓨터의 구조와 성능 향상 (0) | 2020.09.01 |
1) 운영체제의 개요 (0) | 2020.09.01 |
댓글