일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자료구조
- SSAFY 10기 화이팅
- Have a good day :)
- DFS
- BFS
- Java 환경 설정
- 코로나 싫어요
- SeongSeobDang
- 텐션 업 10기!
- SSAFY IM/A
- 텐션 업 10기 화이팅
- HAVE A GOOD DAY
- SSAFY 테스트
- 우유가 옆으로 넘어지면 아야
- 네트워크
- LeetCode #릿코드 #좋은 하루 되세요 #Have a nice day
- SSAFY 화이팅
- Have a nice day.
- 모르고리즘
- 수학
- 자고 싶다
- I am Korean
- 우유아야
- Hamming weight
- DP
- have a nice day
- amazon
- 아자아자 화이팅
- 우유가옆으로넘어지면아야
- Today
- Total
Hope Everyone Is Happy
5. 프로세스 본문
본 게시글은 책 : 면접을 위한 CS 전공지식 노트 (출판사 : 길벗, 주홍철 지음) 을 참조하여 작성하였습니다. + 구글링
◆ 프로세스와 스레드 ( Process and Thread )
- 프로세스
: 컴퓨터에서 실행되고 있는 프로그램 ( CPU 스케줄링의 대상이 되는 작업이라는 용어와 같은 의미 )
: 프로그램이 메모리에 올라가 인스턴스화 된 것
ex) 크롬 프로그램을 실행하면 크롬이 메모리에 올라와 인스턴스화 되어 크롬 프로세스로 변환
: 인스턴스화 후 운영체제의 CPU 스케줄러에 따라 CPU가 프로세스를 실행
- 스레드
: 프로세스 내에서 실행되는 여러 흐름의 단위
: 프로세스의 특정한 수행 경로
- 컴파일 과정
: 프로그램을 만드는 과정은 만드는 언어마다 다를 수 있음
: C언어를 예시로 들면, 컴파일러가 컴파일 과정을 통해 컴퓨터가 이해할 수 있는 기계어로 번역하여 실행할 수 있는 파일 작성
: 전처리 => 소스 코드의 주석을 제거하고 #include (java 에선 import!) 등 헤더 파일을 병합하여 매크로를 치환
: 컴파일러 => 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환
: 어셈블러 => 어셈블리어는 목적 코드 (object code)로 변환
이 때, 확장자는 운영체제 마다 다르게 생성 (ex - 리눅스는 .c->.o로 변환)
: 링커 => 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합, 실행 파일 생성 (.exe 등)
- 라이브러리
: 라이브러리는 정적 라이브러리와 동적 라이브러리로 분류
: 정적 라이브러리는 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
=> 시스템 환경 등의 외부 의존도가 낮지만 코드 중복 등 메모리 효울성이 떨어짐
: 동적 라이브러리는 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하여 라이브러리를 사용
=> 메모리 효율성에서의 장점을 지니지만 외부 의존도가 높음
◆ 프로세스의 상태
- 프로세스의 상태는 아래 그림과 같이 여러 가지 상태 값을 가짐
- 생성 상태 (Create)
: 프로세스가 생성된 상태를 의미 fork() or exec() 함수를 통해 생성 => 이 때 PCB가 할당
: fork => 부모 프로세스의 주소 공간을 그대로 복사, 새로운 자식 프로세스를 생성
=> 주소 공간만 복사하고 부모 프로세스의 비동기 작업 등을 상속하지 않음
: exec => 새롭게 프로세스를 생성하는 함수
- 대기 상태 (ready)
: 메모리 공간이 충분하면 메모리를 할당 받고 아니면 아닌 상태로 대ㄱ
: CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태
- 대기 중단 상태 (ready suspended)
: 메모리 부족으로 임시 중단된 상태
- 실행 상태 (running)
: CPU 소유권과 메모리를 할당 받고 인스트럭션을 수행 중인 상태를 의미 ( CPU burst로도 표현 )
- 중단 상태 (blocked)
: 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
: I/O 디바이스에 의한 인터럽트로 이런 현상이 많이 발생 ( ex. 인쇄 버튼 시 정지 현상 등)
: C++은 해시 테이블을 unordered_map 으로 구현, 이중 연결리스트는 list로 구현
- 일시 중단 상태 (blocked suspended)
: 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태
- 종료 상태 (terminated)
: 메모리와 CPU 소유권을 모두 놓고 가는 상태
: 부모 프로세스가 자식 프로세스를 강제시키는 비자발적 종료(abort) 존재
: 자식 프로세스에 할당된 자원의 한계치를 넘어서거나 부모 프로세스가 종료 등으로 프로세스를 종료할 때 발생
◆ 프로세스의 메모리 구조
- 운영체제는 프로세스에 적절한 메모리를 할당하는데 다음 구조를 기반으로 할당
- 위에서 부터 스택, 힙, 데이터 영역(BSS segment, Data segment), 코드 영역으로 분류
- 스택과 힙
: 스택과 힙은 동적 할당이 되며, 동적 할당은 런타임 단계에서 메모리를 할당 받는 것
: 지역 변수, 매개변수, 실행되는 함수에 의해 늘어들거나 줄어드는 메모리 영역
: 함수가 호출될 때마다 호출될 때의 환경 등 특정 정보가 스택에 계속해서 저장
: 힙은 동적으로 할당되는 변수를 저장
: malloc, free 함수를 통해 관리 가능하며 동적으로 관리되는 자료 구조의 경우 힙 영역 사용
- 데이터 영역과 코드 영역
: 정적 할당 되는 영역으로 컴파일 단계에서 메모리를 할당하는 것
: BSS segment와 Data segment, code/text segment로 나뉘어서 저장
: BSS segment는 전역 변수 or static, const , 0으로 초기화 or 초기화가 되지 않은 변수들이 이 메모리 영역에 할당
: code segment는 프로그램의 코드가 할당
◆ PCB (Process Control Block)
- PCB는 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터
- 메타데이터
: 데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터
: 대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 사용
: 일정한 규칙에 따라 콘텐츠에 부여되는 데이터
- 프로세스 제어 블록 이라고도 불리며 프로세스가 생성되면 운영체제는 해당 PCB를 생성
- 프로그램이 실행되면 프로세스가 생성되고 프로세스 주소 값들에 스택, 힙 등의 구조를 기반으로 메모리 생성
- 프로세스의 중요한 정보를 포함하고 있기 때문에 일반 사용자가 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리
- PCB의 구조
: PCB는 프로세스 스케줄링 상태 ,프로세스 ID등의 다음과 같은 정보로 구성
· 프로세스 스케줄링 상태 : 준비, 일시중단 등 프로세스가 CPU에 대한 소유권을 얻은 이후의 상태
· 프로세스 ID : 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
· 프로세스 권한 : 컴퓨터 자원 or I/O 디바이스에 대한 권한 정보
· 프로그램 카운터 : 프로세스에서 실행해야 할 다음 명령어의 주소에 대한 포인터
· CPU 레지스터 : 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
· CPU 스케줄링 정보 : CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
· 계정 정보 : 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
· I/O 상태 정보 : 프로세스에 할당된 I/O 디바이스 목록
- 컨텍스트 스위칭 (context switching)
: PCB를 교환하는 과정
: 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생
: 컴퓨터는 많은 프로그램을 동시에 실행하는 것처럼 보이지만 어떠한 시점에서 실행되고 있는 프로세스는 코어당 한개
: 동시에 구동되는 것처럼 보이는 것은 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문
: 하지만 현대 컴퓨터는 멀티 코어의 CPU를 가지기 때문에 한 시점에 한 개의 프로그램만 돌지 않음
ex) 싱글 코어 기준 컨텍스트 스위칭
: 한 개의 프로세스 A가 실행 -> 중지- > A의 PCB 저장 후 프로세스 B를 로드 하여 실행
: 컨텍스트 스위칭이 일어날 때 앞의 그림처럼 유휴시간(idle time)이 발생
: 캐시미스 => 컨텍스트 스위칭 시, 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소 변환이 발생
=> 캐시클리어 과정 발생 => 캐시미스 발생
: 스레드에서 컨텍스트 스위칭 발생 시 스레드는 스택 영역을 제외한 모든 메모리를 공유
=> 비용과 시간이 더 적게 소요
◆ 멀티프로세싱
- 멀티 프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것
- 이를 통해 하나 이상의 일을 병렬로 처리 가능
- 특정 프로세스의 메모리 혹은 프로세스 일부에 문제가 발생되더라도 다른 프로세스로 처리 가능
- 웹 브라우저 : 멀티프로세스 구조
: 브라우저 프로세스 => 주소 표시줄, 북마크 막대, 뒤로가기 버튼, 앞으로 가기 버튼 등을 담당하여 네트워크 요청이나 파일 접근 같은 권한을 담당
: 렌더러 프로세스 : 웹 사이트가 보이는 부분의 모든 것을 제어
: 플러그인 프로세스 : 웹 사이트에서 사용하는 플러그인을 제어
: GPU 프로세스 : GPU를 이용해서 화면을 그리는 부분을 제어
- IPC ( Inter Process Communication )
: 멀티프로세스는 IPC (Inter Process Communication)가 가능
: 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘
: 예시 - 클라이언트는 데이터를 요청하고 서버는 클라이언트 요청에 응답
: 종류는 공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메시지 큐 존재
: 모두 메모리가 완전히 공유되는 스레드보다는 속도가 떨어짐
- 공유 메모리 (Shared Memory)
: 여러 프로세스가 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신
: 기본적으로는 각 프로세스의 메모리를 다른 프로세스가 접근 불가
: 공유 메모리를 통해 여러 프로세스가 하나의 메모리를 공유
: IPC 방식 중 어떠한 매개체를 통해 데이터를 주고 받는 것이 아닌 메모리 자체를 공유
: 불필요한 데이터 복사의 오버헤드등이 발생하지 않아 가장 빠르며 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화 필요
- 파일 : 디스크에 저장된 데이터 or 파일 서버에서 제공한 데이터로 이를 기반으로 프로세스끼리 통신
- 소켓 : 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터
=> TCP, UDP등 존재
- 익명 파이프 (unamed pipe)
: 프로세스간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고 받음
: 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식
: 부모, 자식 프로세스 사이에만 사용 가능하며 다른 네트워크 상에서는 사용이 불가
- 명명된 파이프 (named pipe)
: 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 or 양방향 파이프
: 클라이언트/서버 통신을 위한 별도의 파이프를 제공
: 여러 파이프를 동시에 사용 가능
: 컴퓨터의 프로세스 끼리 or 다른 네트워크상의 컴퓨터와도 통신 가능
: 아래 그림처럼 보통 서버용 파이프와 클라이언트용 파이프로 구분해서 작동
- 메시지 큐
: 메시지를 큐데이터 구조 형태로 관리
: 커널에서 전역변수 형태 등으로 전역적으로 관리되며 다른 IPC 방식에 비해서 사용방법이 매우 직관적이며 간단
: 다른 코드의 수정 없이 단지 몇 줄의 코드를 추가시켜 간단하게 메시지 큐에 접근할 수 있는 장점
ex) 공유 메모리를 통해 IPC를 구현할 때 쓰기 및 읽기 빈도가 높은 경우, 동기화 때문에 기능 구현이 복잡
=> 대안으로 메시지 큐 사용
◆ 스레드와 멀티스레딩
- 스레드
: 프로세스의 실행 가능한 가장 작은 단위, 프로세스는 여러 스레드를 가짐
: 코드, 데이터, 스택, 힙을 각각 생성하는 프로세스와 달리 스레드는 코드, 데이터, 힙을 서로 공유
- 멀티 스레딩
: 프로세스 내 작업을 여러 개의 스레드, 멀티 스레드로 처리하는 기법
: 스레드끼리 서로 자원을 공유하기 때문에 효율성 보장
ex) 웹 요청을 처리할 때 새 프로세스 생성 대신 스레드를 사용하는 웹 서버의 경우 훨씬 적은 리소스를 소비
: 한 스레드가 중단되어도 다른 스레드는 실행 상태일 수 있기 때문에 중단되지 않은 빠른 처리가 가능
: 동시성에도 큰 장점
=> 서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것
: 하지만 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 프로세스에 영향을 줄 수 있는 단점 존재
ex) 멀티스레드의 예시, 웹 브라우저의 렌더러 프로세스
=> 이 프로세스 내에는 메인 스레드, 워커 스레드, 컴포지터 스레드, 레스터 스레드가 존재
위의 글과 관련하여 추가적인 내용이나 피드백은 언제나 환영입니다 :)
'※ CS 스터디 > 운영체제' 카테고리의 다른 글
7. CPU 스케줄링 (0) | 2023.11.07 |
---|---|
6. 스레드 (0) | 2023.11.06 |
4. 메모리 관리 (0) | 2023.09.13 |
3. 메모리 계층 (0) | 2023.09.12 |
2. 컴퓨터의 요소 (0) | 2023.09.10 |