운영체제는 프로세스에서 생성, 종료, 삭제, 중단, 재시작, 대기, 문맥 교환, 우선순위 변경 등 다양한 작업을 수행할 수 있다. 이것들을 실행하려면 먼저 프로세스의 구조를 이해해야 할 수 있다.
프로세스의 구조
프로세스는 수행 중에 프로세스 생성 시스템 호출을 이용하여 새로운 프로세스를 만들 수 있다. 부모 프로세스는 자식 프로세스를 생성하는 과정을 반복하면서 계층 구조를 만든다. 프로세스 생성 순번을 저장하고 부모-자식 관계를 유지하여 계층적으로 만든다. 프로세스를 새로 만드는 프로세스는 부모 프로세스이고, 생성되는 프로세스는 자식 프로세스 혹은 서브 프로세스이다.
프로세스의 생성
일괄 처리 환경에서는 준비 큐에 작업 도달할 때 프로세스를 만들고, 대화형 환경에서는 새로운 로그온 때 프로세스를 생성한다. 운영체제나 응용 프로그램에서 요구를 받아 프로세스를 만들면, 운영체제는 해당 프로세스에서 프로세스 제어 블록을 만들어 주소 공간을 나누어준다.
예시를 들면, 사용자의 요구 사항에 따라 프린터를 구동하는 프로세스를 만들면 해당 프로세스의 식별자를 선택하고, 프로세스 제어 블록을 생성하고, 우선순위를 주고, 초기 자원을 나눠준 후 준비 상태가 되어 준비 리스트의 마지막의 위치 한다. 다음은 이런 프로세스를 생성할 때 필수인 세부 작업을 단계별로 정리한 것이다
1. 새로운 프로세스에 프로세스 식별자 역할을 준다.
2. 프로세스 컨트롤 블록 공간과 프로세스의 모든 구성 요소를 포함할 수 있는 주소 공간 할당한다.
3. 프로세스 컨트롤 블록을 초기화한다. 프로세스 상태, 프로그램 카운터 등 초기화, 자원 요구. 프로세스 통제 정보 등을 포함한다.
4. 링크를 건다.
프로세스를 만들 때는 이런 자원 외에도 일부 초기화 데이터를 부모 프로세스에서 자식 프로세스로 전파하기도 한다. 예시로 들면, P 파일의 상태를 단말기에 표시하는 P1 프로세스가 있다고 하면 P1 프로세스를 만들면 부모 프로세스에서 이름이 P인 파일을 입력받아 필수인 정보를 얻고 출력장치의 기능도 전해 받을 수 있다.
프로세스가 작업을 실행하려면 프로세서 점유 시간, 입출력장치, 파일, 메모리 등 자원이 필수이다. 자식 프로세스는 운영체제에서 직접 필수인 자원을 얻거나 부모 프로세스의 자원을 일부분 사용할 수 있다. 이때 부모 프로세스는 자식 프로세스가 이용하는 자원을 제한해서 특정 프로세스가 자식 프로세스를 너무 다량으로 만들어 시스템에 부담을 주는 것을 막을 수 있다. 프로세스가 새로운 프로세스를 만들 때 다음 두 가지 실행이 일어날 수 있다.
- 부모 프로세스와 자식 프로세스를 동시에 수행한다.
- 부모 프로세스는 자식 프로세스를 전부 종료할 때까지 기다린다.
유닉스를 예시로 들면, 유닉스에는 각 프로세스마다 정수로 된 고유한 프로세스 식별자가 있다. 부모 프로세스와 자식 프로세스가 fork 명령어를 같은 순간에 수행하여 실행을 반복하면 자식 프로세스는 식별자가 0이 되고, 자식 프로세스의 식별자는 부모 프로세스의 식별자가 된다. fork 명령어로 새로운 프로세스를 만들면 부모 프로세스의 주소 공간을 복사하여 부모 프로세스와 자식 프로세스의 정보를 간단하게 교환할 수 있다. fork 명령어를 실행하면 자식 프로세스에는 0을 반환하지만, 부모 프로세스에는 자식 프로세스의 식별자를 반환하게 된다. 윈도우 NT 계열 이상에서는 부모 프로세스의 주소 공간을 복사하거나 별도의 프로그램을 적재(주소 공간에 탑재하는 프로그램의 이름을 운영체제에서 명칭) 방법을 모두 보조한다.
프로세스의 종료
abort 명령어로도 프로세스를 종료할 수 있다. 자식 프로세스는 종료할 때 자신의 식별자를 부모 프로세스에 알린다. abort 명령어는 종료할 프로세스의 부모 프로세스만 호출하는데, 부모가 아닌 다른 프로세스가 임의로 해당 프로세스를 중지할 수가 없기 때문이다.
대화형 환경에서는 사용자가 터미널을 닫거나 사용자가 로그오프 하면 프로세스를 종료한다. 프로세스가 마지막 명령을 수행하면 종료하여 운영체제에 프로세스의 제거를 요구한다. 일괄 처리 환경에서는 작업 종료를 뜻하는 신호로 인터러브를 생성하거나 시스템 호출로 중지 명령을 전파하여 프로세스는 종료한다. 이외에도 오류로 프로세스를 종료할 수 있다.
부모 프로세스는 다음 상황에서 자식 프로세스를 종료할 수 있다. 일반적으로 부모 프로세스를 종료하면 자식 프로세스는 중요치 않으므로 운영체제가 자식 프로세스도 종료하는데, 이를 연속 종료라고 한다.
- 자식 프로세스에 나누어준 작업이 더는 존재하지 않을 때
- 자식 프로세스가 할당된 자원을 초과하여 자원을 사용할 때
wait 명령어는 종료한 자식 프로세스의 식별자를 부모 프로세스에 돌려주므로 어떤 자식 프로세스를 종료했는지 알려 준다. 유닉스에서는 exit 명령어로 프로세스를 종료하고, 부모 프로세스는 wait 명령어를 이용하여 자식 프로세스의 종료를 기다린다. 프로세스는 몇 가지 이유로 종료할 수 있는데 다음은 그 몇 가지 예시이다.
- 시간 초과는 프로세스가 명시된 전체 시간을 넘어서 수행하거나 명시된 시간을 초과하면서 어떤 이벤트 생성을 기다릴 때
- 실패는 파일 검색 실패, 입출력이 명시된 흿수를 넘어서 실패할 때
- 정상 종료는 프로세스가 운영체제의 서비스를 호출할 때
- 산술 오류, 보안 오류, 데이터 오류 등
- 액세스 위반, 메모리 용량 부족 등
요약 및 결론
• 운영체제는 프로세스에서 생성, 종료, 삭제, 중단, 재시작, 대기, 문맥 교환, 우선순위 변경 등 다양한 작업을 수행할 수 있다.
• 프로세스는 수행 중에 프로세스 생성 시스템 호출을 이용하여 새로운 프로세스를 만들 수 있다.
• 프로세스를 만들 때는 프로세스 식별자, 프로세스 제어 블록 공간, 프로세스의 모든 구성 요소를 포함할 수 있는 주소 공간을 할당하고, 프로세스 제어 블록을 초기화한다.
• 프로세스가 작업을 실행하려면 프로세서 점유 시간, 입출력장치, 파일, 메모리 등 자원이 필수적이다.
• 프로세스는 abort 명령어로도 종료할 수 있다.
• 프로세스는 시간 초과, 실패, 정상 종료, 산술 오류, 보안 오류, 데이터 오류, 액세스 위반, 메모리 부족 등 여러 가지 이유로 종료될 수 있다.
'IT 및 프로그래밍' 카테고리의 다른 글
프로세스와 스레드 중 프로세스의 관리에 대하여 - 2 (0) | 2024.10.22 |
---|---|
운영체제의 발전 과정과 유형 중 유형에 대하여 (0) | 2024.10.22 |
운영체제의 다양한 기능 (0) | 2024.10.22 |
프로세스와 스레드 중 스레드의 개념과 상태 변화에 관해 (0) | 2024.10.22 |
프로세스와 스레드 중 프로세스의 상태 변화에 대해 (0) | 2024.10.21 |
프로세스와 스레드 중 프로세스의 개념에 대하여 (0) | 2024.10.21 |
운영체제의 서비스에 대해 (0) | 2024.10.20 |
운영체제의 발전 과정과 유형 중 발전 과정에 대하여 - 2 (0) | 2024.10.20 |