프로세스 개념
운영체제는 다양한 프로그램을 실행
- 배치 시스템(batch) : 작업(jobs)
- 시간 공유 시스템(Time-sharing) : 사용자 프로그램 또는 작업(tasks)
- 작업(job)과 프로세스(process)라는 용어를 거의 상호 교환적으로 사용
프로세스
- 실행 중인 프로그램
프로세스 종류
- 텍스트(text) : 프로그램 코드
- 데이터(data) : 전역 변수, 정적 변수
- 스택(stack) : 임시 데이터(함수 매개 변수, 반환 주소, 로컬 변수)
- 힙(heap) : 런타임 동안 동적으로 할당된 메모리
- 프로그램 카운터, 프로세서 레지스터 : 현재 활동

프로세스 상태
프로세스가 실행되면 상태가 변경
- 신규(New) : 프로세스를 만드는 중
- 실행(Running) : 명령이 실행되는 중
- 대기(Waiting : blocked, sleep) : 프로세스가 일부 이벤트가 발생하기를 기다리는 중
- 준비(Ready) : 프로세스가 프로세서에 할당되기를 기다리는 중
- 종료(Terminated) : 프로세스 실행이 완료
프로세스 상태의 다이어그램

프로세스 제어 블록
데이터 관리를 위한 메타데이터
- 프로세스용 프로세스 제어 블록, 태스크용 태스크 제어 블록
예) Linux에서 task_struct - 파일에 대한 파일 제어 블록
예) Unix 파일 시스템의 vnode

프로세스 제어 블록
각 프로세스와 관련된 정보
- 프로세스 ID
- 프로세스 상태 : New, ready, running, waiting, terminated
- 프로그램 카운터(Program counter) : 다음 명령의 주소
- CPU 레지스터: 스택 포인터, 범용 레지스터 등
- CPU 스케줄링 정보: 우선 순위 등
- 메모리 관리 정보: 페이지 테이블, 세그먼트 테이블 등
- 회계(Accounting) 정보: 사용된 CPU의 양 등
- I/O 상태 정보: 파일 열기, 할당된 I/O 장치 등

프로세스 스케줄링 대기열
준비 대기열(Ready queue)
- 기본 메모리에 상주하고 실행을 기다리는 모든 프로세스의 집합
장치 대기열(Device queues)
- I/O 장치를 대기하는 프로세스 집합
프로세스가 다양한 대기열 간에 마이그레이션됨
준비 대기열 및 다양한 I/O 장치 대기열

프로세스 스케줄링 표현

스케줄러
CPU 스케줄러
다음에 실행할 프로세스를 선택하고 CPU를 할당
프로세스 분류
- I/O-bound 프로세스
계산 시간보다 입출력 작업에 더 많은 시간을 할애
짧은 CPU 버스트 수 - CPU-bound 프로세스
계산에 더 많은 시간을 소비
몇 번의 매우 긴 CPU 버스트
스케줄링 알고리즘은 이후 강좌에서 다룬다.
컨텍스트 전환
CPU가 다른 프로세스로 전환될 때 시스템은
- 이전 프로세스의 상태를 저장
- 새 프로세스에 대해 저장된 상태를 로드
컨텍스트 전환 시간은 오버헤드
- 전환하는 동안 시스템이 유용하게 작동하지 않는다.
컨텍스트 전환 시간은 하드웨어에 따라 다르다
- 레지스터 세트가 다르다.
프로세스 간 CPU 전환

프로세스 생성
프로세스 생성
- 상위 프로세스는 하위 프로세스를 생성
- 이는 다른 프로세스를 생성
- 마지막으로, 그것은 프로세스의 트리를 형성

