[운영체제] Processes (공룡책 스터디 정리)CS/운영체제2023. 12. 9. 22:02
Table of Contents
본 포스팅은 인프런 공룡책 강의를 기반으로 한 스터디 개인 정리를 위한 포스팅입니다.
잘못된 부분이 있다면 언제든 지적해주시면 감사하겠습니다!
Process 란?
- 프로그램 : 해당 프로그램이 하드디스크에 존재할 때를 의미
- 프로세스 : 해당 프로그램이 실행되어 메인메모리로 올라오게 되면, 그 프로그램을 프로세스라고 부름.
Process 메모리 구조
- Code 영역
- 실행할 프로그램의 코드가 저장됩니다. CPU는 이 영역에서 명령어를 하나씩 가져와 처리하게 됩니다.
- Data 영역
- 전역변수와 정적변수가 저장됩니다. 이 변수들은 프로그램이 시작될 때 할당되어 프로그램 종료 시 소멸됩니다.
- Stack 영역
- 지연변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역입니다.
- Heap 영역
- 동적 데이터 영역입니다. 메모리 주소 값에 의해서만 참조되고 사용되는 영역입니다. 따라서, 프로그램 동작 시(런타임)에 크기가 결정됩니다.
프로세스 생명주기(라이프사이클)
- New : 프로세스 탄생(생성된) 시점. 실행하는 것은 불가능
- Running : CPU가 실제로 프로세스를 수행하고 있는 상태
- Wating : 프로세스 도중에 I/O작업이 필요하여 해당 작업을 수행하는 상태. 이 때 CPU는 I/O를 기다리며, 다른 프로세스를 수행한다. 해당 상태가 끝나면 프로세스는 다시 Ready → Running 상태가 됨.
- Ready : 변수 초기화 등 기초 준비작업을 모두 끝나고 실행을 할 수 있는 상태.
- Terminated : 최종적으로 프로세스가 종료된 상태. 사용하던 메모리 영역 또한 해제됨.
PCB(Process Control Block)
- TCB(Task Control Block)이라고 부르기도 함.
- 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영체제 커널의 자료구조.
- 운영체제가 프로세스 스케쥴링을 위해 프로세스에 관한 모든 정보를 가지고 있는 데이터베이스를 PCB라고함.
- 각 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 제거됨.
- 해당 PCB를 통해 Wating 및 Ready상태를 반복하면서도 중간까지의 처리하던 작업을 도중부터 실행할 수 있음.
- 들어있는 정보는 아래와 같음.
- Process ID : 프로세스 식별자
- Process State : 위 Process State Diagram의 5가지 상태 중 한 개.
- Program counter : 이 프로세스가 다음에 실행할 명령어의 주소를 가리키는 계수기
- CPU registers : IR, DR 등등 Cpu 안에 있는 레지스터 정보들
- CPU-Scheduling Information : 우선 순위, 최종 실행시각, CPU 점유시간 등
- Memory-Management Information : 해당 프로세스의 주소공간 등
- Accounting Information : 페이지 테이블, 스케쥴링 큐 포인터, 소유자, 부모 등
- I/O State Information : 프로세스에 할당된 입출력 장치 목록, 열린 파일 목록 등
멀티 프로세싱
멀티 프로세싱(Multi-processing)
- 다수의 프로세서(CPU)가 협력적으로 일을 처리하는 것을 의미.
- 장점으로는 하나의 프로세서(CPU)가 고장이 나더라도 해당 프로세서가 진행 중인 작업(Process)은 다른 프로세서에서 수행하고 있기 때문에 작업이 정지되지 않는다.
멀티 프로그래밍(Multi-programming)
- 하나의 프로세서(CPU)가 하나의 프로세스를 수행하는 동안 다른 프로세스에 접근할 수 있도록 하는 방법.
멀티 태스킹(Multi-tasking)
- 다수의 작업(Task)을 운영체제의 스케쥴링에 의해 번갈아 가며 수행되도록 해주는 것을 의미.
- 스케쥴링 방식으로는 멀티 프로그래밍 방식, 시분할 방식, 실시간 시스템 방식을 사용하여 수행된다.
멀티 스레딩(Multi-threading)
- 하나의 프로세스를 다수의 스레드로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것을 의미.
- 하나의 프로세스가 동시에 여러 개의 스레드를 수행할 수 있도록 해주는 것이다.
- 프로세스를 생성하는 비용보다 스레드를 생성하는 비용이 더 저렴하기 때문에 프로세스에 다수의 스레드를 생성하여 병렬처리하는 것이다.
Process Scheduling
Scheduling Queues:
- Linked List로 구현.
- Ready Queue, Wating Queue 두 개의 큐를 사용.
Context Switch
- 멀티 프로세스 환경에서 CPU가 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 발생.
- 기존의 프로세스 상태 또는 레지스터 값(Context)을 저장하고 CPU가 새로운 프로세스의 Context로 교체하는 작업을 의미.
- Context : CPU가 해당 프로세스를 실행하기 위한 해당 프로세스의 정보들(PCB)
Operations on Processes
Create Process
- 프로세스를 만드는 주체를 Parent Process
- 만들어진 프로세스를 Child Process
- 자식 프로세스를 만드는 작업은 fork(), exec()
fork() vs exec()
- 새로운 프로세스를 위한 메모리를 할당한다.
- 부모의 내용을 그대로 복사하여 새로운 프로세스를 생성한다. | | exec() | - 한 프로세스가 다른 프로세스를 실행시키기 위해 사용된다.
- 새로운 프로세스를 위한 메모리를 할당하지 않고 현재 메모리에 사용된다.
- 부모의 내용을 복사하지 않고 exec()를 호출한 프로세스에 덮어씌어진다. |
- Wait() 함수
- 부모 프로세스가 자식 프로세스의 종료 상태를 얻기 위해 사용.
- wait()함수를 사용하여 자식 프로세스가 종료될 때까지 기다림. ⇒ 자식 프로세스가 완료되면 그제서야 부모 프로세스의 작업을 계속 진행!
- 운영체제가 실행되고 나면 프로세스를 만들 첫번째 프로세스가 필요함.
- init() 함수를 통해 데몬 프로세스 생성 pid는 항상 1
- 생성되는 프로세스 간의 관계는 하나의 큰 트리 구조로 형성됨.
- 프로세스를 생성한 후 부모 프로세스는 2가지 행동을 할 수 있음.
- 자식 프로세스가 끝날 때까지 기다림.(Waiting Queue)
- 자식 프로세스와 함께 동작.(멀티 프로세싱 환경)
- 자식 프로세스는 다음 중 하나의 프로세스가 됨.
- 부모 프로세스와 동일한 새로운 프로세스
- fork()
- 부모 프로세스와 같은 로직을 수행하는 경우
- 새로운 프로그램 실행
- exec()
- 새로운 프로그램을 메모리에 load하고 이를 실행하게 됨.
- 부모 프로세스와 동일한 새로운 프로세스
- 예제코드 및 사진자료
int main()
{
pid_t pid;
//fork a child process
pid = fork();
if(pid < 0) { // error occurred
fprintf(stderr, "Fork Failed");
return 1;
}
else if (pid == 0) { //child process
execlp("/bin/ls", "ls", NULL); //Context Switch
}
else { //parent process
wait(NULL);
printf("Child Complete");
}
return 0;
}
프로세스가 종료되는 시점
- 마지막 return문이 실행되는 시점.
- System.exit()를 이용한 강제종료.
Zombie vs Orphan Process
- 두 가지의 Case는 주로 데몬 프로세스, 백그라운드 프로세스들을 만들 때 활용.
Zombie Process(좀비 프로세스)
- 부모가 fork()를 통해 자식 프로세스를 생성
- wait() 없이 return 0를 통해 부모가 종료되면
- 해당 자식 프로세스는 좀비 프로세스가 됨.
- wait() 없이 return 0를 통해 부모가 종료되면
- 즉, 부모 프로세스가 자식 프로세스보다 먼저 종료될 때.
- 혹은 자식 프로세스가 종료되었지만 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않았을 경우에도 좀비 프로세스라 칭함.
Orphan Process(고아 프로세스)
- 부모 프로세스가 wait을 호출하지 않고 부모는 부모 프로세스의 일을 하고 있을 때.
- 부모 프로세스가 먼저 종료되면 init 프로세스(pid=1)가 자식 프로세스의 부모가 됨.
- 부모 프로세스가 wait()을 호출하는 대신에 그냥 종료를 해버리는 것.
Chapter3. Processes (Part 3)
Interprocess Communication
Independent(독립적인) vs Cooperating(상호협조적인)
- 프로세스들은 독립적일 수도 있고 상호협조적일 수도 있음.
- Cooperating(상호협조적)한 프로세스들은 공유 data를 포함해 프로세스들끼리 영향을 미침.
- 정보공유, 속도향상, 모듈화의 목적을 가지고 있음.
- 상호협조적인 프로세스들 간에 생길 수 있는 문제를 해결할 수 있는 방법이 IPC(Inter-Process Communication)
IPC(Inter-Process Communication)
- IPC에는 2가지 모델이 존재
- Shared Memory
- Message Passing
- Shared Memory 모델
- 이는 공유 메모리이며 독립적인 프로세스들 간의 통신을 위해 공유되는 메모리 영역을 사용합니다.
- 장점으로는 시스템 호출을 생성할 때(공유 메모리 생성)에 1번만 사용하기 때문에 매우 빠르며 효율이 좋습니다.
- 단점으로는 모든 프로세스들이 접근 가능하기 때문에 Race Condition의 문제가 발생할 수 있으므로 동기화 과정이 필요합니다. 이는 세마포어를 이용하여 해결할 수 있습니다.
- Message Passing 모델
- 같이 쓴다의 개념이아닌 그때 그때 필요한 소스를 프로세스들 간에 파이프 등을 사용하여 전달하는 기법입니다.
- 커널(OS)이 메모리 보호를 위해 대리로 전달해주기 때문에 안전하고 OS가 알아서 동기화처리까지 해주기 때문에 동기화 문제가 없음.
- 동기화를 고려할 필요가 없다는게 장점이지만, pipe생성 및 data복사로 인해 오버헤드가 발생하여 효율이 낮아지는 단점이 존재합니다.
- 위와 관련하여 포스팅 첨부
- 프로세스 간 통신을 어떻게 하는지에 대한 방식에 대해 알아볼 수 있었음.
- Shared Memory
- 약속한 공유 공간에 메모리 write&read를 하는 producer&consumer problem 해결
- Message Passing
- 세부적인 것에 대해서는 내부 os가 처리
- 개발자는 send 및 receive를 통해 처리
- mailbox(port)를 통해 direct하게 보내는 방법
- mailbox(port)를 통해 indirect하게 보내는 방법
- SYNCHRONOUS하게 blocking I/O를 하는 방법
- ASYNCHRONOUS하게 Non-blocking I/O를 하는 방법
Naming
- Direct Communication(직접 통신) : 프로세스간 서로의 이름을 명확히(explicitly) 알고, 직접 통신한다.
- send(P, Message) : 프로세스 P에게 메시지를 전송
- receive(Q, Message) : 프로세스 Q로부터 메시지 수신
- Indirect Communication(간접 통신) : 메시지가 mailBox를 통해 송수신 된다.
- 모든 mailBox 는 고유한 id를 가진다.
- mailBox를 공유해야지만 프로세스간에 통신할 수 있다.
- send(A, Message) : mailBox A에게 메시지를 전송
- receive(A, Message) : mailBox A로부터 메시지 수신
Synchronization
- Blocking : synchronous 하다고 생각 할 수 있다.
- Blocking send : 메시지를 송신한 프로세스는 수신 측 프로세스가 메시지를 받을 때까지 기다린다.
- Blocking receive : 수신 측 프로세스는 메시지를 받을 때까지 기다린다.
- Non-Blocking : asynchronous 하다고 생각 할 수 있다.
- Non-Blocking send : 메시지를 송신한 프로세스는 다시 자기 할 일(operation)을 한다.
- Non-Blocking receive : 수신 측 프로세스는 valid(유효한) 메시지나 NULL 메시지를 받는다.
Question 정리
- 프로세스가 Running상태 즉 실행중에 I/O 작업이 들어오면 이 때 프로세스가 Terminated 되기 전까지의 동작과정을 설명해주세요.
- 멀티 태스킹과 멀티 프로그래밍의 차이
- ⇒ 멀티 태스킹은 다수의 작업을 운영체제의 스케쥴링에 의해 번갈아가며 수행되도록 해주는 것으로써 이러한 스케쥴링의 방식으로 멀티 프로그래밍을 사용한다.
- 멀티 프로세싱과 멀티 프로그래밍의 차이
- ⇒ 프로세서와 프로세스의 차이를 알아야 하며, 멀티 프로세싱의 경우 다수의 프로세서(CPU)를 사용하지만 멀티 프로그래밍은 한 개의 프로세서(CPU)가 작업을 총괄한다.
- 좀비 프로세스와 고아 프로세스에 대해 설명해주세요.
Refference
'CS > 운영체제' 카테고리의 다른 글
[운영체제] Synchronization Tools(공룡책 스터디 정리) (1) | 2024.01.16 |
---|---|
[운영체제] Cpu Scheduling(공룡책 스터디 정리) (0) | 2023.12.13 |
[운영체제] Thread & Concurrency(공룡책 스터디 정리) (0) | 2023.12.13 |
@Beemo9 :: BeHinD
개발 기술 블로그, Dev
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!