프로세스
- 실행중인 프로그램
- 자신의 주소공간 보유
- 코드 영역
- 프로세서가 실행하는 프로그램 코드 저장
- 데이터 영역
- 전역 변수 저장
- 힙 영역
- 스택 영역
- 임시 데이터(함수 매개변수, 반환주소, 지역변수)
프로세스 생명주기
- 프로세스는 이산적인 상태간 전이
- running (실행) 상태
- 프로세서에서 명령어 실행 중
- ready (준비) 상태
- 프로세서의 할당 대기중
- waiting (blocked) (대기) 상태
- 특정 event (I/O완료, signal 수신 등) 대기
- new (생성) 상태
- 프로세스 생성 중
- terminated (종료) 상태
- 실행 종료
프로세스 상태
- 디스패치
- ready list에 있는 첫 번째 프로세스에 프로세서를 사용하게 할당하는 것
- 운영체제는 일정 시간을 프로세서에 사용하도록 허용
- 시간간격 타이머의 인터럽트를 이용하여 스케줄러를 실행
- 시분할 처리
프로세스 제어 블록
프로세스 제어 블록(Process Control Block, PCB)
- OS가 프로세스 관리를 위해 데이터를 보관하는 자료구조
- 프로세스 식별 번호
- 프로세스 상태
- 프로그램 카운터
- CPU 레지스터
- CPU 스케쥴링 정보
- 부모 프로세스 포인터
- 자식 프로세스 포인터
- 메모리 영역 정보
- I/O 상태 정보
- 사용통계 정보
프로세스 테이블
- 프로세스 제어블록의 포인터를 관리하는 테이블
- OS가 시스템 또는 사용자 별로 관리
- 신속한 PCB 접근 지원
- 프로세스 종료시
- 프로세스 테이블에서 해당 프로세스를 제거하고, 할당된 자원 반납
프로세스 스케줄링
프로세서 스케줄러
프로세스 관리
프로세스 관련 서비스
- 프로세스 생성
- 프로세스 종료
- 프로세스 일시중지
- 프로세스 재시작
- 프로세스 우선순위 변경
- 프로세스 대기
- 프로세스 깨우기
- 프로세스 디스패치
- 프로세스간 통신
프로세스 선점(preemption)
- 실행중인 프로세스가 CPU 사용권한을 상실하게 되는 것
- 실행중인 사용자 프로세스가 커널에 제어권을 양보하는 상황
- 인터럽트, 트랩, 예외상황 발생시
- 디바이스 인터럽트
- 디스크 입출력, 네트워크 패킷 도착
- 시스템콜, 페이지폴트
- 불법명령어
- 인터럽트 상황 처리 후 우선순위 고려한 스케줄링
- 주기적 타이머 인터럽트
- 프로세스에 할당된 시간이 경과하면 스케줄러가 호출되어 다른 프로세스에 CPU 할당
프로세스 생성
프로세스 생성 방법
- 처음부터 새로 생성 (from scratch)
- 프로그램 코드와 데이터를 메모리에 적재
- 새로운 PCB 생성 및 초기화
- 프로세스를 ready queue에 추가
- 복제 생성 (cloning)
- 현재 프로세스를 중지하고 상태 저장
- PCB 복사하여 새로운 PCB 생성
- 새로운 PCB를 ready queue에 추가
- 기본 프로세스를 부모(parent), 새로운 프로세스는 자식(child) 관계 설정
ex) fork() 함수 사용
프로세스 트리
- 부모 프로세스
- 새로운 프로세스를 생성한 프로세스
- 자식 프로세스
- 생성된 프로세스
- 트리 형태의 구조 형성
- 부모 프로세스 종료시 자식 프로세스 처리
- 모든 자식 프로세스 종료, 또는
- 부모 프로세스에 무관하게 자식 프로세스 진행
부모 및 자식 프로세스 간의 관계
- 자원 공유 형태
- 서로 모든 자원 공유
- 자식 프로세스가 부모 자원의 일부만 공유
- 서로 별개 자원 사용
- 실행 형태
- 부모와 자식 프로세스가 병행 실행
- 부모 프로세스가 자식 프로세스가 종료할 때까지 대기
복제에 의한 프로세스 생성
- 부모 프로세스의 주소공간의 내용 복사
- 필요시 복사된 주소공간에 자식 프로세스의 프로그램 복사
- UNIX 계열 시스템콜
- fork(): 새로운 프로세스 복제 생성 (cloning)
- exec(): 복제된 영역에 새로운 프로그램 복사
UNIX/LINUX 프로세스 생성
- int fork()
- fork()를 호출한 프로세스의 복사본 생성
- 새로운 PCB 생성
- PCB가 복사본의 주소공간을 가리키도록 초기화
- 부모 프로세스의 자원을 가리키도록 설정 (현재 열린 파일 등)
- 부모 프로세스에는 생성된 자식 프로세스의 PID 반환
- 생성된 자식 프로세스에는 0 반환
UNIX/LINUX 프로세스 변환
- int exec (char prog, char argv[])
- 현재 프로세스 정지
- prog에 해당하는 프로그램을 현재 프로세스의 주소 공간에 적재
- 하드웨어 문맥 초기화
- 새로운 프로그램에 대한 명령행 파라미터 argv의 초기화
프로세스 종료
-
프로세스는 마지막 문장을 실행한 다음, OS에 프로세스 삭제 요청 (exit)
- wait()를 통해 자식 프로세스에서 부모 프로세스로 데이터 전달
- 프로세스의 자원은 OS에 의해 반납
-
비정상적인 종료를 하게 하는 경우도 있음
- abort() 사용
- 시그널 SIGABRT를 발생시키고, 시그널 처리기가 있으면 호출하고, 없으면 비정상적인 종료 (일부 자원 반납 처리 부재)
-
부모 프로세스는 kill()를 통해 자식 프로세스 종료 가능
- 자식 프로세스가 배정된 자원보다 초과 사용하는 경우
- 자식 프로세스에 할당된 작업이 필요 없어진 경우
-
부모 프로세스가 종료되는 경우
- 어떤 OS는 자식 프로세스 강제 종료
- 모든 자식 프로세스들의 연쇄 종료
프로세스 일시중지와 재시작
프로세스 일시중지(suspend)
-
종료시키지 않고 프로세서 사용을 위한 경쟁에서는 잠시 배제
- 보안위험 감지, 소프트웨어 디버깅에 유용
-
프로세서 자신이나 다른 프로세스가 일시중지 가능
-
일시정지 상태인 프로세스는 다른 프로세스에 의해 재시작 가능
-
일시중지 상태
프로세스 문맥교환
문맥교환 (context switching)
- OS의 실행중인 프로세스를 중지시키고, 준비 상태의 프로세스를 시작시키는 과정
- 실행중인 실행 문맥을 자신의 PCB에 저장
- 준비 상태의 프로세스의 PCB 내용을 레지스터 등에 적재
- 문맥교환 시간의 최소화 필요
- 어떤 컴퓨터 구조는 하드웨어적으로 수행
프로세스간 통신
프로세스간 통신(interprocess communication, IPC)
- 프로세스간에 데이터를 주고 받을 수 있도록 하는 것
- 하나의 컴퓨터 내의 프로세스 간의 통신
- 네트워크를 통한 다른 컴퓨터 상의 프로세스 간의 통신
- 프로세스 간의 통신을 위해 서로 필요한 설정 필요
- signal
- pipe
- message passing
- shared memory
- socket
- Remote procedure call (RPC)
시그널
시그널(signal, 신호)
- 사건 발생시 프로세스에 알려주는 소프트웨어 인터럽트
- ex) CTRL-C: 실행중인 프로세스에 프로세스 종료 INT 시그널 전송
kill(my_pid, SIGINT); // 프로세스 종료
alarm(30); // 30초 후 알람 발생. 프로세스 종료
- 시그널 발생 자체만 전송, 데이터의 전송은 불가
- 프로세스는 시그널의 수신(catch), 무시(ignore), 마스킹(mask) 가능
- 시그널 수신 지정
- 신호를 전달할 때, OS가 호출할 루틴 지정
signal(SIGINT,catch_int);
- 시그널 무시
- 시그널 마스크
- 설정이 되어 있으면, 해당 종류의 시그널은 OS가 함
sigaddset(&mask_set,SIGINT);
//시그널 집합 변수 mask_set에 시그널 번호 SIGINT을 추가
메시지 전달
메시지 전달(message passing) 기반 프로세스간 통신
- 메시지 전송방향
- 한번에 한 방향으로 메시지 전달
- 전송 방식
- 대기(blocking) 전송
- 송신자가 수신자에게 메시지 수신 확인 요구
파이프
파이프(pipe)
- 두 프로세스가 데이터를 교환할 수 있게 하는 버퍼 역할을 하는 OS가 관리하는 메모리 영역
$ cat foo | grep bar
- cat의 stdout을 grep의 stdio에 연결
- 두 개의 끝을 갖는 채널(통로)
- 커널의 메모리 공간을 구현
- 시스템콜 pipe()
- 파이프 생성
- 2개 파일 디스크립터 생성
- fd[0]: 파이프의 읽기용
- fd[1]: 파이프의 쓰기용
소켓
소켓
- 분산 시스템에서 프로세스간 통신 지원
- IP 주소와 포트 번호로 식별되는 통신 단말(endpoint) 제공
- 클라이언트-서버 구조 사용
메시지 전달
RPC (Remote Procedure Call, 원격 프로시저 호출)
-
다른 컴퓨터에 있는 함수나 프로시저를 원격 사용을 위한 세세한 코딩없이 프로그램에서 실행할 수 있게 기술
-
Remote invocation (원격호출), remote method invocation(RMI, 원격 메소드 호출)이라고도 함
-
Java RMI
- Java 프로그램이 원격 객체의 method를 호출하게 하는 기술