하위 프로세스에 리소스 필요
- OS 제공, 또는
- 부모 공유
자원 공유
- 부모와 자식들은 모든 자원을 공유
- 자식이 부모 리소스의 하위 집합을 공유하거나
- 부모와 자식이 리소스를 공유하지 않는다.
실행
- 부모와 자식이 동시에 실행되거나
부모는 자식이 종료될 때까지 기다린다.
주소 공간
- 자식이 부모를 복제
- 자식에게 새 프로그램이 로드
프로세스 생성 요약
- OS 커널 내에 PCB를 생성
- 메모리 공간을 할당
- 이진 프로그램을 로드
- 프로그램을 초기화
UNIX 예제
- fork 시스템 호출은 새로운 프로세스를 만든다.
부모의 PCB를 복제
메모리 공간을 할당 - execve 시스템 호출은 포크 뒤에 사용
디스크에서 이진 프로그램을 로드
초기화
프로세스 종료
프로세스는 마지막 문을 실행하고 운영 체제에 자체 삭제(exit)를 요청
- 하위 프로세스는 상태 값을 상위 프로세스로 반환(wait)
- 하위 프로세스의 리소스는 운영 체제에서 할당 해제
상위 프로세스의 실행을 종료(abort: 비정상적 종료)
- 자식이 할당된 리소스를 초과한 경우
- 하위에 할당된 작업이 더 이상 필요하지 않은 경우
일부 운영 체제에서는 상위 항목이 종료된 경우 하위 항목이 존재할 수 없다. 프로세스가 종료되면 모든 하위 프로세스도 종료되어야 한다.
- 계단식 종단(cascading termination) : 모든 자식, 손자 등이 종료
- 종료는 운영 체제에 의해 시작
상위 프로세스는 wait() 시스템 호출을 사용하여 하위 프로세스의 종료를 대기할 수 있다. 호출이 종료된 프로세스의 상태 정보 및 PID를 반환
- pid = wait(&status);
좀비(zombie) : 대기 중인 상위 프로세스가 없는 경우 (wait()가 호출되지 않음)
고아(orphan) : 부모가 wait를 호출하지 않고 종료된 경우
프로세스 생성 및 종료
C 프로그램은 별도의 프로세스를 포킹(forking)
int main()
{
pid_t pid;
/* fork another process */
pid = fork(); (1)
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid == 0) { /* child process */ (2)
execlp("/bin/ls", "ls", NULL); (3)
}
else { /* parent process */ (4)
/* parent will wait for the child to complete */
wait (NULL); (5)
printf ("Child Complete");
exit(0); (6)
}
}
fork, exec, exit, wait 시스템 콜

협력 프로세스(Cooperating Processes)
독립 과정(Independent)
- 다른 프로세스의 실행에 의해 영향을 받거나 영향을 줄 수 없다.
협력 프로세스(Cooperating)
- 다른 프로세스의 실행에 의해 영향을 받거나 영향을 줄 수 있다.
협력 프로세스 장점
- 정보 공유
예) 공유 파일 등... - 계산 속도 향상
하위 작업을 통한 병렬 실행 - 모듈성
시스템 기능을 별도의 작업으로 나눈다.
소통 모델(Communications models)

