Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Value too long for column
- PytestPluginManager
- PersistenceContext
- vfr video
- 코루틴 빌더
- 코루틴 컨텍스트
- python
- VARCHAR (1)
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- JanusWebRTCServer
- 달인막창
- terminal
- JanusWebRTCGateway
- 티스토리챌린지
- JanusWebRTC
- pytest
- table not found
- 자원부족
- mp4fpsmod
- kotlin
- k8s #kubernetes #쿠버네티스
- 개성국밥
- 깡돼후
- taint
- Spring Batch
- 오블완
- preemption #
- 겨울 부산
- tolerated
- JanusGateway
Archives
너와 나의 스토리
[Unix] 좀비, 고아 프로세스 & Background, Foreground 프로세스 본문
반응형
기본적인 fork() 실습
- UID: 프로세스를 실행 시킨 프로세스의 소유자를 의미
- PID: 실행된 프로세스에 부여된 숫자
- PPID: 부모 프로세스의 PID
// fork.c
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
pid_t pid;
printf("Calling fork()\n");
pid=fork();
if(pid>0) // 부모
printf("Parent PIDs : %d, %d, %d\n",pid,getpid(),getppid());
else if(pid==0) // 자식
printf("Child PIDs : %d, %d, %d\n",pid,getpid(),getppid());
else
printf("fork() error.\n");
return 0;
}
sleep(), wait() 실습
부모 프로세스는 자식 프로세스가 종료되면 wait을 리턴 받아 그 후 과정을 진행.
자식 프로세스는 sleep(10)을 하므로 10초가 지연됨
* ps: 시스템에 동작중인 프로세스 확인하는 명령어
- 좀비 프로세스
- 자식 프로세스가 부모 프로세스보다 먼저 종료
- 프로세스는 종료되었지만 메모리 상에서 프로세스 정보가 유지되고 있는 상태
- 자식 프로세스에서 exit와 return으로 전달되는 인자값을 부모 프로세스가 받을 때까지 자식 프로세스는 좀비 프로세스로 남아있게 된다.
// zombie.c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
pid_t pid;
pid = fork();
if(pid!=0) sleep(60);
else printf("Parent becomes zombie for 60 secs.\n");
return 0;
}
부모 프로세스가 wait하지 않고 60초간 아무 것도 안하는 상황. 그 안에 자식 프로세스가 먼저 끝남
부모 프로세스는 그냥 자기 할 일 하는 중
자식 프로세스가 좀비 프로세스가 됨
- 고아 프로세스
- 부모 프로세스가 자식 프로세스보다 먼저 죽는 경우
- init 프로세스가 고아 프로세스의 부모가 되어준다.
- init 프로세스가 고아 프로세스를 wait()해 고아가된 좀비가 제거된다.
- 데몬(daemon) 등의 동작을 가능케 함
- 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램
- 부모 프로세스가 init(PID=1)이고 제어하는 터미널이 없을 때, 그 프로세스를 daemon이라 한다.
// orphan.c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
pid_t pid;
pid =fork();
if(pid==0) sleep(60);
else printf("Child will terminate in 60 secs.\n");
return 0;
}
처음 실행 시에는 orphan 프로세스가 두 개 다 존재
부모 프로세스는 자식 프로세스가 종료되는 것을 기다리지 않고, 병렬적으로 자신의 일을 수행
시간이 지난 후, ps를 출력해보면 자식 프로세스만 남아았음(60초 sleep하도록 해서)
ps -al 명령어 입력
- 두 프로세스 다 동작할 때
F S UID PID PPID C
- 부모 프로세스만 종료한 경우
F S UID PID PPID C
ㄴ 자식 프로세스의 PPID가 부모 프로세스가 아닌 init 프로세스가 된다.
- Foreground Process
- 명령어의 실행 과정이나 결과를 화면에 출력
- ex) sleep 10 명령어를 입력하면, 10초 간 기다린 후, 다음 명령어 수행 가능
- 즉, 실행 중인 프로세스가 종료되길 기다린 후, 프롬프트 명령 대기 상태로 전환된다.
- Background Process
- 프로세스가 실행중이어도 이를 보이지 않는 background에서 돌려 놓고, 명령을 계속 받고 실행 가능
- &를 붙여서 명령어를 입력하면 background로 실행됨
- 장시간 작동되는 작업에 유용하다
출처: [unix system programming 2nd]
반응형
'Unix > 실습' 카테고리의 다른 글
[Unix] 디렉터리 조작 실습 (0) | 2019.10.12 |
---|---|
[CH.2] 유저(그룹) 추가/제거 변경 및 권한 (0) | 2019.10.09 |
[CH.5] 파일 조작 - System call (2) | 2019.10.09 |
[Unix] Make (0) | 2019.09.27 |
Comments