유닉스 프로세스의 종류
- 사용자 프로세스: 단말기와 사용자와 관련된 프로세스
- 커널 프로세스: 커널 모드에서 실행, 프로세스 0
- 데몬 프로세스: 다른 사용자와 전혀 관련 없지만, 전역 함수와 같이 네트워크 제어/관리 등 시스템 지원하는 프로세스
유닉스 프로세스의 구조
프로세스 테이블
- 정보를 프로세스마다 유지하고, 항상 메인 메모리에 상주함
- 프로세스 상태 필드(준비 상태, 실행 상태, 수면 상태 등), 사용자 영역 포인터, 프로세스 식별자(ID 또는 PID), 사용자 식별자(ID 또는 UID), 프로세스 크기, 이벤트 디스크립터, 스케줄링 매개변수 항목 등
- 공유 코드가 있는 프로세스에서 텍스트 테이블을 유지하여 공유 코드의 메인 메모리 주소(디스크 주소)와 이 코드를 사용하는 프로세스 수 추적 카운터 등 정보 포함
각 프로세스의 사용자 영역
- 텍스트, 데이터, 스택으로 구분함
- 텍스트에는 프로그램의 명령어들을 저장하여 읽을 수만 있음
- 데이터와 스택은 항상 동일한 주소 공간에 있지만 독립적으로 반대 방향으로 늘어남
- 커널을 실행할 때 필요한 추가 정보 들어 있음
- 프로세스의 테이블 포인터, 시스템 호출 매개변수, 사용자 식별자, 사용자와 커널의 사용 시간, 시스템 호출을 할 때 발생하는 오류, 시스템 호출의 반환 값, 프로세스가 시그널을 수신했을 때 수행하는 동작, 입출력과 파일의 매개변수 등
사용자 테이블
- 프로세스가 대치되지 않고 메모리에 있을 때 필요한 정보 보관
- 해당 프로세스 활성화 때만 메인 메모리의 임시 영역에 적재
- 커널 가상 데이터 영역으로 매핑, 열린 파일의 테이블은 사용자 테이블에 유지
유닉스 프로세스 스케줄링
- 커널이 프로세스 여러 개를 스케줄링하여 동시 실행하는 것처럼 보이지만, 프로세스는 독립적인 명령 순서에 따라 실행 다른 프로세스로 분기하지 않음
- 시분할 시스템에서 커널은 각 프로세스에 시간 할당량이라는 시간 동안 프로세서 할당
- 시간 할당량 초과하면 그 프로세스 중단시키고 다른 프로세스 스케줄링
- 프로세스들은 프로세서 위주의 작업들을 수행하는 순환 할당 알고리즘과 같은 우선순위 알고리즘으로 프로세서의 시간 일부 할당 받음
- 유닉스 스케줄러는 다단계 피드백이 있는 순환 할당 스케줄러에 속함
- 커널이 프로세스에 프로세서 시간 할당
- 프로세스가 할당된 시간을 초과하면 중단한 후 여러 우선순위를 갖는 큐 중에서 우선순위가 가장 높은 것 하나 선택
프로세스 제어
- fork 명령어로 만들고, 부모 프로세스의 주소 공간의 복사본(동일한 프로그램과 값이 똑같은 동일한 변수)으로 구성
- 부모와 자식 관계의 프로세스는 fork 명령어를 수행 후에도 계속 실행
- 새로운 자식 프로세스는 fork 명령어의 반환 값으로 0을 되돌려 줌
- execve 명령어는 가상 메모리에 새로운 프로그램을 대치, 부모와 자식 프로세스 중 한 프로세스 생성 후 사용
- exit 명령어로 종료, 부모 프로세스는 wait 명령어가 자식 프로세스 종료하기 전까지 대기
- 자식 프로세스에 오류가 발생하면 exit 명령어 수행
- 자식 프로세스가 존재하는 시간과 부모 프로세스가 wait 명령어를 끝내는 시간 사이에 프로세스는 아무 일도 하지 않음
- 부모 프로세스를 자식보다 먼저 종료하면 자식 프로세스는 좀비 프로세스 됨