생산자-소비자 문제(Producer-Consumer Problem)
생산자 프로세스는 소비자 프로세스에 의해 소비되는 정보를 생산
- 어셈블리 코드 : 컴파일러가 생산, 어셈블러에 의해 소비
- 객체 모듈 : 어셈블러가 생산, 로더(loader)에 의해 소비
unbounded 버퍼
- 버퍼 크기에 실질적인 제한 X
bounded 버퍼
- 고정 버퍼 크기로 가정
공유 메모리 솔루션(Shared memory solution)
- 공유 데이터(Shared data)
#define BUFFER_SIZE 10
typedef struct {
. . .
} item;
item buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
- in: 다음으로 비어있는 위치
- out: 처음으로 차있는 위치
- 버퍼가 비어 있을 때 : in == out
- 버퍼가 꽉 찼을 때 : ((in + 1)%BUFFER_SIZE) == out
생산자 프로세스(Producer process)
item nextProduced;
while (true) {
/* Produce an item in nextProduced */
while (((in + 1) % BUFFER SIZE) == out); /* do nothing -- no free buffers */
buffer[in] = nextProduced;
in = (in + 1) % BUFFER SIZE;
}
소비자 프로세스(Consumer process)
item nextConsumed;
while (true) {
while (in == out); // do nothing -- nothing to consume
nextConsumed = buffer[out];
out = (out + 1) % BUFFER SIZE;
/* consume the item in nextConsumed */
return item;
}
메시지 전달(Message passing)
- 프로세스는 주소 공간을 공유하지 않고 서로 통신
두 가지 기본 작업
- 메세지 송신(send)
- 메세지 수신(receive)
P와 Q가 소통할때 필요한 것
- P, Q 사이에 소통의 링크를 구축
- 송신(send)/수신(receive)를 통한 메시지 교환
통신 링크 구현
- 물리적(예: 하드웨어 버스, 네트워크 등)
- 논리적(예: 직접/간접(direct/indirect), 동기/비동기(synchronous/asynchronous) 등)
직접 통신
프로세스는 서로 명시적으로 이름을 지정
- 송신(P, 메시지) : 프로세스 P에게 메시지를 송신(to P)
- 수신(Q, 메시지) : 프로세스 Q로부터 메시지를 수신(from Q)
프로세스의 식별자가 변경되는 경우
- 이전 식별자에 대한 모든 참조를 찾아 변경해야 한다.
간접 통신
메시지는 사서함과 주고받는다.
- 사서함(Mailbox)
프로세스에서 메시지를 넣고 메시지를 제거할 수 있는 개체
각 사서함은 고유 ID
프로세스는 사서함을 공유하는 경우에만 통신 가능 - 운영
사서함을 새로 만든다.
사서함을 통해 메시지를 주고받는다.
사서함을 없앤다. - 원시 요소 정의:
송신(A, 메시지) : 사서함 A에게 메시지를 송신(to A)
수신(A, 메시지) : 사서함 A로부터 메시지를 수신(from A)
동기화(Synchronization)
메시지 전달(message passing)은 차단(blocking) 또는 비차단(non-blocking)
차단(blocking)은 동기
- 송신 차단 : 메시지가 수신될 때까지 송신자를 차단
- 수신 차단 : 메시지가 사용가능 할 때까지 수신자를 차단
비차단(non-blocking)은 비동기
- 송신 비차단 : 송신자가 메시지를 전송하고 계속
- 수신 비차단 : 수신자가 유효한 메시지 또는 null을 수신
요약
- 프로세스
실행 중인 프로그램
1. 메모리 주소 공간(텍스트/데이터/스택/히프)
2. 레지스터
3. 기타 리소스(열린 파일, 세마포어 등) - PCB(Process Control Block)
각 프로세스와 관련된 정보 저장 - CPU 스케줄러
다음에 실행할 프로세스를 선택하고 CPU를 할당 - 프로세스의 트리
상위 프로세스는 하위 프로세스를 생성하고 하위 프로세스는 다른 프로세스를 생성 - 대부분의 경우 프로세스는 서로 협력해야 한다.
'운영체제' 카테고리의 다른 글
[OS] 동기화 도구 (0) | 2023.04.03 |
---|---|
[OS] CPU 스케줄링 (0) | 2023.03.27 |
[OS] 쓰레드와 프로세스 (0) | 2023.03.20 |
[OS] 서비스, 시스템 콜, 구조, 부팅 과정 (0) | 2023.03.09 |
[OS] 정의, 구조, 작업, 구성 요소 (0) | 2023.03.06 |
프로세스 개념
운영체제는 다양한 프로그램을 실행
- 배치 시스템(batch) : 작업(jobs)
- 시간 공유 시스템(Time-sharing) : 사용자 프로그램 또는 작업(tasks)
- 작업(job)과 프로세스(process)라는 용어를 거의 상호 교환적으로 사용
프로세스
- 실행 중인 프로그램
프로세스 종류
- 텍스트(text) : 프로그램 코드
- 데이터(data) : 전역 변수, 정적 변수
- 스택(stack) : 임시 데이터(함수 매개 변수, 반환 주소, 로컬 변수)
- 힙(heap) : 런타임 동안 동적으로 할당된 메모리
- 프로그램 카운터, 프로세서 레지스터 : 현재 활동

프로세스 상태
프로세스가 실행되면 상태가 변경
- 신규(New) : 프로세스를 만드는 중
- 실행(Running) : 명령이 실행되는 중
- 대기(Waiting : blocked, sleep) : 프로세스가 일부 이벤트가 발생하기를 기다리는 중
- 준비(Ready) : 프로세스가 프로세서에 할당되기를 기다리는 중
- 종료(Terminated) : 프로세스 실행이 완료
프로세스 상태의 다이어그램

프로세스 제어 블록
데이터 관리를 위한 메타데이터
- 프로세스용 프로세스 제어 블록, 태스크용 태스크 제어 블록
예) Linux에서 task_struct - 파일에 대한 파일 제어 블록
예) Unix 파일 시스템의 vnode

프로세스 제어 블록
각 프로세스와 관련된 정보
- 프로세스 ID
- 프로세스 상태 : New, ready, running, waiting, terminated
- 프로그램 카운터(Program counter) : 다음 명령의 주소
- CPU 레지스터: 스택 포인터, 범용 레지스터 등
- CPU 스케줄링 정보: 우선 순위 등
- 메모리 관리 정보: 페이지 테이블, 세그먼트 테이블 등
- 회계(Accounting) 정보: 사용된 CPU의 양 등
- I/O 상태 정보: 파일 열기, 할당된 I/O 장치 등

