티스토리 뷰
1) 프로세스
- 실행중인 Program
- 프로그램 VS 프로세스
- 프로세스: CPU가 메모리 상에서 실행
- 프로그램: 디스크 상에서 실행
- 프로그램의 실행
2) 프로세스 스케쥴링(Process Scheduling)
- 여러 프로그램의 동시 실행
- CPU가 적절히 처리를 해줘야 많은 프로세스들이 잘 실행될 수 있다.
- 애플리케이션의 성능 특성에 따라 자원 소모를 고려할 수 있다.
- CPU 개수가 늘어나면 프로세스 동작이 좋아진다.
- core 수가 증가하면 성능 수가 높아진다.
- 어떻게 모두를 만족시킬 것인가?
3) 프로세스 상태(process state)
- 프로세스 전이 다이어그램(process transition diagram)
- Created
- Wating: 프로세스 대기 상태
- Running: CPU의 프로세스 실행
- Blocked: HDD의 파일 읽는 것을 block
- Terminated
4) 프로세스 계층 구조
- PID(Process ID)
- 부모 프로세스와 자식 프로세스: 모든 프로세스는 부모 프로세스가 있다.
- init 프로세스: kernel이 memory에 올라가서 H/W의 자원을 초기화 한다.
- 프로세스 종료 처리
- 고아 프로세스와 좀비 프로세스
- 프로세스 종료 처리가 제대로 되지 않았을 경우 생기는 문제들
- 고아: 종료 처리를 해주어야 할 부모 프로세스가 없는 고아 프로세스, init프로세스는 리눅스가 종료될 때까지 항상 있으므로 부모 프로세스가 없을 때 부모가 되어 종료 처리를 해준다. (최상위 부모의 종료 처리)
- 좀비: 1) 자식 프로세스가 죽을 때까지 기다림 2) 자식 프로세스가 죽을 것이라는 Signal을 받게 되면 그 때 자식 프로세스를 종료 처리해준다.
5) 프로세스 종료 상태
- 프로세스 종료 상태
- 프로세스가 종료될 때 넘겨주는 정보
- 부모 프로세스에게 정보를 넘기게 됨
- 상태 정보
- 0: 성공 / 1: 실패
- 정상 종료 여부
- Signal을 받아 종료되었는지 여부 및 Signal의 종류
- Core dump를 생성했는지 여부
6) 표준 스트림과 파일 디스크립터(standard streams)
- 표준 입력(standard input): stdin(Keyboard)
- 표준 출력(standard output): stdout(Display)
- 표준 에러(standard error): stderr(Display)
- 파일 디스크립터(file descriptor)
- fd = open(...)
- write(fd, 내용)
- 파일을 대변하는 객체
- 파일에 대한 작업(읽기/쓰기)을 하기 위해서 파일 디스크립터를 열어야 함
- 프로세스로 열린 파일 디스크립터 목록을 관리
7) 포어그라운드(foreground) 프로세스와 백그라운드(background) 프로세스
- 포어그라운드 프로세스
- 쉘의 표준 입력이 연결된 프로세스
- 표준 출력과 표준 에러도 쉘과 연결되어 있음
- 백그라운드 프로세스
- 쉘의 표준 입력이 연결되지 않은 프로세스
- 사용자 입력 필요없이 프로세스를 여러 개 실행시킬 수 있는 조건
- 표준 출력과 표준 에러는 쉘과 연결되어 있음
- 쉘의 표준 입력이 연결되지 않은 프로세스
8) 데몬 프로세스(daemon process)
- 악마 프로세스
- MIT 대학의 프로그래머가 만든 용어로 보이지 않는 곳에서 어떤 일을 하는 유령에서 유래
- 데몬 프로세스
- 백그라운드 프로세스로 동작하기 위해 만들어진 프로세스
- 표준 스트림을 갖고 시작하지만 모두 닫아 버림 -> 쉘과의 입출력 교환 불가
- 부모 프로세스를 init 프로세스로 변경
9) 시그널(signal)
- 비동기 이벤트를 처리하기 위한 프로세스간 통신
- 동기(Synchronous) VS 비동기(Asynchronous)
- 동기: Client가 요청을 보내고 응답이 올 때까지 기다린다.
- 비동기: Client가 요청을 보내고 Continue Working 그리고 응답을 받고 어떤 일을 한다.
시그널 이름 | 의미 | 기본 처리 |
SIGCHILD | 자식 프로세스 종료 | 무시 |
SIGINT | 사용자가 인터럽트(Ctrl+C)를 생성 | 정지 |
SIGKILL | 프로세스 종료 명령 | 종료 |
SIGTERM | 프로세스 종료 명령(조건에 따른 처리) | 종료 |
10) 프로세스 목록 조회 및 구조 파악
$ ps //report a snapshot of the current processes.
$ ps -f //UID, PID, PPID(부모 프로세스의 ID),STIME(실행시작시간)
$ ps -ef
$ ps -ef --forest //gnome terminal server-bash라는 프로세스의 자식
$ echo $$ //bash의 프로세스가 무엇인지 알 수 있다.
$ vim process.sh //vim으로 process 쉘스크립트 파일 생성
$ chmod 0755 process.sh
$ ./process.sh //현재 경로에서 스크립트 실행
- 프로세스의 부모가 init프로세스라고 해서 무조건 데몬 프로세스라고 할 수는 없다.
- 자식 프로세스로 실행되는 프로세스들
- bash에서 스크립트를 실행하면 별도의 프로세스로 실행된다. echo $$로 출력하는 pid가 bash의 pid라면 명령어를 통해 출력하는 pid는 process.sh의 pid이다.
11) 프로세스 종료 상태
$ echo $? //직전의 exit status가 무엇인지 알려줌
12) 시그널 전송
$ kill -l //Signal의 종류 목록
$ kill -9 종료시키고자 하는 pid번호 //실행중인 프로세스를 종료 => 죽었음
$ kill -TERM pid번호 //실행중인 프로세스를 종료 => 종료됨
$ kill -ABRT pid번호 //실행중인 프로세를 종료하되 코어 덤프
$ ulimit -a //core 파일에 대한 정보 확인
$ ulimit c size //core 파일에 대한 사이즈 설정
- ctrl + C로 bash가 sigINT를 전송
13) 포어그라운드 프로세스와 백그라운드 프로세스
* 디폴트로 포어그라운드 프로세스 실행
- 사용자의 입력을 줄 수 있는 상태
* 백그라운드 프로세스 실행법
$ ./process.sh & //사용자 입력 ctrl+z나 ctrl+c의 명령이 통하지 않는다.
'Linux' 카테고리의 다른 글
6. 리디렉션과 파이프라인 (0) | 2023.04.03 |
---|---|
4. 사용자와 그룹 (0) | 2023.04.03 |
3. 파일 (0) | 2023.04.03 |
[error] 우분투 전체화면 안되는 현상 해결하기 (0) | 2023.04.01 |
2. 최소한의 커맨드라인 사용법 (0) | 2023.03.31 |