프로세스의 구조
코드 영역
텍스트 영역이라고도 함
프로그래머가 작성한 프로그램은 코드 영역에 탑재
탑재된 코드는 읽기 전용으로 처리데이터 영역
변수, 파일, 데이터를 모아놓은 곳
읽기, 쓰기 가능스택 영역
운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 뫃아놓은 곳
프로세스의 생성
- 프로그램을 실행
- 운영체제는 프로그램을 메모리로 가져옴
- 코드 영역에 넣음
- 프로세스 제어 블록을 생성
메모리에 데이터 영역과 스택 영역을 확보한 후 프로세스를 실행
fork()
시스템 호출
fork() 시스템 호출은 실행 중인 프로세스를 복사하는 함수
실행하던 프로세스는 부모 프로세스
새로 생긴 프로세스는 자식 프로세스
부모 - 자식 관계가 됨
프로세스의 변화
프로세스 구분자(PID)가 바뀜
부모 프로세스와 자식 프로세스가 차지하고 있는 메모리 위치가 다르므로 메모리 관련정보가 바뀜
부모 프로세스 구분자(PPID), 자식 프로세스 구분자(CPID)가 바뀜
장점
프로세스의 생성 속도가 빠르다
하드디스크로부터 프로그램을 새로 가져오지 않고 기존 메모리에서 복사하기 때문에 자식 프로세스의 생성 속도가 빠름
추가 작업 없이 자원을 상속할 수 있다
부모 프로세서가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속할 수 있음
시스템 관리를 효율적으로 할 수 있다
부모 프로세스와 자식 프로세스가 자식 프로세스 구분자와 부모 프로세스 구분자로 연결되어 있기 때문에, 자식 프로세스를 종료하면 자식이 사용하던 자원을 부모 프로세스가 정리 할 수 있음
exec()
시스템 호출
기존의 프로레스를 새로운 프로레스로 전환하는 함수
프로세스의 구조체를 재활용하기 위함동작
코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버림
데이터 영역이 새로운 변수로 채워지고 스택 영역이 리셋됨
프로세스 제어블록의 내용 중 프로세스 구분자, 부모 프로세스 구분자, 자식 프로세스 구분자, 메모리 관련 사항은 변하지 않음
프로그램 카운터 레지스터 값을 비롯한 각종 레지스터와 사용한 파일 정보가 모두 리셋됨
마치 프로세스를 처음 시작하는 것 처럼..
fork(), exec()
fork() : 새로운 프로세스를 복사하는 시스템 호출
exec() : 프로레스는 그대로 둔 채 내용만 바꾸는 시스템 호출, 현재 프로세스가 완전히 다른 프로세스로 전환
미아 프로세스, 좀비 프로세스
프로세스가 종료된 후에도 비정상적으로 남아 있는 프로세스
부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 끝날 때 까지 기다려야하는데 부모 프로세스가 먼제 종료되거나 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안되는 경우 자식 프로세스가 종료되지 않거나, 종료 되었는데도 사용하던 자원이 그대로 남게 됨