- 실행중인 프로그램의 인스턴스
- 프로그램에서 제어 흐름의 캡슐화
- 동적이고 활동적인 개체
- 실행과 스케쥴링의 기본 단위
- 프로세스는 PID(Process ID)를 통해 이름지어짐
프로세스가 포함하고 있는것
- cpu contexts(레지스터)
- OS 자원(메모리, 열린 파일 등등)
- 기타 정보(PID, 활성상태, 소유자 등등)
- 한개의 프로세스는 다른 프로세스를 생성 할 수 있다.(부모-자식 간의 관계처럼)
- Unix는 이러한 계층구조를 프로세스 그룹이라고 말함
- 윈도우에는 이러한 프로세스 계층 구조가 없다
프로세스 목록을 확인하는 방법
- 유닉스 계열에서는 ps
- 윈도우에서는 taskmgr
- POSIX(Unix, Linux 등) 에서는 fork(), Win32에서는 createProcess()
- shell이나 Gui는 내부에서 시스템 콜을 통해 프로그램을 프로세스화 함
2. 시스템 초기화
- init 프로세스
- PID 1번을 가짐
- 모든 프로세스는 init의 자식 프로세스
- 부모 프로세스는 자식 프로세스에게 자원이나 권한의 전부 또는 일부를 상속 할 수 있음
- 부모 프로세스는 자식 프로세스가 끝날때 까지 기다릴 수도 있고, 동시에 실행 될 수도 있다.
- 자식 프로세스는 부모 프로세스의 메모리 주소 공간을 복제 함
- 자식 프로세스를 생성할때 호출되는 시스템 콜
- 부모의 전체 가상 주소 공간을 복사하여 자식 프로세스를 생성
- 자식 프로세스를 관리하기 위해 내부 데이터 구조를 복사함
- 부모 프로세스는 자식 프로세스의 pid를 얻음
- 자식 프로세스는 0의 값을 갖는다
- 각 프로세스는 한개의 프로세스를 지칭한다
- 리눅스는 task_struct라는 데이터 구조로 PCB를 관리함
- 프로세스에 대한 모든 정보를 가지고 있다.
- 프로세스 상태
- program counter
- Cpu 스케쥴링 정보
- 메모리 관리 정보
- 계정 정보
- I/O 상태 정보 등등
- CPU를 한 프로세스에서 다른 프로세스로 전환하는 것
- 초당 100번에서 1000번 사이의 Context Switch 가 발생함
- 레지스터와 메모리 맵 저장 및 로딩
- 메모리 캐시를 플러싱하고 다시 로드하기
- 다양한 테이블과 목록 업데이트 등.
- 레지스터가 여러개면 더 적은 오버헤드
- 향상된 메모리 관리 기술은 더 적은 오버헤드
- OS는 시스템의 모든 프로세스 상태를 나타내는 대기열 모음을 유지합니다.
queue의 종류
- Ready queue
- Wait queue: 디바이스, 타이머, 메세지 등 각 유형에 따라 여러 wait queue가 있을 수 있음
- 각 PCB는 현재 상태에 따라 상태 대기열에 대기
- 프로세스가 상태를 변경함에 따라, PCB는 다양한 대기열 간에 마이그레이션 됨
OS 메모리에 동적으로 할당 된다
- OS는 프로세스에 PCB를 할당
- OS는 PCB를 초기화
- OS는 PCB를 올바른 queue에 위치시킴
OS는 PCB를 대기열에서 대기열로 옮김
OS는 PCB를 할당 해제한다.
- 새 PCB를 만들고 초기화
- 새 주소 공간을 만들고 초기화
- 부모 주소 공간의 전체 내용의 복사본으로 주소 공간을 초기화
- 부모가 사용하는 리소스를 가리키도록 커널 리소스를 초기화(예: 파일 열기)
- ready queue에 PCB를 배치
- 자식의 PID를 부모에게 반환하고 자식에게 0을 반환
- 현재 프로세스를 중지
- 프로세스의 주소 공간에 프로그램 "prog"를 로드.
- 새 프로그램에 대한 하드웨어 컨텍스트와 args를 초기화
- ready queue에 PCB를 배치
-> exec()는 새로운 프로세스를 생성하지 않음, fork()가 유일하게 새로운 프로세스 생성
- 특정 서비스를 제공하기 위해 존재하며 리눅스 커널에 의해 실행
- 자식 프로세스가 아직 실행 중인데 부모 프로세스가 먼저 종료된 자식 프로세스는 고아 프로세스
- 1번 프로세스(init,systemd)가 고아 프로세스의 새로운 부모 프로세스가 되어 고아 프로세서의 작업 종료 지원
- 자식 프로세스가 실행을 종료했는데도 프로세스 테이블 목록에 남아 있는 경우
- 좀비 프로세스는 프로세스 목록에 defunct 프로세스라고 나오기도함
- 좀비 프로세스가 증가하면 프로세스 테이블의 용량이 부족해서 일반 프로세스가 실행되지 않을 수도 있음
- 현재 실행중인 프로세스의 정보를 출력
- STAT에 사용되는 문자의 의미
- ps -au의 출력 정보
- 지정한 패턴과 일치하는 프로세스의 정보를 출력
- 프로세스에 무언가 발생했음을 알리는 간단한 메세지
- 리눅스에서 지원하는 시그널의 목록은 kill -l 명령어로 확인 가능
주요 signal
- kill [-시그널] PID
pkill 명령을 이용해 프로세스 종료하기
- PID가 아니라 프로세스의 명령이름(CMD)로 프로세스 찾아 종료
- 현재 실행중인 프로세스에 대한 정보를 주기적으로 출력
top 명령의 출력 정보
GUI 환경의 프로세스 관리 도구