프로세스 스케줄링 대기열
준비 대기열(Ready queue)
- 기본 메모리에 상주하고 실행을 기다리는 모든 프로세스의 집합
장치 대기열(Device queues)
- I/O 장치를 대기하는 프로세스 집합
프로세스가 다양한 대기열 간에 마이그레이션됨
준비 대기열 및 다양한 I/O 장치 대기열

프로세스 스케줄링 표현

스케줄러
CPU 스케줄러
다음에 실행할 프로세스를 선택하고 CPU를 할당
프로세스 분류
- I/O-bound 프로세스
계산 시간보다 입출력 작업에 더 많은 시간을 할애
짧은 CPU 버스트 수 - CPU-bound 프로세스
계산에 더 많은 시간을 소비
몇 번의 매우 긴 CPU 버스트
스케줄링 알고리즘은 이후 강좌에서 다룬다.
컨텍스트 전환
CPU가 다른 프로세스로 전환될 때 시스템은
- 이전 프로세스의 상태를 저장
- 새 프로세스에 대해 저장된 상태를 로드
컨텍스트 전환 시간은 오버헤드
- 전환하는 동안 시스템이 유용하게 작동하지 않는다.
컨텍스트 전환 시간은 하드웨어에 따라 다르다
- 레지스터 세트가 다르다.
프로세스 간 CPU 전환

프로세스 생성
프로세스 생성
- 상위 프로세스는 하위 프로세스를 생성
- 이는 다른 프로세스를 생성
- 마지막으로, 그것은 프로세스의 트리를 형성

하위 프로세스에 리소스 필요
- OS 제공, 또는
- 부모 공유
자원 공유
- 부모와 자식들은 모든 자원을 공유
- 자식이 부모 리소스의 하위 집합을 공유하거나
- 부모와 자식이 리소스를 공유하지 않는다.
실행
- 부모와 자식이 동시에 실행되거나
부모는 자식이 종료될 때까지 기다린다.
주소 공간
- 자식이 부모를 복제
- 자식에게 새 프로그램이 로드
프로세스 생성 요약
- OS 커널 내에 PCB를 생성
- 메모리 공간을 할당
- 이진 프로그램을 로드
- 프로그램을 초기화
UNIX 예제
- fork 시스템 호출은 새로운 프로세스를 만든다.
부모의 PCB를 복제
메모리 공간을 할당 - execve 시스템 호출은 포크 뒤에 사용
디스크에서 이진 프로그램을 로드
초기화
프로세스 종료
프로세스는 마지막 문을 실행하고 운영 체제에 자체 삭제(exit)를 요청
- 하위 프로세스는 상태 값을 상위 프로세스로 반환(wait)
- 하위 프로세스의 리소스는 운영 체제에서 할당 해제
상위 프로세스의 실행을 종료(abort: 비정상적 종료)
- 자식이 할당된 리소스를 초과한 경우
- 하위에 할당된 작업이 더 이상 필요하지 않은 경우
일부 운영 체제에서는 상위 항목이 종료된 경우 하위 항목이 존재할 수 없다. 프로세스가 종료되면 모든 하위 프로세스도 종료되어야 한다.
- 계단식 종단(cascading termination) : 모든 자식, 손자 등이 종료
- 종료는 운영 체제에 의해 시작
상위 프로세스는 wait() 시스템 호출을 사용하여 하위 프로세스의 종료를 대기할 수 있다. 호출이 종료된 프로세스의 상태 정보 및 PID를 반환
- pid = wait(&status);
좀비(zombie) : 대기 중인 상위 프로세스가 없는 경우 (wait()가 호출되지 않음)
고아(orphan) : 부모가 wait를 호출하지 않고 종료된 경우
프로세스 생성 및 종료
C 프로그램은 별도의 프로세스를 포킹(forking)
int main()
{
pid_t pid;
/* fork another process */
pid = fork(); (1)
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid == 0) { /* child process */ (2)
execlp("/bin/ls", "ls", NULL); (3)
}
else { /* parent process */ (4)
/* parent will wait for the child to complete */
wait (NULL); (5)
printf ("Child Complete");
exit(0); (6)
}
}
fork, exec, exit, wait 시스템 콜

협력 프로세스(Cooperating Processes)
독립 과정(Independent)
- 다른 프로세스의 실행에 의해 영향을 받거나 영향을 줄 수 없다.
협력 프로세스(Cooperating)
- 다른 프로세스의 실행에 의해 영향을 받거나 영향을 줄 수 있다.
협력 프로세스 장점
- 정보 공유
예) 공유 파일 등... - 계산 속도 향상
하위 작업을 통한 병렬 실행 - 모듈성
시스템 기능을 별도의 작업으로 나눈다.
소통 모델(Communications models)

