일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 개발자
- 미라클모닝
- 개발자일기
- 국비지원코딩
- 프로그래머
- Codeup
- 프로세스
- React
- 백엔드개발자
- 프로그래머스
- db
- 스프링부트
- Java
- 코드업
- 프로그래밍
- 코딩
- 운영체제
- 자바개발자
- 백엔드
- 데이터베이스
- 자바알고리즘
- 국비지원
- SpringBoot
- 알고리즘
- 자바
- 소셜로그인구현
- 자바의정석
- 자바스크립트
- 혼공컴운
- 리액트
- Today
- Total
초코딩(chocoding)
[혼공컴운] 10-2 / 프로세스 상태와 계층 구조 본문
프로세스 상태
=> 컴퓨터를 사용할 때 여러 프로세스드이 빠르게 번갈아 가면서 실행된다. 이때 하나의 프로세스는 여러 상태를 거치며 실행되는데 대표적인 상태는 아래와 같다.
생성 상태 (new) - 메모리에 적재되어 PCB를 할당받은 상태
준비 상태 (ready) - 바로 실행 가능하지만, 자신의 차례가 아니기 때문에 기다리고 있는 상태
실행 상태 (running) - CPU를 할당받아 실행 중인 상태
대기 상태 (blocked) - 입출력 장치의 작업을 기다리는 상태
종료 상태 (terminated) - 프로세스가 종료된 상태
프로세스 계층 구조
=> 새 프로세스가 생성한 프로세스를 부모 프로세스, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고 한다.
많은 운영체제는 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리한다.
부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이기 때문에 다른 PID를 가진다.
이때 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID가 기록되기도 한다.
최초의 프로세스 PID는 항상 1번이며, 모든 프로세스 최상단에 있는 부모 프로세스이다.
pstree 명령어를 사용하면 프로세스 계층 구조를 볼 수 있다.
<최초의 프로세스>
유닉스 운영체제 : init
리눅스 운영체제 : systemd
macOS : launchd
프로세스 생성 기법
=> 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성해내고, 만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.
fork
=> 자기 자신 프로세스의 복사본을 만드느 시스템 호출
=> 자식 프로세스에게 메모리 내의 내용, 열린 파일의 목록 등을 상속한다. 하지만 복사된 자식 프로세스라 해도 PID의 값이나 저장된 메모리의 위치는 다르다.
위에 "복사된 자식 프로세스라 해도 PID의 값이나 저장된 메모리의 위치는 다르다." 라는 말이 와닿지 않아 내 친구 GPT에게 물어봤다.
#include <stdio.h>
#include <unistd.h>
int main() {
int x = 10;
pid_t pid = fork();
if (pid == 0) {
// 자식 프로세스일 때
printf("자식 프로세스 - x의 주소: %p, x의 값: %d\n", &x, x);
x = 20; // 자식 프로세스에서 x의 값을 변경
printf("자식 프로세스 - x의 주소: %p, 변경된 x의 값: %d\n", &x, x);
} else if (pid > 0) {
// 부모 프로세스일 때
printf("부모 프로세스 - x의 주소: %p, x의 값: %d\n", &x, x);
x = 30; // 부모 프로세스에서 x의 값을 변경
printf("부모 프로세스 - x의 주소: %p, 변경된 x의 값: %d\n", &x, x);
} else {
// fork 실패 시
printf("fork 실패\n");
return 1;
}
return 0;
}
부모 프로세스와 자식 프로세스가 동일한 코드와 데이터를 가지지만, 실제 메모리 주소는 다르게 할당된다는 것을 알게 되었다. 하지만 위 코드에서 fork() 반환값을 잘 알지 못해서 왜 if문을 저렇게 나눈건지 궁금했다.
역시 내 친구는 친절하고 똑똑하다.
이해가 단숨에 완료~되었다.
exec
=> 자신의 메모리 공간을 새로운 프로그램을 덮어쓰는 시스템 호출
따라서..!
부모가 자식 프로세스를 실행하며 프로세스 계층 구조를 이루는 과정은 fork과 exec가 반복되는 과정이라고 할 수 있다.
하지만 부모 프로세스가 자식 프로세스를 fork한 뒤에 부모 프로세스, 자식 프로세스 누구도 exec를 호출하지 않는 경우도 존재한다. 이 경우는 부모 프로세스와 자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 된다.
'[혼공컴운] 혼자 공부하는 컴퓨터 구조와 운영체제' 카테고리의 다른 글
CPU의 스케줄링이란? / 선점형 스케줄링과 비선점형 스케줄링 (0) | 2024.04.04 |
---|---|
프로세스와 스레드에 대하여 (0) | 2024.03.28 |
[혼공컴운] 10-1 / 프로세스 개요 (0) | 2023.07.31 |
[혼공컴운] 9-2 / 운영체제의 큰 그림 (0) | 2023.07.28 |
[혼공컴운] 9-1 / 운영체제 시작하기 (0) | 2023.07.27 |