프로세스는 저번 '소프트웨어 공학 에센셜' 에서도 다루었던 내용이다.
쏘공 공부를 하면서의 '프로세스'는 소프트웨어를 만드는데 필요한 하나의 작업으로 다루었다면 이 책에서의 '프로세스'는 더 크게 하나의 소프트웨어로 본다.
이 단원을 공부하면서 시분할시스템과 일괄처리시스템이 다시 한번 나오게 되는데 CPU를 2개 이상 넣을 수 있다면 시분할 시스템을 이용해 더 많은 프로세스를 동시에 처리 할 수 있지 않을까 라는 생각을 했다.
또한 init 가 프로세스의 첫 시작이라면 처음 컴퓨터를 부팅하고 운영체제라는 프로세스가 실행될 때 init이 생성되고 그 후에 다른 프로그램을 실행하면 init 이 생성이 될까라는 궁금증이 생겼다.
예를들어 롤이라는 프로그램을 실행했다면 롤이 실행이되며 init이 생성이 되나?? 생성이 된다면 이미 init은 운영체제를 키면서 생성이 됬는데 프로그램마다 독립적인 형태를 띄는 것인가 하는 것인데 코딩을 들어가면 알게 되겠지,,?????
프로세스의 개요
프로그램 →(실행)→ 프로세스
* 레시피 →(조리)→ 요리
프로그램
: 어떤 데이터를 사용하여 어떤 작업을 할지 그 절차를 적어놓은 것
* 겉모습
프로세스
: 프로그램으로 작성된 작업 절차를 실제로 실행에 옮긴 것
* 내부구조(?)
프로세스가 올바르게 실행되기 위해선 사용자의 요구사항을 충족해야한다.
이 때 사용자의 요구사항이 '프로세스 제어 블록'이다.
- 프로세스 제어 블록에 있는 정보
- 프로세스 구분자 (PID : Process IDentification): 프로세스의 주민번호. 프로세스끼리를 구분하기 위해서 사용
- 메모리 관련 정보 : 프로세스가 메모리 어디에 저장되어야 하는지 메모리 보호를 위한 경계 레지스터와 한계 레지스터도 포함
- 각종 중간값 : 시분할 시스템중 현재 프로세스가 어디까지 작업을 했는지 저장
- 프로세스의 상태
- 생성상태 : 프로세스가 메모리에 올라와 실행 준비를 완료한 상태
- 준비상태 : 프로세스가 CPU를 얻을 때까지 기다리는 상태
- 대기상태 : 입출력을 요구한 프로세스가 입출력이 완료될 때까지 기다리는 상태 (시분할시스템에서 사용)
- 실행상태 : 프로세스가 CPU를 얻어 작업을 수행하는 상태
- 완료상태 : 프로세스 제어블록이 삭제된 상태
+ 휴식상태 : 프로세스가 일시적으로 작업을 쉬고있는 상태 멈춘 지점에서부터 재시작 할 수 있다.
보류상태 : 프로세스가 메모리에서 잠시 쫒겨난 상태. 컴퓨터의 속도를 떨어트리거나 실행을 미루어도 큰 지장이 없는 프로세스
상태 | 설명 | 작업 |
생성상태 | 프로그램을 메모리에 가져와 실행준비가 완료된 상태 | 메모리 할당, 프로세스 제어블록 생성 |
준비상태 | 실행을 기다리는 모든 프로세스가 자기 차례를 기다리는 상태 실행될 프로세스를 CPU 스케줄러가 선택 |
디스패치(PID) : 준비 → 실행 |
대기상태 | 실행상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태. 입출력이 완료되면 준비상태로 이동 | wakeup(PID) : 대기 → 준비 |
실행상태 | 선택된 프로세스가 타임 슬라이스를 얻어 CPU를 사용하는 상태 | timeout : 실행 → 준비 exit : 실행 → 완료 block : 실행 → 대기 |
완료상태 | 프로세스가 종료된 상태. 사용하던 모든 데이터를 정리 | 메모리, 프로세스 제어블록 삭제 |
프로세스 제어블록과 문맥 교환
프로세스 제어블록 (TCB : Task Control Block) : 식당에서 '주문서'와 같은 역할. 프로세스를 실행하는 데 필요한 중요 정보를 보관하는 자료 구조
프로세스 제어블록의 구성
- 포인터 : '주소'와 같은 역할을 한다. 준비상태나 대기상태의 큐를 구현할 때 포인터를 사용
→ 같은 입출력을 요구한 프로세스끼리 모아놓은 '대기큐' 사용
- 프로세스 상태: 현재 프로세스가 어떤 상태를 가지고 있는지를 저장
- 프로세스 구분자 : 여러 프로세스를 구분하기 위해서 사용
- 프로그램 카운터 : 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값을 저장
- 프로세스 우선순위 : 프로세스의 중요도에 따라 어느 프로세스를 먼저 처리할 지 선택
- 각종 레지스터 정보 : 사용한 레지스터의 중간값을 보관
- 메모리 관리 정보 : 메모리 위치정보, 경계 레지스터값 등을 저장
- 할당된 자원 정보 : 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일에 대한 정보
- 계정 정보 : 계정 번호, CPU 할당시간 등을 저장
- 부모 프로세스 구분자와 자식 프로세스 구분자 : 부모 프로세스 (PPID), 자식 프로세스 (CPID)를 저장
문맥교환
: 기존에 사용하던 프로세스를 정리하고 다른 프로세스로 이동하는 것
→ 프로세스 제어블록의 내요 전환
- 문맥교환의 절차
프로세스의 연산
프로세스의 구조
- 코드 영역 (이전에 만들었던 웹사이트의 main에 해당) : 프로그램의 본문이 기술 된 곳 읽기전용으로 처리된다
- 데이터 영역 ( " 사진에 해당) : 변수나 파일등 각종 데이터를 모아놓은 곳
- 스택영역 : 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳
프로세스의 생성과 복사
- fork() : 복사 함수. 프로세스를 복사하여 기존의 내용을 새로 생성하지 않아도 기존의 프로세스와 같은 프로세스를 만들 수 있음
→ 생성된 프로세스는 복사한 프로세스와 부모-자식 관계로 이루어져 있다.
fork() 시스템 호출 후 프로세스의 변화
- 프로세스 구분자 (PID)가 바뀐다.
- 메모리 관련 정보가 바뀐다.
- 부모 프로세스 구분자와 자식 프로세스 구분자가 바뀐다.
→ 자식프로세스가 없는 경우에 -1로 표기한다.
프로세스의 전환
exec() : 기존의 프로세스를 새로운 프로세스로 전환하는 함수
→ 기존의 프로세스를 재활용하기 위함
exec() 시스템호출의 동작과정
exec() 시스템 호출 후 프로세스의 변화
- 프로세스 구분자가 변하지 않음
- 코드의 내용을 초기화
- 기존의 프로세스 틀만 남기고 모든것을 재설정할 수 있음
유닉스의 프로세스 구조
- init : 모든 프로세스의 부모프로세스. fork()와 exec()를 사용하여 첫 프로세스를 제외한 다른 프로세스를 생성하지 않아도 된다.
- login : 인증을 거쳐 컴퓨터에 접속하는 과정 처리
- shell : 사용자가 운영체제에 명령을 내리고 결과를 받을 수 있도록 처리
고아프로세스 : 부모프로세스가 먼저 종료되는 경우에 발생
좀비프로세스 : 자식 프로세스가 비정상적으로 종료되어 부모프로세스에게 연락이 안되는 경우 뒤처리 x
용어정리
* 큐 : 먼저 들어온 데이터가 먼저 빠져나가는 자료구조
* 디스패치 : 준비상태의 프로세스중 하나를 골라 실행상태로 바꾸는 작업
* 타임 슬라이스 : 한 프로세스에 배당된 작업시간
* 타임아웃 : CPU가 프로세스에 배당된 시간안에 작업을 끝내지 못한 경우
* CPU 스케줄러 : 준비상태에 있는 프로세스중 다음에 실행할 프로세스를 선정하는 일을 함
'OS > 쉽게 배우는 운영체제' 카테고리의 다른 글
CPU 스케줄링 (1) (0) | 2022.02.22 |
---|---|
프로세스 관리 (2) (0) | 2022.02.19 |
컴퓨터의 구조와 성능 향상 (2) (0) | 2022.02.14 |
컴퓨터의 구조와 성능 향상 (1) (0) | 2022.02.14 |
운영체제의 개요 (2) (0) | 2022.02.13 |
댓글