생산자-소비자 문제(Producer-Consumer Problem)
생산자 프로세스는 소비자 프로세스에 의해 소비되는 정보를 생산
- 어셈블리 코드 : 컴파일러가 생산, 어셈블러에 의해 소비
- 객체 모듈 : 어셈블러가 생산, 로더(loader)에 의해 소비
unbounded 버퍼
- 버퍼 크기에 실질적인 제한 X
bounded 버퍼
- 고정 버퍼 크기로 가정
공유 메모리 솔루션(Shared memory solution)
- 공유 데이터(Shared data)
#define BUFFER_SIZE 10
typedef struct {
. . .
} item;
item buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
- in: 다음으로 비어있는 위치
- out: 처음으로 차있는 위치
- 버퍼가 비어 있을 때 : in == out
- 버퍼가 꽉 찼을 때 : ((in + 1)%BUFFER_SIZE) == out
생산자 프로세스(Producer process)
item nextProduced;
while (true) {
/* Produce an item in nextProduced */
while (((in + 1) % BUFFER SIZE) == out); /* do nothing -- no free buffers */
buffer[in] = nextProduced;
in = (in + 1) % BUFFER SIZE;
}
소비자 프로세스(Consumer process)
item nextConsumed;
while (true) {
while (in == out); // do nothing -- nothing to consume
nextConsumed = buffer[out];
out = (out + 1) % BUFFER SIZE;
/* consume the item in nextConsumed */
return item;
}
메시지 전달(Message passing)
- 프로세스는 주소 공간을 공유하지 않고 서로 통신
두 가지 기본 작업
- 메세지 송신(send)
- 메세지 수신(receive)
P와 Q가 소통할때 필요한 것
- P, Q 사이에 소통의 링크를 구축
- 송신(send)/수신(receive)를 통한 메시지 교환
통신 링크 구현
- 물리적(예: 하드웨어 버스, 네트워크 등)
- 논리적(예: 직접/간접(direct/indirect), 동기/비동기(synchronous/asynchronous) 등)
직접 통신
프로세스는 서로 명시적으로 이름을 지정
- 송신(P, 메시지) : 프로세스 P에게 메시지를 송신(to P)
- 수신(Q, 메시지) : 프로세스 Q로부터 메시지를 수신(from Q)
프로세스의 식별자가 변경되는 경우
- 이전 식별자에 대한 모든 참조를 찾아 변경해야 한다.
간접 통신
메시지는 사서함과 주고받는다.
- 사서함(Mailbox)
프로세스에서 메시지를 넣고 메시지를 제거할 수 있는 개체
각 사서함은 고유 ID
프로세스는 사서함을 공유하는 경우에만 통신 가능 - 운영
사서함을 새로 만든다.
사서함을 통해 메시지를 주고받는다.
사서함을 없앤다. - 원시 요소 정의:
송신(A, 메시지) : 사서함 A에게 메시지를 송신(to A)
수신(A, 메시지) : 사서함 A로부터 메시지를 수신(from A)
동기화(Synchronization)
메시지 전달(message passing)은 차단(blocking) 또는 비차단(non-blocking)
차단(blocking)은 동기
- 송신 차단 : 메시지가 수신될 때까지 송신자를 차단
- 수신 차단 : 메시지가 사용가능 할 때까지 수신자를 차단
비차단(non-blocking)은 비동기
- 송신 비차단 : 송신자가 메시지를 전송하고 계속
- 수신 비차단 : 수신자가 유효한 메시지 또는 null을 수신
요약
- 프로세스
실행 중인 프로그램
1. 메모리 주소 공간(텍스트/데이터/스택/히프)
2. 레지스터
3. 기타 리소스(열린 파일, 세마포어 등) - PCB(Process Control Block)
각 프로세스와 관련된 정보 저장 - CPU 스케줄러
다음에 실행할 프로세스를 선택하고 CPU를 할당 - 프로세스의 트리
상위 프로세스는 하위 프로세스를 생성하고 하위 프로세스는 다른 프로세스를 생성 - 대부분의 경우 프로세스는 서로 협력해야 한다.
'운영체제' 카테고리의 다른 글
[OS] 동기화 도구 (0) | 2023.04.03 |
---|---|
[OS] CPU 스케줄링 (0) | 2023.03.27 |
[OS] 쓰레드와 프로세스 (0) | 2023.03.20 |
[OS] 서비스, 시스템 콜, 구조, 부팅 과정 (0) | 2023.03.09 |
[OS] 정의, 구조, 작업, 구성 요소 (0) | 2023.03.06 |