1. 프로세스
- 실행중인 프로그램
- 디스크의 실행 파일이 메모리에 적재된 상태
- GUI에서 프로그램을 클릭하여 프로세스로 만듬
메모리 상의 프로세스
- 특정 위치를 할당 받고, 내부적으로는 자신의 메모리를 동적으로 조정한다
- 텍스트 세션 - 실제 실행 코드
- 데이터 세션 - 실행부터 종료까지 지워지지 않는 데이터(임시 데이터)들을 저장
- 힙 세션 - 프로그램 실행 시 동적으로 할당되는 메모리
- 스택 세션 - 잠깐 생겼다 사라질 데이터들을 저장
- 각각의 세션은 항상 같은 주소값을 갖지는 않는다
사용자가 힙 영역의 메모리 크기를 조정하며 메모리 문제를 해결할 수 있다
프로세스 상태
프로세스 제어 블록 PCB
- 각 프로세스는 운영체제에서 PCB에 의해 표현된다
- 블록은 프로세스가 생성되면 생성되고 소멸하면 소멸한다
- process state - 프로세스 상태를 표현
- process number - 프로세스의 번호
- process counter - 다음에 실행할 주소
- register - 인터럽트 발생 시 작업하던 정보를 저장 등등
2. 프로세스 스케쥴링
- 목적: 프로세스 이용률을 최대화하기 위해, cpu 대기시간 최소화
- 프로세스 스케쥴러는 실행가능한 프로세스 중에서 하나의 프로세스를 선택해 실행한다
스케쥴링 큐
-
프로세스가 시스템에 들어온다 -> Job Queue에 등록
-
준비 완료 상태에서 실행을 대기한다 -> Ready Queue에 등록
Ready Queue의 헤더는 다음 PCB를 가리키고 tail은 마지막 PCB를 가리킨다
-
입출력 장치의 입출력을 대기한다 -> Device Queued에 등록
프로세스가 순차적으로 큐에 등록되는 도표
스케쥴러 구분
- 상황에 따라서 다양한 스케쥴러가 사용된다(내부적으로 함)
- 단기 스케쥴러
- 중기 스케쥴러
- 일부 운영체제가 도입한 스케쥴러
- 메모리에서 프로세스를 제거
- 메모리 상의 프로세스 수를 완화
- 스와핑
중단하다 다시 진행
- 장기 스케쥴러
- 잡 스케쥴러
- 실행 빈도 낮음 분단위
- 메모리 상의 프로세스 수 제어. 프로세스가 끝나면 그 빈 자리를 메워줌
- 입출력 중심과 CPU 중심 스케쥴러를 적절히 혼합하는 것이 중요
너무 입출력만 기다리면 안되고 너무 입력을 무시해도 안됨
3. 컨텍스트 스위치
- 인터럽트가 발생해서 실행중이던 프로세스를 중단하고 인터럽트를 발생시킨 작업이 끝날 때까지 기다린 후 다시 실행됨
- 이 경우 하던 작업을 다시 실행하려면 어떤 정보가 필요할까
실행중이던 프로세스의 문맥을 저장해야하고
PCB에 저장해야하고
컨텍스트 스위치라고 부른다
4. 프로세스의 생성과 종료
- 프로세스가 실행되는 과정에서도 여러 프로세스가 새로 생성됨
- 생성하는 프로세스를 부모 프로세스, 생성되는 프로세스를 자식 프로세스
- 대부분 고유의 프로세스 식별자(pid)로 프로세스를 구분
fork()와 exit()
- fork() 시스템 콜로 새로운 프로세스 생성 (복제)
- 두 프로세스 중 한 프로세스가 exec() 시스템 콜을 사용
자신의 메모리 공간을 새로운 프로그램으로 교체
- exex() 시스템 콜은 바이너리 파일을 메모리로 적재(?)
프로그램 실행 시작
- 자식 프로세스가 종료될 때까지 부모는 wait()
- 자식 프로세스에게 보이는 pid는 0, 부모에게 보이는 pid는 1이상
- 자식 프로세스는 리소스 권한, 스케쥴링 속성을 부모로부터 상속
- 부모는 wait() 시스템 콜로 자식이 종료되기를 대기
- 부모는 자식이 종료되면 wait()을 벗어나 프로세스를 재개하고 exit()으로 종료
- 최종적으로 실행이 종료되면 exit()을 통해 운영체제에게 삭제를 요청한다
- 부모 프로세스가 대기중이라면 상태 값을 리턴
- 운영체제에 의해 모든 프로세스의 자원들은 할당 해제된다
- 부모가 자식을 종료시킬 경우 - abort()
- 자식이 자원을 초과할 경우
- 자식이 더이상 필요하지 않을 경우
- 부모는 종료되었는데 자식이 종료되지 않았을 때
- (?)좀비 프로세스 : 종료되었지만 부모가 아직 wait() 콜을 하지 않은 프로세스
- 고아 프로세스 : 부모가 wait()을 콜하는 대신 종료하게 되면 자식은 고아가 됨
5. 프로세스 간의 통신
- 프로세스는 다른 프로세스와 협력하는 관계인 경우가 많음
- 협력 프로세스는 데이터를 공유라고 프로세스에 영향을 주고 받음
- 목적 - 정보 공유, 계산 가속화, 모듈성, 편의성
- 원칙적으로 OS는 프로세스간의 메모리 공유를 금지하고 있다
- 두 가지 모델이 있다
공유메모리 모델
- 프로세스들이 공유 메모리 영역을 구축해야함 (OS 제공x)
- 생산자와 소비자의 관계
소비자가 소모하는 속도가 생산자가 생성하는 속도가 같지 않음
중간에 버퍼를 두어 공유메모리로 사용한다
버퍼가 반드시 사용 가능해야함
- 버퍼 종류
- 무한 버퍼: 버퍼 크기 무제한
- 유한 버퍼: 버퍼 크기 고정
비면 소비자 대기
꽉차면 생산자 대기
메시지 전달 모델
6. 클라이언트 서버 환경 통신
소켓 통신
- 소켓 : 서버 간의 통신을 위한 end point
네트워크를 통해 통신하는 프로세스들은 프로세스당 한 쌍의 소켓이 있다
IP주소와 Port 번호를 조합해서 각 소켓을 식별한다
- 클라이언트 - 서버 아키텍처
서버는 특정 포트를 열고 그 포트로 들어오는 클라이언트의 요청을 대기한다(listen 상태)
요청을 받으면 서버는 클라이언트 소켓으로부터의 연결 요청을 수락하며 연결됨
원격 프로시저 호출
- IDL은 뼈대 코드를 생성한다
- 클라이언트와 서버에 RPC가 생성된다
- 클라이언트 루틴에서 Stub을 거쳐 서버 Stub으로 요청을 보낸다
- 서버는 Stub에서 응답을 생성하여 클라이언트로 보낸다
(서버 Stub 내부적으로만 진행하여 서버 루틴은 응답을 보낸 것을 모른다)