일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- baekjoon1541
- java
- 2021.01.17
- 2021.01.11
- spring-boot
- 알고리즘데이
- 2021.01.21
- 2021.01.13
- SWEA
- 2020.01.08
- 쉽게 배우는 운영체제
- 알고리즘
- 괄호
- 박재성
- 2021.01.14
- 2021.01.06
- 백준 1149
- 잃어버린 괄호
- algorithm
- 2021.01.19
- 백준 9093
- Til
- 2021.01.12
- 2021.01.22
- 백준
- 2021.01.18
- 자바
- 코드스쿼드
- 마스터즈 2주차 회고
- 코드스쿼드 마스터즈
- Today
- Total
Cooper's devlog
프로세스(Process) 본문
(※위 내용은 '쉽게 배우는 운영체제'의 내용을 기반으로 해서 정리한 내용입니다.)
(※부족한 내용이나 수정할 내용있으면 피드백 부탁드립니다!)
[1. 프로세스 : 하나의 작업 단위]
해당 코드가 메모리에 올라와서 작업이 진행된다.
-
프로그램 : 저장장치에 저장되어 있는 정적인 상태
-
프로세스 : 실행을 위해 메모리에 올라온 동적인 상태
- 컴퓨터 시스템의 작업 단위로 테스크(Task)라고 부른다.
- 프로세스는 각 별도의 주소공간을 할당한다.
= '프로그램'이 메모리 상에 올라오면 '프로세스'
[2.프로세스의 5가지 상태]
- 생성 상태(create status): 프로그램을 메모리에 가져와 실행 준비된 상태
- OS로 부터 PCB를 할당 받은 상태
- 생성된 프로세스는 PCB와 함께 준비 상태로 옮겨진다.
- 준비 상태(ready status) : 실행을 기다리는 모든 프로세스가 자기 상태를 기다리고 CPU스케줄러가 선택한다.
- 실행 대기 중인 모든 프로세스가 자기 순서를 기다리는상태
- PCB는 준비 큐에서 기다리고 CPU 스케줄러에 의해 관리된다.
- CPU 스케줄러 : 준비 상태에서 큐를 몇 개 운영할지와 PCB의 실행 상태로 보낼지를 결정한다.
- 실행 상태(running status) : 선택된 프로세스가 타임 슬라이스를 얻어 CPU를 사용하는 상태.
- 프로세스가 CPU를 할당받아 실행되는 상태 (실행 상태에 들어가는 프로세스 수 = CPU 갯수)
- 실행상태 프로세스는 타임 슬라이스 동안만 작업 가능
- 타임 슬라이스 = CPU 할당 시간
- timeout(PID) : 프로세스 제어 블록을 실행 상태에서 준비상태로 변경
- exit(PID) : 실행 상태 동안 작업이 완료될 경우, 프로세스 정상 종료
- 대기 상태(blocking status)
- 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될때까지 기다리는 상태이다.
- 대기 상태의 프로세스는 입출력장치별로 마련된 큐에서 기다린다.
- 해당 인터럽트로 깨어날 프로세스를 찾는 과정 : wakeup(PID)
- 완료 상태(terminate status): 프로세스가 완료된 상태
- 프로세스가 종료되는 상태
- 코드와 사용했던 데이터를 메모리에서 삭제하고 PCB를 폐기한다.
- 코어 덤프(core dump) : 종료 직전 메모리 상태를 확인함으로 오류 수정이 가능하다.
- 휴식상태
- 프로세스가 작업을 일시적으로 쉬고 있는 상태.
- 보류상태
- 프로세스가 메모리에서 잠시 쫓겨난 상태 (일시 정지 상태)
- 보류 상태 프로세스는 메모리 밖으로 쫓겨나 스왑영역(swap area)에 보관된다.
- swap area : 메모리에서 쫓겨난 데이터의 임시 보관 영역
- 아래와 같은 경우 보류 상태(컴퓨터성능을 떨어뜨리거나 실행을 미뤄도 지장없는 프로세스)
- 메모리 초과로 일부 프로세스를 메모리 밖으로 내보낼 때
- 프로그램 오류 시, 실행을 미뤄야할 경우
- 악의적인 공격을 하는 프로세스일 경우
- 입출력이 계속 지연되는 프로세스일 때
[3. 프로세스 제어 블록과 문맥 교환]
1. PCB(Process Control Block)
- 프로세스의 상태(데이터)에 대한 정보를 저장한 형태
- 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료 구조 : TCB(Task Control Block)이라고 부름
- 모든 프로세스는 고유의 PCB를 가지고 실행 완료되면 폐기된다.
PCB구성
- 포인터
- 준비 상태나 대기 상태의 큐를 구현할 때 포인터를 사용한다.
- 프로세스 상태
- 현재 프로세스의 상태를 나타냄
- 프로세스 구분자
- 여러 프로세스를 구별하기 위한 구분자 저장
- 프로그램 카운터
- 실행될 명령어의 위치를 가리키는 프로그램 카운터(PC) 값 저장
- 프로세스 우선순위
- 대기 큐를 이용해 우선순위별로 운영된다. (높은 우선순위의 프로세스가 더욱 자주 실행)
- 중요도
- 사용자 프로세스 < 커널 프로세스
- 각종 레지스터 정보
- 누산기, 색인 레지스터, 스택 포인터와 같은 레지스터의 값이 저장
- 자신이 사용하던 레지스터의 중간값을 보관(for.이전에 실행할 때 사용한 레지스터 값 보관)
- 메모리 관리 정보
- 프로세스 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 저장
- 세그먼테이션 테이블, 페이지 테이블 등의 정보도 보관
- 할당된 자원 정보
- 프로세스를 실행하기 위한 입출력 자원이나 오픈 파일 정보를 말한다.
- 사운드카드 접근 : 사운드 카드에 대한 정보 저장
- 계정 정보
- 계정 번호, CPU 할당 시간, CPU 사용 시간과 같은 정보 저장
- 부모 프로세스 구분자와 자식 프로세스 구분자
- PPID(Parent PID)와 CPID(Child PID) 정보 저장
2. 문맥 교환(Context switching)
- CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업
- 이 때 두 PCB의 내용이 변경
1. 실행 상태에 있는 프로세스 P1이 자신에게 주어진 시간을 다 사용하여 타임 아웃됨
2. P1의 프로세스 제어 블록에 현재까지의 작업 결과가 저장되고 P1은 준비 상태로 쫓겨난다.
3. CPU 의 레지스터가 P2의 PCB 값으로 채워져 다음 작업을 하게 된다.
[문맥 교환이 일어나는 경우]
- 한 프로세스가 자신에게 주어진 시간을 다 사용하면 발생
- 인터럽트가 걸렸을 때
- 경계 레지스터를 벗어난 경우(자신에게 주어진 메모리 공간을 넘어가는 경우)
- 현재 실행 중인 PCB저장 후, 인터럽트 프로세스를 실행 상태로 만듦
- 인터럽트 프로세스 : 프로세스를 강제로 종료하고 인터럽트 처리를 마침
- 이 때, context switching이 일어난다.
(경계 레지스터[Boudary Register])
- 주 기억 장치(memory)가 분할된 영역으로 나뉘어 관리될 때, 운영체제와 사용자 영역으로 나뉨
- 사용자 영역의 프로그램이 운영체제 영역을 침범하지 못하도록 하는 것.
[4. 프로세스 연산]
1. 프로세스의 구조 : 코드(code), 데이터(data), 스택(stack)
- 코드
- 프로그램 본문이 기술된 곳 + read만 가능
- 데이터 영역
- 변수나 파일 등이 각종 데이터를 모아놓은 곳 + read/write 가능
- 스택 영역
- OS가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳
- 운영체제가 사용자 프로세스를 작동하기 위해 유지하는 영역
예시) 워드프로세서 실행 시,
코드 영역 : 워드 프로세서 프로그램
데이터 영역 : 편집 문서
스택 : 작동을 위한 부가 데이터
(+ 사용자, 시스템(커널) 프로세스?)
- 사용자 프로세스 : 사용자 코드를 수행하는 프로세스
- 시스템 프로세스 : 모든 시스템 메모리와 프로세스의 명령에 엑세스할 수 있는 프로세스이다.
2. 프로세스의 생성과 복사
1. 프로세스의 프로그램 생성 과정
- 프로그램을 메모리와 가져와 코드 영역에 올리고 PCB 생성
- 메모리에 데이터 영역과 스택 영역을 확보 후, 프로세스 실행
2. fork : 새로운 프로세스를 복사하는 함수
- 부모 프로세스 : 프로세스 복사 시, 기존의 프로세스
- 자식 프로세스 : 새로 생긴 프로세스
(예시)
1. 그림판 실행 중, 프로그램을 하나 더 실행할 경우, fork() 시스템 호출을 사용하여 기존의 프로그램을 복사
2. chrome (ctrl + n) : (기존의 창 : 부모 프로세스) ↔ (새로 생긴 창 : 자식 프로세스)
2-1. fork 함수의 장점
1. 기존의 메모리를 복사하기 때문에프로세스의 생성 속도가 빠르다. 때문에 자식의 프로세스의 생성 속도가 빠르다.
2. 부모 프로세서가 사용하던 모든 자원을 추가 없이 자식 프로세스를 상속한다.
3. 시스템 관리를 효율적으로 할 수 있다.
부모와 자식 프로세스는 각가 구분자를 가지면서 연결되어 있다. 그래서 자식 프로세스를 종료하면 자식이 사용하던 자원을 부모 프로세스가 정리할 수 있다.
3. exec : 기존의 프로세스를 새로운 프로세스로 전환하는 함수.
- 기능 : 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출 (기존의 자원으로 다른 것을 만드는 것)
- 사용목적 : 프로세스의 구조체 재활용
- 프로세스를 만들기 위해서는? PCB생성 + 메모리 확보 + 종료 후 메모리 청소를 위한 부모-자식 관계 필요
- 재활용하는 편이 효율적
- 작동과정
- exec 호출 시,마치 프로세스를 처음 시작하는 것처럼 내용이 정리
- 코드 영역: 기존 내용을 새로운 코드로 변경
- 데이터 영역 : 새로운 변수로 채워짐
- 스택 영역 : 리셋
[4.프로세스 계층 구조]
1. 유닉스의 프로세스 계층 구조
- 커널이 처음 메모리에 올라와 부팅 시, 커널 관련 프로세스를 여러 개 만든다.
- 프로세스를 효율적으로 관리하기 위해, init프로세스 생성 후, init프로세스의 자식을 트리형태로 나머지 프로세스를 만듦.
- 이 때, fork()와 exec() 시스템 호출을 이용해서 자식 프로세스를 만든다.
2. 계층 구조의 장점
1. 여러 작업을 처리.
- login : 인증 시, 컴퓨터 접속하는 과정 처리(by.fork)
- 여러 사용자를 동시에 처리하기 위해 fork() 시스템 호출로 login 프로세스를 여러 개 만듦
- 새로운 사용자가 들어올 때마다 fork()를 처리하면 동시에 여러 사용자를 동시 처리할 수 있다.
- shell : 사용자가 운영체제에 명령을 내리고 결과를 받는 과정(by.exec)
- 이전의 login 프로세스의 메모리 공간과 PCB 제거
- 이후, shell 프로세스의 메모리 공간이 확보되고 PCB 생성
2. 용이한 자원 회수.
- 장점 : 프로세스 간의 책임관계가 명확해져서 시스템 관리가 수월
- 독립적으로 관리할 경우, 운영체제가 직접 자원을 회수해야 해서 작업이 복잡.
- 부모자식 관계로 만들면 자식 프로세스가 작업을 마친 후, 사용하던 자원을 부모 프로세스가 회수하면 됨.
3. 미아 프로세스 : 프로세스가 비정상적으로 남아 있는 프로세스
원인
- 부모가 먼저 종료 혹은 자식 프로세스가 비정상 종료로 인해 부모 프로세스에 연락이 안되는 경우.
- 이런 문제가 발생하면 자식이 종료되지 않거나, 종료되도 사용하던 자원이 그대로 남는 경우 발생.
- exit(), return() : 자식 프로세스가 작업 완료됨을 부모 프로세스에 알리는 것.
'CS' 카테고리의 다른 글
쓰레드(Thread) (0) | 2021.01.24 |
---|