I. 프로세스 - (매년 출제)
- 실행중인 프로그램(작업)
- 커널에 등록되고 커널의 관리 하에 있는 작업
- 각종 자원들을 요청하고 할당받을 수 있는 개체
- 프로세스 관리 블록(PCB)을 할당받는 개체
- 구성요소: 코드, 데이터, 스택
*프로세스 관련 용어
- 프로그램(Program): 특정 기능을 수행하기 위한 명령어 집합
- 프로세서(Processor):연산을 수행하고 처리하기 위한 자원, 보통 CPU를 말함
- 프로시저(Procedure): 프로그램의 일부로 공통으로 사용되는 특정 루틴
- 작업(Job): 프로그램과 프로그램 실행에 필요한 입력 데이터
- 프로세스 관리 블록(PCB): 커널에 등록된 각 프로세스들에 대한 정보를 저장하고 있는 영역
- 스레드(Thread): 프로세스의 일부 특정 데이터를 갖고 있으며, 프로세스보다 가벼운 작은 실행 단위
2) 프로세스 관리 블록(PCB): 컴퓨터 시스템 내의 프로세스들은 모두 커널 공간에 자신의 PCB를 하나씩 갖게 되며, 이의 관리는 커널이 하게 된다.
*PCB에 저장되는 프로세스 관련 정보
- 프로세스 고유 번호(PID)
- 프로세스 우선순위(priority)
- 프로세스의 현재 상태(current state)
- 프로세스가 할당받은 자원들의 리스트 또는 이들에 대한 포인터
- 문맥 저장 영역(context save area)
3) 프로세스 식별자(PID): 유닉스 커널과 같은 운영체제에서 각 프로세스나 서비스를 식별하기 위해 할당하는 고유한 번호이다. "fork"라는 시스템 호출에 의해 반환되며, 주어진 프로세스에 어떤 행동을 이행하기 위해 wait()나 kill() 등에 전달될 수 있다.
4) 시그널: 리눅스는 사용자 또는 프로그램이 프로세스를 제어할 수 있도록 시그널(Signal)로 신호를 지원한다. kill, POSIX.1b signals, POSIX.1b timers, SIGCHLD 등에 의해 시그널이 발생한다.
*다양한 정의와 함수를 제공하는 헤더파일의 예(signal.h 포함)
- /usr/include/linux/signal.h
- /usr/include/asm/signal.h: 다양한 시그널을 정의
- /usr/include/asm/siginfo.h
- /usr/include/asm-generic/siginfo.h: 시그널에 관한 함수와 정의를 포함
- /usr/include/linux/time.h: 시그널에 관한 함수와 정의를 포함
*kill 명령에 의해 보낼 수 있는 시그널의 종류
5) 부모와 자식 프로세스: 특정한 프로세스에 종속된 프로세스는 해당 프로세스의 자식 프로세스(Child Process)라고 하고, 그리고 그 특정한 프로세스는 자식 프로세스에 대해 부모 프로세스가 된다. 이런 의미에서 리눅스에서 PID번호가 1인 init은 모든 프로세스의 부모이다.
*좀비프로세스: 부모 프로세스에 종속되어 있는 자식 프로세스는 대부분 부모가 종료하면 자동으로 함께 종료하는데, 그런데 부모가 종료된 후에도 자식이 남아 있는 경우를 뜻한다. 좀비프로세스가 많아지면 시스템이 느려지는 원인이 되는데, init프로세스에 의해 관리되므로, kill명령으로 강제 종료 시키는 것이 좋다. 그리고 시스템이 재부팅하면 이런 좀비프로세스가 자동으로 제거된다.
프로세스 관리의 이해
상태 |
특성 |
||
활동 상태 (Active, Swapped-in) |
실행 상태(Running) |
프로세서를 할당받은 상태 |
기억 장치를 할당받은 상태 |
준비 상태(Ready) |
필요한 자원을 모두 소유하고 있는 프로세서를 요청하고 있는 상태 |
||
대기 상태(Blocked, asleep) |
프로세서 외에 다른 자원이 없는 상태 |
||
지연 상태 (Suspended, Swapped-out) |
지연 준비 상태(Suspended Ready) |
프로세서를 요청하고 있는 상태 |
기억 장치를 잃은 상태 |
지연 대기 상태(Suspended Blocked) |
프로세서와 다른 자원이 없는 상태 |
*생성상태: 사용자가 요청한 작업이 커널에 등록되어 커널 공간에 PCB 등이 만들어지고 프로세스가 처음 생성되는 상태를 뜻한다. 즉, 준비상태 또는 지연 준비 상태로 전이되기전에 임시로 거치는 상태이다. 커널은 메모리 공간을 검사하여 생성된 프로세스에게 할당할 충분한 공간이 있으면 이를 할당하여 준비상태로 전이시키고, 그렇지 않으면 기억 장치를 할당 못하고 지연 준비 상태로 전이시킨다.
*준비상태: 프로세스가 기억 장치를 비롯한 모든 필요한 자원들을 할당받은 상태에서 프로세스를 할당받기 위해 기다리고 있는 상태를 뜻한다. 프로세서를 할당받으면 실행 상태로 전이되고 자신의 프로그램을 실행시킨다. 이와같이 준비상태에서 실행 상태로 전이 되는 것을 디스패치(dispatch) 또는 스케줄(schedule)이라고 한다.
*실행상태: 프로세스의 프로그램 코드가 기억 장치로부터 읽혀지면서 프로세서 의해 실행 되고 있는 상태를 뜻한다. 즉, 프로세스가 모든 자원을 할당하고 있는 상태라 할 수 있다. 실행상태의 프로세스는 시간할당량이 끝나거나, 자신보다 높은 우선순위를 가진 프로세스에게 반납해야 되서 다시 준비상태로 전이 되기도 하는데, 이를 선점(preemption)이라고 하고, 시간할당량의 종료로 인해 선점되는 경우를 시간종료(time runout)이라고 한다. 이와같이 선점당한 프로세스는 준비상태에서 다시 프로세스를 할당받을 때까지 기다린다. 프로세스가 실행 중 입출력 요구 등을 위한 시스템 호출(System call)을 할수도 있는데, 즉, 자신의 프로그램 코드가 아닌 커널의 코드를 실행하기 위해 커널의 특정 루틴을 호출하는 경우를 말하는데, 이를 관리자호출(SVC)이라고도 한다.
그리고 프로세스가 실행중 시스템 호출을 하면 버퍼(buffer) 등의 각종 자원을 요청하게 되는데, 이 과정에서 필요한 자원을 얻을 때까지 기다리게 될 수 가 있다. 이때 프로세스의 실행 상태에서 대기상태로 전이되어 프로세서를 반납하고 요청한 자원을 얻을 때까지 기다린다. 이와 같이 실행 상태에서 대기 상태로 전이되는 것을 블록(Blcok)이라 한다.
*대기상태: 프로세스가 임의의 자원을 요청한 후 이를 즉시 할당 받을 수 없어 이를 할당받을때까지 기다리고 있는 상태를 뜻한다. 이와같이 대기중이던 프로세스에게 필요한 자원이 할당되면 이 프로세스는 다시 준비 상태로 전이되는데 이를 'wakeup'이라 한다.
*지연상태: 프로세스가 기억 장치를 할당받지 못하고 있는 상태를 뜻한다. 프로세스가 처음 생성되었을 때 당시에 프로세스를 위한 기억 장치의 양이 충분하지 않은 경우에는 지연 준비 상태로 전이된다.
*지연 준비 상태: 프로세스가 생성된 후 기억 장치의 양이 부족하거나, 이미 기억 장치를 할당받고 준비 상태에 있던 프로세스가 기억 장치를 빼앗기고 지연 준비상태로 전이될 수 있다. 준비 상태에서 지연 준비 상태로 전이되는 것을 지연(suspend) 또는 swap-out이라 하며, 거꾸로 지연 준비 상태에서 준비 상태로 전이되는 것을 재활동(resume) 또는 Swap-in이라 한다.
*지연 대기 상태: 어떤 자원을 얻고자 대기 상태에 있던 프로세스도 커널에 의하여 기억 장치를 뺏길 수 있는데, 이와 같이 대기 상태에서 기억장치를 잃은상태를 뜻한다.
- 입출력 인터럽트: 프로세스가 요청한 입출력의 완료 등과 관련하여 발생
- 클럭 입터럽트: 프로세스의 시간 할당량 종료와 관련하여 발생
- 프로세스간 통신 인터럽트: 임의의 프로세스가 지역 호스트 또는 원격 호스트의 다른 프ㅡ로세스로 부터 통신 메세지를 받을 경우 발생
- 스스템 호출 인터럽트: 실행중인 프로세스가 입출력 등을 위한 시스템 호출을 하였을 때 발생
- 프로그램 오류 인터럽트: 프로그램의 실행 중 논리적인 오류로 인하여 발생
- 콘솔 인터럽트: 시스템 관리자가 콘솔 터미널에서 인터럽트 키를 누를 때 발생
- 하드웨어 검사 인터럽트: 하드웨어 상의 오류가 있을 때 발생
데몬의 개념 및 역할
*데몬(daemon): 데몬은 시스템에서 네트워크를 통해 특정한 서비스를 제공하기 위해 특정 포트를 열어두고 연결요청이 들어오길 기다리는 프로그램이다. 예를 들어 웹 서비스를 위한 데몬은 80번 포트에 귀를 기울이고(LISTENING) 있다. 데몬은 인터넷에 연결된 다른 클라이언트의 서비스 요청이 들어오면, 그 요청에 대해 자식 프로세스에게 해당 연결을 넘겨주고 계속 같은 포트에 대해 연결 요청을 기다린다. 왜냐하면 기본 포트를 가진 프로세스 하나가 특정한 프로세스를 지속적으로 처리한다면 다른 요청을 받을 수 없기 때문이다. 예를 들어, ssh서비스를 이용할때 한사람이 ssh의 22번 포트를 사용하고 있을때, 다른 사람도 들어갈수가 없는데, 그래서 데몬이 대표 포트를 지키고 있다가 연결이 들어오면 임의의 포트로 연결을 재지향(Redirect)하고 자신은 계속 대표 포트를 지키고 있는 것이다.
*슈퍼 데몬: 인터넷을 통한 서비스가 많아지면서 하나하나의 데몬을 할당하다 보니 시스템이 무거워져서, 이런 낭비를 막고자 슈퍼 데몬이 탄생했다. 예를 들어 talk, pop3, ftp 등을 관리하면서 이들의 대표 포트로 오는 연결 요청을 해당 데몬에게 전달하는데, 이렇게 되면 상대적으로 적은 데몬들이 항시 대기시키기 않아도 되어 시스템 무게를 덜어줄수 있다. 이러한 데몬은 보통 inetd(Internet Daemon)이라 부르며, 현재는 xinetd이 inetd 대용으로 사용되고 있다. 그러나 xinetd의 사용 여부에 대해서는 상황에 따라 다르다. 다음은 ssh 데몬이 시작되는 방법이다.
- 원격지에서 22번 포트로 ssh연결 요청을 한다.
- inetd는 이 요청을 받아 해당 접속 요청이 어떠한 포트로 들어왔는지 검사한다.
- 연결 요청이 22번 포트로 들어 왔으니 ssh 데몬을 시작시킨다.
- 데몬이 시작되면 연결을 1022포트로 재지향하고 데몬에게 알린다.
- 연결 성공
*네트워크 서비스 포트 설정 파일 - (/etc/services): 특정 인터넷 서비스에서 네트워크 서비스를 제공하기 위해 리눅스 시스템에선 포트가 열려 있어야 하는데, 이를 관리하는 파일이 /etc/services 이다. 인터넷 서비스를 위해 텍스트 형태의 이름과 원래 할당된 포트 번호와 프로토콜 타입간의 맵핑을 제공하는 단순한 ASCII 파일이다.
/etc/services 파일 구성 |
|
service-name port/protocol [aliases] [# comment] |
|
service-name |
해당 서비스의 이름 |
port/protocol | 서비스 포트/프로토콜 |
aliases | 서비스 별칭 |
# comment | 해당 서비스에 대한 설명 |
*데몬의 시작과 종료
# /etc/init.d/[서비스 데몬명] [명령] ◀실행파일 직접 실행 |
|
# service [서비스 데몬명] [명령] |
|
"명령" 종류 |
start(시작), stop(정지), restart(재시작), status, condrestart, reload |
*데몬의 자동 시작 여부 변경: ntsysv 또는 X 윈도우용 "시스템 서비스 설정" 프로그램을 이용하여 설정
'자격증 > 리눅스 마스터 1급' 카테고리의 다른 글
Part1) 리눅스의 실무의 이해 - 네트워크의 이해(2) | 네트워크 설정 (0) | 2018.02.14 |
---|---|
Part1) 리눅스의 실무의 이해 - 네트워크의 이해(1) | 네트워크 기초 (0) | 2018.02.13 |
Part1) 리눅스의 실무의 이해 - 리눅스 시스템의 이해(3) | X 윈도우, 쉘(Shell) (0) | 2018.01.29 |
Part1) 리눅스의 실무의 이해 - 리눅스 시스템의 이해(2) | 디렉터리 구조 및 파일 시스템 이해 (0) | 2018.01.26 |
Part1) 리눅스의 실무의 이해 - 리눅스 시스템의 이해(1) | 리눅스와 하드웨어, 부트매니저 (0) | 2018.01.25 |