일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JPA
- 산업은행청년인턴
- CS
- 해시
- 코테
- fatch
- 외래키제약조건위반
- 백준
- 산업은행it
- SpringBatch
- 스케일아웃
- findById
- 운영체제
- 컴퓨터구조
- 파이널프로젝트
- springboot
- 그래프탐색
- 임베디드타입
- 폰켓몬
- Spring JPA
- 트리셋
- 2178
- 프로젝트
- CPU스케줄링
- 트리맵
- 구현
- BFS
- DB replication
- flyway
- 프로그래머스
- Today
- Total
나 JAVA 봐라
[운영체제] 프로세스와 스레드 본문
커널 영역과 사용자 영역의 프로세스
운영체제가 적재되는 커널 영역과 사용자 프로그램이 적재되는 사용자 영역이 있다.
하나의 프로세스가 실행될 때 커널, 사용자 영역에 각각 무엇이 생성되는지 알아보자.
프로세스란 실행 중인 프로그램이다. 같은 프로그램도 여러개의 프로세스가 될 수 있다.
프로세스는 사용자와 직접 소통 하는지, 안하는지에 따라 크게 두 종류로 나뉠 수 있다.
- 프로그라운드 프로세스
- 백그라운드 프로세스
위와 같이 많은 프로세스가 메모리에 적재되어 실행되는데, 이런 것을 운영체제는 어떻게 관리할까?
=> 프로세스 제어 블록을 통해 프로세스 식별과 관리를 한다.
++ 위에서 같은 프로그램도 여러 개의 프로세스가 될 수 있다고 했는데, 그렇다면 같은 프로그램에서 생성된 여러 개의 프로세스는 PCB를 공유할까? -> 이것도 정답은 X이다. 각 프로세스마다 PCB 하나씩 가지고 있다.
프로세스 제어 블록 (PCB)
- PID (PPID) : 프로세스 ID
- 레지스터
- 스케줄링 정보 : CPU를 얼마나 자주 , 많이 할당 받는지
- 메모리 정보 : 메모리 어디에 적재되어 있는지
- 사용한 파일 정보
- 입출력장치 정보
CPU를 예로 들면, CPU 성능보다 더 많은 프로세스들이 있다. 이 때 여러 프로세스들이 돌아가면서 CPU를 사용하게 된다.
이 때 사용되는 개념이 '문맥 교환' 이다.
문맥 교환 (Context Switch)
- 문맥 (context): 실행을 재개하기 위해 기억해야 할 정보
- 문맥 교환: 여러 프로세스들이 번갈아가며 실행되는 원리
- 문맥 교환이 자주 발생한다면?
- 더 다양한 프로세스가 자주 실행되기에 여러 프로세스가 동시에 실행되는 것 처럼 보인다.
- 그러나, 문맥 교환에도 '비용' 발생하여 오히려 성능이 좋지 않을 수 있다.
- ex) 프로세스 A,B가 CPU를 번갈아가며 사용
- 이 때, CPU 내의 레지스터들은 사용하고 있는 프로세스에 관한 정보를 담고 있다.
- 만약 프로세스 A에서 B로 바뀐다면 이에 따라 '문맥 교환'이 발생한다.
프로세스가 실행되면 커널 영역에서는 PCB가 할당된다. 그리고 종료되면 PCB도 폐기된다.
그렇다면 사용자 영역에서는 어떻게 될까?
아래의 이미지와 같이 사용자 영역은 4개의 영역으로 구분된다.
사용자 영역
- 코드 영역 (텍스트 영역)
- 실행 가능한 코드;
- CPU는 기계어를 보고 실행하기 때문에, 기계어로 이루어진 명령어가 필요하다.
- Read-only 로 지정되어 있다.
- 데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터 (e.g. 전역 변수)
- BSS 영역으로 한번 더 구분 짓기도 한다.
- BSS 영역: 프로그램 실행 동안 유지할 데이터 중 초기값 없는 데이터
- 힙 영역
- 사용자(개발자)가 직접 할당 가능한 공간
- 메모리 영역을 할당 했다면 해제해야 한다.
- 직접 해제하기
- 자동으로 해제하기 (가비지 컬렉션)
- 만약 해제 안한다면 '메모리 누수'(= Memory leak) 문제가 발생한다.
- 스택 영역
- 임시로 저장되는 영역 (e.g. 매개 변수, 지역 변수)
- 힙 영역은 낮은 주소에서 높은 주소로 할당
스택 영역은 높은 주소에서 낮은 주소로 할당한다.
이는 힙, 스택 영역은 '동적' 할당 영역이기 때문에 주소 중복이 발생할 수 있어 최대한 방지하기 위함이다.
프로세스 생성과 상태
프로세스는 실행 중, 일시 중단됨, 응답 없음,.. 등의 여러 상태를 가지고 있다.
대표적인 프로세스 상태
- 생성 상태 (new)
- 준비 상태 (ready) : 리소스 (CPU) 할당 기다림
- 실행 상태 (running)
- 대기 상태 (blocked) : 입출력 작업 끝날 때까지 대기
- 종료 상태 (terminated) : PCB 반납
** 디스패치 : 리소스 할당
** 타임아웃: 할당된 리소스 사용시간 끝난 것
+ 리눅스 프로세스 상태
R: Running: 실행 상태
S: Sleeping: 대기 상태
W: Waiting: 준비 상태
S: Stopped: 종료 상태
Z: Zombie: 프로세스 종료 후 자원이 반환되었지만 커널 영역에 프로세스가 남아있는 상태
많은 운영체제(리눅스, 유닉스, MacOS)는 프로세스를 계층적인 구조로 관리한다.
이렇게 계층적 구조로 프로세스가 생성되는 원리는 fork - exec 이다.
fork-exec
fork: 복사본을 만든다.
부모 프로세스로부터 fork해서 자식 프로세스를 만들 수 있다. PID가 다른 자식 프로세스가 생성되고, 새로운 메모리 영역이 할당된다.
exec: 새로운 코드로 대체 (덮어쓰기)
스레드
스레드
- 프로세스를 구성하는 실행 흐름의 단위
- 각기 다른 스레드 ID, 프로그램 카운터, 레지스터, 스택
Q. CPU 당 PC는 1개 인데, 스레드마다 각각의 PC를 가지고 있다면 실행이 어떻게 되는것인지 그림이 안그려진다...
멀티 프로세스와 멀티스레드
동일한 작업을 수행할 때, 여러 프로세스로 실행하는 것과 여러 스레드로 실행하는 것의 차이는 무엇일까?
주된 차이점은 '자원 공유 여부' 이다.
- 멀티 프로세스
- 프로세스 간에는 기본적으로 자원을 공유하지 않는다.
- 멀티 스레드
- 프로세스의 자원을 공유한다.
- 공유하고 있는 자원에 문제가 생긴다면 모든 스레드에 영향이 생긴다.
예를 들어 웹브라우저의 탭에서 새 탭을 띄울 때, 각각의 탭을 별도의 프로세스로 만드는 경우와 별도의 스레드로 만드는 경우가 있다. 이 때, 프로세스로 만든 경우에는 탭 하나에 문제가 생겨도 해당 탭에만 문제 생기지만, 스레드로 만든 경우에는 하나의 탭에 문제가 생기면 웹브라우저 자체에 문제가 생긴다.
그렇다면 멀티 프로세스가 더 좋은가? -> 프로세스는 자원을 공유하지 않기 때문에, 더 많은 메모리가 소모된다.
그리고, '기본적으로' 자원을 공유하지 않는 것이지, 자원 공유가 가능하다.
-> 프로세스간 통신 (IPC: Inter-Process Communication)
- 공유 메모리를 통한 통신
- 파이프를 통한 통신
- 네트워크 소켓을 통한 통신
'CS > 운영체제' 카테고리의 다른 글
[운영체제] CPU 스케줄링 (1) | 2024.02.07 |
---|---|
[운영체제] 운영체제 거시적으로 보기 (1) | 2024.02.07 |