[Linux] 프로세스와 시그널
2023. 3. 8. 23:44
프로세스와 시그널
- 프로세스란?
- 사전적 의미 : 실행중인 프로그램
- 프로그램은 하드디스크에 저장된 실행 파일 자체
- 프로그램이 실행되면 프로세스가 생성됨
- 프로세스는 메모리 상에 있는 객체임
- CPU가 메모리에 올라와 있는 프로세스를 실행해준다.
- CPU가 프로세스를 실행하기 위해선 정보가 필요하다.
- 프로그램의 코드, 프로세스의 stack, heap....
프로세스 계층구조
- PID (Process ID) : 프로세스의 ID 값 (고유값)
- 부모 프로세스와 자식 프로세스
- 프로세스가 새로운 프로세스를 발생시키면 부모-자식 관계가 생성됨
- init 프로세스를 제외하고 모든 프로세스들은 부모 프로세스가 존재함
- init 프로세스 : 커널이 부팅을 하며 하드웨어 자원들을 초기화 후 init 프로세스를 생성함
- init 프로세스의 PID는 항상 1이다.
- 프로세스 종료처리
- 자식 프로세스가 종료될 때 메모리 clear가 제대로 되지 않아서 부모 프로세스 쪽에서 이 처리를 도와줘야함
- 이 과정이 프로세스 종료처리이다.
- 고아 프로세스와 좀비 프로세스
- 종료처리가 제대로 이루어지지 않았을 때 발생하는 문제
- 고아 프로세스 : 자식 프로세스 입장에서 부모 프로세스가 먼저 종료되어 버리는 경우
- 자식 프로세스가 종료 될 때, 부모가 없기 때문에 종료처리가 되지 않음
- 만약 부모 프로세스가 먼저 죽게되면 리눅스는 입양처리가 이루어짐
- 부모 프로세스를 init 프로세스로 바꿔줌
- 좀비 프로세스 : 자식 프로세스가 종료가 되었는데 종료처리를 진행하고있지 않는것
- 부모 프로세스는 자식 프로세스가 죽을때까지 대기 하다가 종료처리를 하거나
- 자식 프로세스가 죽으면 운영체제가 부모 프로세스에게 자식이 죽었다는 signal을 날려주면 종료처리를 진행함
- 만약 부모 프로세스가 다른 처리를 하느라 종료 처리를 못하면 좀비 프로세스가 됨
프로세스 종료 상태 (exit status)
- 프로세스 종료 상태란?
- 프로세스가 종료될 때 넘겨주는 정보
- 자식 프로세스가 죽을 때 상태를 남기고, 부모 프로세스가 받아옴
- 상태 정보
- 정상 종료 여부
- 시그널을 받아 종료되었는지 여부 및 시그널의 종류
- 코어 덤프(core dump)를 생성했는지 여부
- 코어 덤프 = 메모리 덤프 = 시스템 덤프 = 덤프보통 프로세스가 비정상적으로 종료했을 때 만들어짐
- 디버깅 툴로 core file을 통해 분석함
- 컴퓨터 프로그램이 특정 시점에 작업 중이던 메모리 상태를 기록 한 것 (core file을 만들어내는 행위)
표준 스트림 (standard streams)
- 표준 스트림은 입출력 통로를 가리킴
- 모든 프로세스는 다음의 세가지 스트림을 가지고 생성됨
- 표준 입력 (standard input), stdin, 0
- 표준 출력 (standard output), stdout, 1
- 표준 에러 (standard error), stderr, 2
- 프로세스가 스트림을 열게 되면 스트림 별로 identifier가 생성됨
- 리눅스에는 번호로 부여됨
파일 디스크립터 (file descriptor, FD)
- 파일을 대변하는 객체
- 파일에 대한 작업(read, write)을 하기 위해서는 파일 디스크립터를 열어야 함
- 프로세스로 ''열린 파일 디스크립터'' 목록을 관리
- 어떤 프로세스가 특정 파일, 혹은 파일들을 열어야 할 때 각각의 파일을 대표하는 정수
- FD 의 0~2 값은 고정되어 있음
- 입력(0), 출력(1), 에러(2)
포어 그라운드 프로세스, 백그라운드 프로세스
- foreground process
- 쉘의 표준 입력(stdin)이 연결된 프로세스
- 표준 출력(stdout)과 표준 에러(stderr)도 쉘과 연결되어 있음
- background process
- 쉘의 표준 입력이 연결되지 않은 프로세스
- 표준 출력과 표준 에러는 쉘과 연결되어 있음
데몬 프로세스 (daemon process)
- 왜 악마 프로세스인가?
- 보이지 않는 곳에서 어떤 일을 한다는 의미에서 따옴
- 데몬 프로세스란?
- 백그라운드 프로세스로 동작하기 위해 만들어진 프로세스
- 표준 스트림을 갖고 시작하지만 모두 닫아버림 -> 쉘과의 입출력 교환 불가
- 부모 프로세스를 init 프로세스로 변경
시그널 (signal)
- 비동기 이벤트를 처리하기 위한 IPC (프로세스간 통신)
번호시그널 이름발생 및 용도디폴트 action리눅스 버전
1 | SIGHUP(HUP) | hangup 시그널; 전화선 끊어짐 | 종료 | POSIX |
2 | SIGINT(INT) | interrupt 시그널; Ctrl + c ;실행을중지 | 종료 | ANSI |
3 | SIGQUIT(QUIT) | quit 시그널; Ctrl + \ | 종료(코어덤프) | POSIX |
4 | SIGILL(ILL) | 잘못된 명령 | ANSI | |
5 | SIGTRAP(TRAP) | 트렙 추적 | POSIX | |
6 | SIGIOT(IOT) | IOT 명령 | 4.2 BSD | |
7 | SIGBUS(BUS) | 버스 에러 | 4.2 BSD | |
8 | SIGFPE(FPE) | 부동 소수점 에러 | 종료 | ANSI |
9 | SIGKILL(KILL) | 무조건적으로 즉시 중지한다. | 종료 | POSIX |
10 | SIGUSR1(USR1) | 사용자 정의 시그널1 | 종료 | POSIX |
11 | SIGSEGV(SEGV) | 세그멘테이션 위반 | ANSI | |
12 | SIGUSR2(USR2) | 사용자 정의 시그널2 | 종료 | POSIX |
13 | SIGPIPE(PIPE) | 읽으려는 프로세스가 없는데 파이프에 쓰려고 함 | 종료 | POSIX |
14 | SIGALRM(ALRM) | 경보(alarm) 시그널; alarm(n)에 의해 n초 후 생성됨 | 종료 | POSIX |
15 | SIGTERM(TERM) | 일반적으로 kill 시그널이 전송되기 전에 전송된다. 잡히는 시그널이기 때문에 종료되는 것을 트랙할 수 있다. | 종료 | ANSI |
16 | SIGTKFLT | 코프로세서 스택 실패 | ||
17 | SIGCHLD(CHLD) | 프로세스 종료시 그 부모 프로세스에게 보내지는 시그널 | 무시 | POSIX |
18 | SIGCONT(CONT) | STOP 시그널 이후 계속 진행할 때 사용. ; 정지 되지 않은 경우 무시됨 | POSIX | |
19 | SIGSTOP(STOP) | 정지 시그널; SIGSTP과 같으나 잡거나 무시할 수 없음 | 프로세스 정지 | POSIX |
20 | SIGTSTP(TSTP) | 키보드에 의해 발생하는 시그널로 Ctrl+Z로 생성된다. ; 터미널 정지 문자 | 프로세스 정지 | POSIX |
21 | SIGTTIN | 백그라운드에서의 제어터미널 읽기 | 프로세스 정지 | POSIX |
22 | SIGTTOU | 백그라운드에서의 제어터미널 쓰기 | 프로세스 정지 | POSIX |
23 | SIGURG | 소켓에서의 긴급한 상태 | 4.2 BSD | |
24 | SIGXCPU | CPU 시간 제한 초과 setrlimit(2) 메뉴얼 패이지 참조 | 4.2 BSD | |
25 | SIGXFSZ | 파일 크기제한 초과 setrlimit(2) 메뉴얼 패이지 참조 | 4.2 BSD | |
26 | SIGVTALRM | 가상 시간 경고 setitimer(2) 메뉴얼 패이지 참조 | 4.2 BSD | |
27 | SIGPROF | 프로파일링 타이머 경고. setitimer(2) 메뉴얼 페이지 참조 | 4.2 BSD | |
28 | SIGWINCH | 윈도우 사이즈 변경 | 4.3 BSD, Sun | |
29 | SIGIO | 기술자에서 입출력이 가능함. fcntl(2) 메뉴얼 참조 | 4.2 BSD | |
30 | SIGPWR | 전원 실패 | System V | |
31 | UNUSED | 사용 안함 |
'skill > linux' 카테고리의 다른 글
[Linux] 파일 (0) | 2023.03.07 |
---|---|
[Linux] 기본 명령어 (0) | 2023.03.05 |
[Linux] 리눅스란? (0) | 2023.03.03 |