프로세스
- 프로그램이 실행되기전은 보조기억장치에 저장된 데이터일 뿐임
- 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행 프로그램이 실행 된후(= "프로세스를 실행한다") → 프로세스
- 포그라운드 프로세스(Foreground process) : 포그라운드 프로세스
- 백그라운 프로세스(Background process) : 사용자가 보지못하는 뒤편에서 실행되는 프로세스
- 서비스(윈도우), 데몬(유닉스) : 사용자와 상호작용하지 않고 수행하는 백그라운드 프로세스
파본이라니!! 구입한지 일년이 넘은 책인데!!😱
https://velog.io/@study_record/혼공컴운번외파본교환-후기
프로세스 제어 블록 (PCB: Process Control Block)
- 프로세스 실행순서를 관리하고 CPU자원을 배분해주는것
- 프로세스와 관련된 정보를 저장하는 자료구조
- 커널 영역에 생성됨
- 프로세서 생성시 만들어지고 실행이 끝나면 폐기됨
- 새로운 프로세스가 생생되었다 = 운영체제가 PCB를 생성했다
프로세스가 종료되었다 = 운영제체가 해당 PCB를 폐기했다
- PCB에 담겨있는 정보
- 프로세스 ID(PID)
- 레지스터 값
- 프로세스 상태
- CPU 스케쥴링 정보
- 메모리 관리 정보
- 사용한 파일과 입출력장치 목록
- 프로세스 ID(PID)
- 특정 프로세스를 식별하기 위해 부여하는 고유번호
- 같은 프로그램이어도 두번 실행하면 PID가 다름
- 레지스터 값
- 해당 프로세스가 실행하며 사용한 레지스터 값이있음
- 프로세스 상태
- CPU 스케쥴링 정보
- 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
- 메모리 관리 정보
- 프로세스가 어느주소에 저장되어 있는지에 대한 정보가 있어야 함
- 베이스 레지스터, 한계 레지스터 값, 테이블정보
- 사용한 파일과 입출력장치 목록
문맥교환
- 문맥(context) : 프로세스 수행을 다시하기 위해 기억해야할 정보
- 프로세스의 문맥은 프로세스의 PCB에 기록되어 있음
- 문맥교환 : 기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로 부터 복구하여 새로운 프로세스를 실행하는 과정
- 문맥교교환을 자주하면 오버헤드가 발생함
프로세스의 메모리 영역
- 코드 영역(텍스트 영역)
- 기계어로 이루어진 명령어가 저장됨
- CPU가 실행할 명령어가 담겨 있음 → 쓰기 금지 → 읽기 전용 공간
- 데이터 영역
- 잠깐 쓰는 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- 대표적으로 전역변수 데이터가 저장됨
- 힙 영역
- 프로그래머가 직접 할당 할수 있는 저장 공간
- 메모리공간을 할당받으면 반환도 해줘야 함
- 메모리 누수 : 메모리 공간을 반환하지않고 할당한 공간을 메모리내에 남겨서 낭비하고 있는 문제
- 메모리의 낮은주소에서 높은 주소로 할당 됨
- 스택 영역
- 데이터를 일시적으로 저장하는 공간
- 잠시 쓰는 말의 값이 저장됨
- 대표적으로 매개변수, 지역변수가 저장됨
- 저장할떄는 PUSH, 이동할때는 POP
- 메모리의 높은영역에서 낮은 주소로 할당 됨
- 코드 영역, 데이터 영역 → 크기가 고정된 영역 → 정적 할당 영역
- 힙 영역, 스택 영역 → 실시간으로 크기가 변할 수 있는 영역 → 동적 할당 영역
타이머 인터럽트(타임아웃 인터럽트) : 클럭신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트
프로세스상태
- 프로세스의 대표적인 상태
- 생성 상태
- 준비 상태
- 실행 상태
- 대기 상태
- 종료 상태
- 생성 상태
- 프로세서를 생성중인 상태
- 메모리에 적재되어 PCB를 할수 있는 상태
- 준비상태
- 바로 CPU를 할당받아 실행이가능하지만 순서가 아니어서 기다리는 상태
- 티스패치 : 준비상태에서 실행상태로 전환되는것
- 실행상태
- CPU를 할당받아 실행중인 상태
- 할당된 시간동안만 CPU를 사용할수 있음
- 할당된 시간을 다 사용하면(타이머 인터트럽이 발생) 준비상태가 됨
- 실행도중 입출력장치를 사용하여 입출력장치의 작업이 끝날때 까지 기다림
- 대기 상태
- 입출력장치의 작업을 기다리는 상태
- 프로세스 실행도중 입출력장치를 사용 → 입출력 작업 프로세스는 입출력이 끝날때 까지 대기 → 입출력 작업이 완료되면 프로세스는 준비상태로 감
- 종료 상태
- 프로세스가 종료된 상태
- 운영체제는 PCB와 프로세스가 사용한 메모리를 정리함
- 프로세스 상태 다이어그램
프로세스 계층 구조
- 프로세스는 실행도중 시스템호출을 통해서 다른 프로세스를 생성할 수 있음
- 부모프로세스 : 새 프로세스를 생성한 프로세스
- 자식프로세스 : 부모스포세스에 의해서 새로생성된 프로세스
- 자식프로세스와 부모프로세스는 다른 PID를 가짐
- 일부운영체제의 경우 자식프로세스 PCB에 PPID(부모 프로세스 PID:Parent PID)가 기록됨
- 프로세스 계층 구조 : 자식프로세는 또 다른 자식프로세스생성이 가능하여 트리구조가 가능함
- 최초의 프로세스
- PID가 항상 1번이고 모든프로세스의 최상단에 있는 부모프로세스
- 유닉스 init, 리눅스 systemd, 맥 launchd
프로세스 생성 기법
-
fork, exex → 시스템 호출
-
fork : 프로세스가 자신의 프로세스 복사본을 만드는 시스템 호출
-
fork된 자식프로세스 | 복사되는것 | 안되는것 |
---|
자식프로세스 | 부모프로세스의 자원(메모리 내용, 열린파일목록 등) 상속 | PIV값, 저장된 메모리 위치는 다름 |
-
exec : 자신의 메모리공간을 새로운 프로그램으로 전환하여 실행하는 시스템 호출
-
exec된 자식프로세스 | 코드영역, 데이터영역 | 나머지 영역(힙,스택영역) |
---|
자식프로세스 | 실행할 프로그램 내용으로 변경 | 초기화 |
-
프로세스 계층구조는 fork와 exce가 반복되는 과정
스레드
- 스레드 : 프로세스를 구성하는 실행단위
- 단일 스레드 프로세스 : 하나의 실행 흐름을 가지고 있는 프로세스
→ 스레드 개념이 생기면서 프로세스가 여러가지 일을 동시에 처리할 수 있게 됨
- 스레드 구성 : 스레드ID, 프로그램 카운터 값, 스택
→ 각 스레드마다 값이 다르기 때문에 각자의 다른 코드 실행이 가능하다
- 스레드는 실행에 필요한 최소한의 정보로만 가지고 프로세스자원을 공유하면서 실행된다
- 최소한의 정보 : 프로그램 카운터를 포함한 레지스터, 스택
- 리눅수 운영체제는 프로세스와 스레드를 명확히 구분하지 않는다
* 프로세스, 스레드를 태스크로 부름
멀티프로세스와 멀티스레드
- 멀티프로세스 : 여러 프로세스를 동시에 실행하는 것
- 멀티스레드 : 여러 스레드로 프로세스를 동시에 실행하는 것
- 같은 작업의 프로세스가 여러개 vs 하나의 프로세스에 여러개 스레드
멀티 프로세스 | 멀티 스레드 |
---|
자원(코드 영역, 데이터 영역, 힙 영역 등)이 복제되어 메모리 각각 적재됨 → 메모리 낭비 | 스레드는 서로 다른 스레드ID, 프로그램 카운터, 스택을 가지고 있음 |
프로세스의 메모리주소를 이외의 나머지는 모두 같음 → 같은 프로그램 여러개가 메모리 적재 | |
프로세스 자원(코드, 데이터, 힙 영역과 파일 등)을 공유하지 않음 | 프로세스 자원(코드, 데이터, 힙영역과 파일 등)을 공유함 → 메모리를 효율적으로 사용가능 |
프로세스들은 개별적으로 따로 실행됨 | 프로세스를 공유의 장점은 협력, 통신에 유리함 |
| 프로세스 공유의 단점은 하나의 스레에서 문제가 생기면 다른 스레드에도 영향을 줌 |
프로세스 간 통신(IPC, Inter-Process Communcation)
- 기본적으로 프로세스간 자원은 공유하지 않는다
- 프로세스 간 통신 : 프로세스끼리 자원을 공유하고 데이터를 주고받는 것
- 공유메모리 : 프로세스들이 공유하는 메모리영역. 데이터를 주고 받음
파이썬으로 프로세스 확인하기
파이썬으로 스레드 확인하기
📚마무리 문제
P.293
1번 프로세스 설명으로 틀린것은? (4)번
1) 실행되는 프로그램을 프로세스라고 한다
2) 프로세스가 생성되면 커널 영역에 PCB가 생성된다
3) 프로세스들은 문맥교환을 통해 번갈아가면 수행된다
4) 프로세스는 반드시 사용자와 상호작용 할수 있어야 한다
2번 문맥교환 설명중 틀린것은? (1)번
1) 문맥교환은 빠르게 수행될수록 좋다
2) 문맥교환 과정에서 직전에 수행되던 프로세스의 문맥이 백업된다
3) 문맥교환 과정에서 다음에 수행할 프로세스의 문맥이 복구된다
4) 문맥은 PCB에 기록된다
P.304-305
1번 1~5번을 채워라 📌기본 미션
(1) 생성 상태
(2) 준비 상태
(3) 실행 상태
(4) 종료 상태
(5) 대기 상태
2번 최초프로세스가 로그인 프로세스를 생성, 로그인프로세는 bash프로세스, bash프로세는 Vim프로세스를 생성했다
- bash프로세스의 부모프로세스는? (1) 로그인 프로세스
- bash프로세스의 자식 프로세스는? (2) Vim 프로세스
- Vim프로세스의 부모 프로세는? (3) bash 프로세스
3번 fork와 exec에 틀린 설명은? (1)번
1) fork 시스템 호출을 하면 새로운 폴더가 생성된다
2) fork 시스템 호출을 하면 부모 프로세스 복제본이 자식프로세스로서 생성된다
3) exec 시스템 호출을 하면 프로세스의 메모리 공간이 다른 프로세스의 내용으로 변경된다
4) 많은 운영체제는 fork와 exec을 통해 프로세스 계층구조를 형성한다
4번 프로세스 상태에 대한 설명중 옳은것은? (4)번
1) 생성상태는 프로세스가 입출력 장치의 작업을 기다리는 상태이다 대기상태
2) 실행상태는 프로세스가 종료되는 상태이다 종료상태
3) 종료상태는 프로세스가 이제 막 생성된 상태이다 셍상상태
4) 준비상태는 CPU를 할당받기를 기다리고 있는 상태
P.313
1번 스레드의 설명으로 틀린것은? (2)번
1) 스레드는 프로세스 내의 실행의 흐름 단위
2) 프로세스 내의 스레드들은 각기 다른 코드/데이터/힙 영역을 가지고 있다
3) 프로세스 내의 스레드들은 각긱 다른 프로그램 카운터를 가지고 있다
4) 프로세스 내의 스레드들은 각기 다른 스택을 가지고 있다
2번
프로세스끼리는 기본적으로 자원을(공유하지 않지만, 공유하지만), 프로세스내의 스레드끼리는 같은 프로세스 내의 자원을 (공유하지 않습니다, 공유합니다).