🌞 스케줄러
프로세스의 상태 변화 관리
프로세스의 상태를 변화시키며 생성에서 종료까지 과정을 관리
스풀러가 디스크에 저장한 작업 중 실행할 작업을 선정하여 프로세스 생성
스케줄러가 프로세스를 선택하고 디스패처가 일을한다.
링크가 존재하여 프로세스의 스케줄링 큐의 포인터를 저장한다.
프로세스 상태 정보 저장
프로세스 생성시 메모리에 PCB생성, 프로세스 종료 후 PCB 삭제
PCB 내에 PCB 위치를 알 수 있는 정보가 있다.
PCB마다 하나의 프로세스를 가지고 있다.
프로세스식별자(PID)
프로세스상태 : 생성, 준비, 실행, 대기, 중단 등 상태 표시
프로그램 카운터 : 프로세스를 실행하는 다음 명령의 주소 표시
레지스터 저장 영역 : 현재 상태(사용중인 레지스터)를 저장하고 있어야 이후의 실행을 처리하는 경우에 그 상태를 유지한채로 다음 일을 할 수 있다.
프로세서 스케줄링 정보 : 우선순위, 스케줄링 큐의 포인터, 기타 스케줄 매개변수
회계 정보 : Account 프로세서 사용시간, 실제 사용 시간, 사용 상한 시간
입출력 상태 정보, 메모리 관리정보 등등 : 입출력 요구 프로세스에 할당된 입출력장치, 열린 파일 리스트, 메모리 시스템에 따른 상한,하한 결정
🌞 프로세스의 계층 구조
#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
for(i=0 ;i<3 ;i++)
{
fork();
}
return 0;
}
why ? 같은 메모리를 공유 하기 때문에 i의 값이 초기화 되지 않는다.
fork()
-> 실패시 return -1 성공시 부모 return 자식PID, 자식 = 0 리턴
execlp("/bin/ls", "ls", NULL);
-> 부모로부터 물려 받은 코드를 ls로 대체한다.
🌞 프로세스의 생성
일괄처리 환경 : 준비큐에 작업이 도착할 때
대화형 환경 : 새로운 사용자가 로그온 할 때
1) 프로세스 식별자 할당
2) 프로세스의 모든 굿어 요소를 포함할 수 있는 주소 공간과 PCB 공간 할당
3) PCB초기화(프로세스 상태, 프로그램 카운터 등 초기화, 자원 요청, 프로세스 스케줄링 정보등을 포함)
4) 해당 큐에 삽입
자식과 동시 실행
자식이 모두 종료할 때까지 대기
🌞 프로세스의 종료
정상 종료(Normal exit)
main의 return, exit()
실패(Error exit : voluntary)
프로세스가 치명적 에러를 발견했을 때 스스로 종료, 파일 검색 실패, 입출력이 명시된 횟수 초과하여 실패할떄
치명적 오류(Fatal error:involuntary)
산술오류, 보호오류, 데이터 오류, 액세스 위반, 메모리 부족
Core dump, segmentation fault
다른 프로세스에 의해 종료(involuntary)
kill, TeminateProcess()
부모 프로세스가 자식 프로세스보다 먼저 종료되면 두가지 옵션
- 연속 옵션 : VMS : 부모가 종료되면 자식도 같이 종료
- 고아를 양부모에게 입양 : UNIX
부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않으면 좀비나 고아가 됨
- 종료 상태 : 자식ID, 종료 코드, 비정상 종료 시 시그널번호
- 부모 프로세스가 자식 프로세스의 종료 상태를 회수한다. : wait 명령어