프로세스
프로세스: 실행 중인 프로그램
프로세스의 현재 활동은 프로그램 카운터 값과 프로세서 레지스터의 내용으로 나타낸다.
스택
함수를 호출할 때 임시 데이터 저장장소
힙
프로그램 실행 중에 동적으로 할당되는 메모리
데이터
전역 변수, (bss영역: 초기화 되지 않은 변수)
텍스트 섹션
실행 코드
스택(높은 주소에서 낮은 주소)과 힙(낮은 주소에서 높은 주소)이 서로의 방향으로 커져도 OS는 겹치지 않게 해야한다.
process state
-
new: 프로세스가 생성 중이다.
(승인되면 ready)
-
ready: 프로세스가 처리기에 할당되기를 기다린다.
(스케줄 디스패처에 의해 running)
-
running: 명령어들이 실행되고 있다.
(인터럽트에 의해 ready, i/o 또는 이벤트 기다리면 waiting)
-
waiting: 프로세스가 이벤트가 일어나기를 기다린다.
(i/o 또는 이벤트 완료 ready)
-
terminated: 프로세스 실행 종료
PCB(process control block)
프로세스와 연관된 여러 정보를 수록, 프로세스 상태, 프로그램 카운터 CPU 레지스터들, CPU 스케줄링 정보, 메모리 관리 정보, 회계정보, 입출력 상태
스케줄링 큐
- 준비 큐
- CPU할당을 기다린다.
- 준비 큐 헤더가 첫 PCB를 가리키고 각 PCB는 준비 큐 다음의 PCB를 가리킨다.
- 대기 큐
CPU 스케줄링
context switch
- 문맥은 PCB에 표현된다.
- CPU의 현재 상태를 저장하고 나중에 상태 복구 작업을 수행 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업
프로세스에 대한 연산
- 프로세스 식별자(pid)를 사용하여 프로세스 구분
- 부모는 자식과 병행하게 실행을 계속한다.
- 부모는 일부 또는 모든 자식이 실행을 종료할 때까지 기다린다.
- 자식 프로세스는 부모 프로세스의 복사본이다.
(같은 프로그램과 데이터를 가진다.)
- 자식 프로세스가 자신에게 적재될 새로운 프로그램을 가지고 있다.
리눅스
- 새로운 프로세스는 fork()시스템콜로 생성된다. pid=fork() 이때 pid는 자식 프로세스의 값
- exec()를 호출하면 기존 파일 위에 이진 파일을 메모리에 적재한다.
- 부모는 wait() 시스템 콜을 호출하면 자식 프로세스가 끝나길 기다린다.
- createProcess()는 자식 프로세스를 생성할 때 주소 공간에 명시된 프로그램을 적재한다.
프로세스의 종료
- 마지막 문장 실행 후 exit 시스템 콜을 사용하여 OS에 자신 삭제 요청. Wait 시스템 코를 통해 부모에 상태 값 반환
- 자식이 할당된 자원을 초과할 때, 부모가 자식의 상태를 검사할 수 있는 방편이 있어야 한다.
- 자식에게 할당된 태스크가 더 이상 필요 없을 때
- 부모가 exit 하는데 OS는 부모가 exit한 후 자식이 실행을 계속하는 것을 허용하지 않는 경우(연쇄식 종료 cascading termination)
zombie process
프로세스의 종료 상태가 저장되는 프로세스 테이블의 항목은 부모가 wait()을 호출할 때까지 남는다. 이 때 wait() 전 테이블에 남아있는 자식 프로세스
orphan process
부모 프로세스가 wait()대신 종료했을 때 남은 자식 프로세스. init의 자식 프로세스가 된 후 init이 wait()호출
IPC(inter-process Communication)
정보 공유, 계산 가속화, 모듈성
-
shared memory system: 생산자 프로세스는 정보를 생산, 소비자는 정보를 소비
- unbounded buffer: 버퍼의 크기에 한계가 없다.
- bounded buffer: 비어 있으면 소비자가 대기, 꽉 찼으면 생산자가 대기
-
Message Passing system:
- 직접통신: 통신의 수신자 또는 송신자의 이름을 명시해야 한다. 대칭성
이 기법의 비대칭성 변형은 송신자만 수신자 이름으 지명하며 수신자는 송신자의 이름을 제시할 필요가 없다.
- 간접 통신: 메시지가 mailbox나 port로 전송된다.
-
blocking 보내기: 송신하는 프로세스가 수신 프로세스 또는 메일 박스에 수신될 때까지 봉쇄된다.
-
nonblocking 보내기: 송신하는 프로세스가 메시지를 보내고 작업을 재시작한다.
-
blocking 받기: 메시지가 이용 가능할 때까지 수신 프로세스가 봉쇄된다.
-
nonblocking 받기: 유효한 메시지 또는 null을 받는다.
-
rendezbou: 둘다 봉쇄형일 때 랑데부
-
buffering: 통신 중 메시지는 임시 큐에 들어 있다.
- zero capacity: z의 길이 0. 수신자가 메시지를 받을 때 까지 송신자 대기
- bounded capacity: 유한한 길이, 링크가 꽈차면 송신자 대기
- unbounded capacity: 무한한 길이 송신자는 봉쇄되지 않는다.
pipes
- 단방향 통신 or 양방향 통신
- 반 이중 방식(한순간에 한방향), 전 이중 방식(full duplex)
- 부모, 자식 관계
- 네트워크, 동일한 기계 안
- 일반 파이프: 한 종단에서 쓰고 다른 종단에서 읽는다. 단방향 통신
(양방향은 파이프 두 개 설치)
윈도우에서는 익명 파이프라고 한다. 한 쌍의 프로세스 통신, 통신 종료 후 파이프 제거
- named pipes: 양방향 통신, 부모 자식 관계X, 여러 프로세스가 이용 가능
클라이언트 서버 환경 통신
- 소켓: IP와 포트번호 접합해서 구별. 서버가 소켓에 데이터를 쓴다. 그리고 소켓을 닫고 다른 요청을 기다린다. 클라이언트는 소켓을 생성하고 서버와의 연결을 요청, 연결 후 그 소켓으로부터 읽을 수 있다. 서버로부터 데이터를 받은 뒤 소켓을 닫는다.
RPC(remote procedure calls)
- 네트워크에 연결된 두 시스템 사이의 통신
- 프로시져 호출기법을 추상화. 메시지 기반 통신
- 각 메시지에는 원격지 포트에서 listen 중인 RPC디먼의 주소, 실행될 함수의 식별자. 함수에 전달될 매개변수가 포함되어야 한다. 이 때 포트는 메시지 패키지의 시작 부부에 포함되는 정수이다. 시스템은 네트워크 주소를 하나 가지고 서비스를 구분하기 위해 포트를 여러 개 가질 수 있다.
- RPC는 클라이언트가 원격 호스트의 프로시저 호출하는 것을 마치 자기의 것을 호출하는 것 처럼 해준다.
- RPC 시스템은 클라이언트 쪽에 스텁을 제공하여 통신하는데 필요한 자세한 사항을 숨겨준다.
- 보통원격 프로시저 마다 다른 stub이 존재한다.
stub: 원격 서버의 포트를 찾고 매개변수를 정돈(Marshall) 한다.
parameter marshalling: big-endian 과 little-endian의 차이를 조정한다.
big-endian: 낮은 주소에서 높은 바이트의 데이터 부터 저장
little-endian: 낮은 주소에서 낮은 바이트의 데이터 부터 저장
XDR(external data representation): 데이터를 기종 중립적인 XDR로 바꿔 전송한다. 정확히 한번 처리되어야 한다.(네트워크 오류에도 불구하고)