[운영체제/OS] 2-2. 프로세스(Processses)
1. 운영체제의 실행
💡 중요 개념: 운영체제도 하나의 프로그램으로서 프로세서에 의해 실행된다는 점은 OS의 기본 개념을 이해하는데 매우 중요합니다.
1.1 운영체제 실행의 특징
- OS는 일반 소프트웨어처럼 프로세서가 실행하는 프로그램
- OS는 자주 제어권을 포기하고 프로세서가 OS로 제어를 반환하는 것에 의존
1.2 실행 설계 접근법
- 사용자 프로세스 내 실행
- OS 코드가 사용자 프로세스 문맥 내에서 실행
- 커널이 사용자 프로세스의 일부처럼 보임
- 모드 전환만 발생, 프로세스 전환은 필요할 때만 수행
- 프로세스 기반 운영체제
- 주요 커널 기능을 별도의 시스템 프로세스로 구현
- 깔끔한 설계 가능
- 다중 프로세서/컴퓨터 환경에 유용
2. 프로세스 생성
💡 프로세스 생성 과정과 시스템 콜(fork, exec)의 동작 방식은 OS 면접에서 매우 중요한 주제입니다.
2.1 OS 관점의 프로세스 생성
- 기본 단계
- 고유한 프로세스 ID (pid) 할당
- 프로세스를 위한 메모리 할당
- PCB 초기화
- 적절한 큐에 연결
- 기타 자료구조 생성
- PCB 초기화 내용
- 프로세스 ID, 부모 ID
- 프로그램 카운터와 스택 포인터 설정
- 상태를 보통 ready로 설정
2.2 응용 프로그램 관점의 프로세스 생성
- 프로세스 계층 구조
- 부모 프로세스가 자식 프로세스 생성
- 트리 형태의 프로세스 구조 형성
- 주소 공간 옵션
- 자식이 부모를 복제
- 자식이 새로운 프로그램을 로드
- 실행 옵션
- 부모와 자식이 동시 실행
- 부모가 자식 종료까지 대기
- 자원 공유 옵션
- 모든 자원 공유
- 일부 자원만 공유
- 자원 공유 안 함
3. UNIX 시스템 콜
💡 fork(), exec(), wait() 시스템 콜의 동작 방식과 차이점은 필수 면접 준비 항목입니다.
3.1 fork() 시스템 콜
- 특징: UNIX 시스템에서 새로운 프로세스를 생성하는 유일한 방법
- 동작: 호출한 프로세스의 동일한 복사본 생성
- 반환값
- 부모: 성공 시 자식의 pid, 실패 시 -1
- 자식: 0
3.2 exec() 시스템 콜
- 목적: 새로운 프로그램 실행 시작
- 동작: 호출한 프로세스를 새 프로그램으로 완전히 대체
- 특징: 프로세스 속성은 유지됨
3.3 fork()와 exec()의 조합
#include <unistd.h>
docommand(char *command) {
pid_t pid;
if ((pid = fork()) < 0) return(-1);
if (pid == 0) { /* child */
execl("/bin/sh", "sh", "-c", command, (char *) 0);
perror("execl");
exit(1);
}
/* parent code, wait until child exits */
wait((int *) 0);
return(0);
}
3.4 exit()와 wait() 시스템 콜
- exit()
- 정상적인 프로세스 종료
- 정리 작업 수행 후 커널로 반환
- wait()
- 자식 프로세스 종료까지 부모 프로세스 중단
- SIGCHLD 시그널 처리
4. 프로세스 간 통신 (IPC)
💡 IPC의 다양한 메커니즘과 각각의 특징을 이해하는 것은 매우 중요합니다.
4.1 기본 IPC
- 파이프 (Pipe)
- 부모-자식 프로세스 간 통신
- 프로세스 종료 시 제거
- FIFO (Named Pipe)
- 관련 없는 프로세스 간 통신 가능
- 영구적 통신 채널
4.2 System V IPC
- 메시지 패싱
- 프로세스 간 메시지 송수신
- 주요 함수: msgget(), msgsnd(), msgrcv(), msgctl()
- 공유 메모리
- 여러 프로세스가 메모리 세그먼트 공유
- 주요 함수: shmget(), shmat(), shmdt(), shmctl()
- 세마포어
- 프로세스 동기화
- 주요 함수: semget(), semop(), semctl()
4.3 소켓 통신
- 소켓의 특징
- 양방향 통신
- 포트 번호와 IP 주소에 바인딩
- TCP 또는 UDP 프로토콜 사용
- 소켓 유형
- UDP 소켓 (SOCK_DGRAM)
- 비연결형
- 신뢰성 없음
- 순서 보장 없음
- TCP 소켓 (SOCK_STREAM)
- 연결 지향적
- 신뢰성 있는 전송
- 순서 보장
- UDP 소켓 (SOCK_DGRAM)
참고 자료
- UNIX System Programming
- Advanced Programming in the UNIX Environment
- TCP/IP Illustrated
댓글남기기