일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이썬
- 파이썬 코딩테스트
- 비디오 스트리밍
- 자바스크립트
- 코딩테스트
- 웹크롤링
- Next.js
- Server Side Rendering
- 네이버 부스트캠프
- 파이썬 웹크롤링
- React.js
- 자바스크립트 객체
- git checkout
- beautifulsoup
- 네이버 부스트캠프 멤버십
- Image 컴포넌트
- 스택
- 부스트캠프
- react
- 씨쁠쁠
- 네이버 부캠
- React ssr
- 프로그래머스
- 브라우저 동작
- Next/Image 캐싱
- 자바스크립트 컴파일
- c++
- PubSub 패턴
- 자바 프로젝트
- 멘션 추천 기능
- Today
- Total
코린이의 개발 일지
[운영체제] 프로세스와 스레드 본문
프로세스와 프로세스 상태, 프로세스 계층 구조, 스레드에 대해 살펴보자
1. 프로세스 개요
- 포그라운드 프로세스 (foreground progress) : 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스 (background progress) : 사용자가 보지 못하는 뒷편에서 실행되는 프로세스
- 사용자와 직접 상호작용 가능한 프로세스
- 사용자와 상호작용하지 않고 정해진 일만 하는 프로세스
- 유닉스 운영체제: 데몬(daemon)
- 윈도위 운영체제: 서비스(service)
PCB (Process Control Block)
- 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고 프로세스에 CPU를 비롯한 자원을 배분한다.
- 이를 위해 운영체제는 PCB를 이용한다.
- PCB는 프로세스와 관련된 정보를 저장하는 자료구조이다.
- PCB는 메모리 영역 중, 커널 영역에 생성된다.
- PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다.
PCB에 담기는 정보
프로세스 ID
- Process ID(PID)는 특정 프로세스를 식별하기 위해 부여하는 고유 번호
레지스터 값
- 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값
프로세스 상태
- 현재 프로세스의 상태
- 현재 프로세스가 입출력장치를 사용하기 위해 기다리고 있는 상태인지, CPU사용을 기다리고 있는 상태인지 등등..
CPU 스케줄링 정보
- 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록된다.
메모리 관리 정보
- 프로세스마다 메모리에 저장된 위치가 다르기 때문에, 프로세스가 어느 주소에 저장되어 있는지에 대한 정보를 가지고 있다.
- 베이스 레지스터, 한계 레지스터 값과 같은 정보들이 담긴다.
- 페이지 테이블 정보도 PCB에 담긴다.
사용한 파일과 입출력 장치 목록
- 프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시된다.
- 즉 어떤 입출력 장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들이 PCB에 기록된다.
Context Switching
하나의 프로세스에서 다른 프로세스로 실행 순서가 넘어가기 위해 이전에 실행되던 프로세스에 대한 정보를 백업해야한다.
이러한 중간 정보, 즉 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 Context라고 한다. 하나의 프로세스 context는 해당 프로세스의 PCB에 기록되어 있다.
따라서 context switching이 동작하는 순서는 다음과 같다
- 인터럽트 발생
- 현재 실행 중인 프로세스의 PCB에 context 백업
- 실행할 프로세스의 context 복구
- 새로운 프로세스 실행
프로세스 메모리 영역
프로세스가 생성되면 메모리 영역 중, 커널 영역에 PCB가 생성된다.
그렇다면 사용자 영역에는 프로세스가 어떻게 배치 될까?
하나의 프로세스는 크게 4개의 영역으로 나뉘어 사용자 영역에 저장된다.
코드 영역
- 코드영역은 텍스트 영역이라고도 부른다.
- 실행할 수 있는 코드가 저장된다 (기계어로 이루어진 명령어)
- 코드 영역에는 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기 때문에 쓰기가 금지되어 있다.
- 읽기 전용
데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- 전역변수가 대표적이다.
- 코드 영역과 데이터 영역은 그 크기가 변하지 않아 정적 할당 영역이라 부른다.
힙 영역
- 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간
- 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 한다.
- 메모리 공간을 반환한다는 의미는 ‘더 이상 해당 메모리 공간을 사용하지 않겠다.’라고 운영체제에 말하는 것과 같다.
- 반환하지 않으면 메모리 누수가 발생한다.
스택 영역
- 데이터를 일시적으로 저장하는 공간
- 데이터 영역에 담기는 값과는 달리 쓰다가 말 값들을 저장
- 함수에서 사용하는 매개변수, 지역변수등이 이에 해당
- 힙과 스택 영역은 동적 할당 영역이라 부른다.
2. 프로세스 상태와 계층 구조
프로세스 상태
생성 상태
- 프로세스를 생성중인 상태
- 이제 막 메모리에 적재되어 PCB를 할당받은 상태
- 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 곧바로 실행되지 않고 준비 상태가 되어 CPU 할당을 기다린다.
준비 상태
- 실행할 준비가 완료되었으나 아직 자신의 차례가 아니라서 기다리고 있는 상태
- 준비 상태의 프로세스가 실행 상태로 전환되는 것을 디스패치라고 한다.
실행 상태
- CPU를 할당받아 실행 중인 상태
- 실행 중인 프로세스는 할당된 일정 시간 동안만 CPU를 사용할 수 있다.
- 이때 프로세스가 할당된 시간을 모두 사용한다면 (타이머 인터럽트가 발생하면) 다시 준비 상태가 된다.
- 실행 도중 입출력장치를 사용하여 입출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.
대기 상태
- 프로세스는 실행도중 입출력 장치를 사용하는 경우가 있다.
- 이런 경우 입출력을 끝날때(입출력 완료 인터럽트를 받을 때까지)까지 기다려야하는데, 이렇게 입출력 장치의 작업을 기다리는 상태를 대기 상태(blocked)라고 한다.
종료 상태
- 프로세스가 종료된 상태이다.
- 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
프로세스 계층 구조
프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.
이때 새 프로세스를 생성한 프로세스를 부모 프로세스
부모 프로세스에 의해 생성된 프로세스를 자식 프로세스 라고 한다.
부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이기에 각기 다른 PID를 가진다.
일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID가 기록되기도 한다.
최초의 프로세스
- 유닉스에서는 init, 리눅스에서는 systemd, macOS에서는 launchd라고 한다.
- 최초의 프로세스 PID는 항상 1번이며 모든 프로세스 최상단에 있는 부모 프로세스이다.
프로세스 생성 기법
부모 프로세스는 fork 를 통해 자신의 복사본을 자식 프로세스로 생성해내고, 만들어진 복사본(자식 프로세스)은 exec 를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.
fork와 exec은 모두 시스템 호출이다.
fork
- 자기 자신 프로세스의 복사본을 만드는 시스템 호출
- 자식 프로세스는 부모 프로세스의 복사본이기 때문에, 부모 프로세스의 자원들, 이를 테면 메모리 내의 내용, 열린 파일의 목록 등이 자식 프로세스에 상속된다.
- 이때 복사된 자식 프로세스라 할지라도 PID값이나 저장된 메모리 위치는 다르다.
exec
- 자신의 메모리 공간을 새로운 프로그램을 덮어쓰는 시스템 호출.
- 새로운 프로그램 내용으로 전환하여 실행한다.
- exec을 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화된다.
예시
bash 셸에서 ls라는 명령어를 쳤을 때,
- 셸 프로세스는 fork를 통해 자신과 동일한 프로세스 생성
- 생성된 복제 프로세스는 exec을 통해 ls 명령어를 실행하기 위한 프로세스로 전환되어 실행
- 셸의 복사본으로 탄생한 자식 프로세스는 ls 명령어를 실행하기 위한 프로세스로 바뀌고, 메모리 공간에는 ls를 실행하기 위한 내용들이 채워진다.
3. 스레드
- 스레드란, 프로세스를 구성하는 실행의 흐름 단위이다.
- 단일 스레드 프로세스에서는 한번에 하나의 일만 처리한다.
- 멀티 스레드 프로세스에서는 하나의 프로세스가 한번에 여러 일을 동시에 처리할 수 있다.
- 스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다.
- 스레드는 프로세스 자원을 공유한채 실행에 필요한 최소한의 정보만으로 실행된다.
- 즉 프로세스가 실행되는 프로그램이라면, 스레드는 프로세스를 구성하는 실행의 흐름 단위이다.
멀티 프로세스와 멀티 스레드
- 멀티 프로세스 (multi process): 여러 프로세스를 동시에 실행하는 것
- 멀티 스레드 (multi thread): 여러 스레드로 프로세스를 동시에 실행하는 것
멀티 프로세스와 멀티 스레드의 차이점
프로세스끼리는 기본적으로 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내의 자원을 공유한다는 점이다.
프로세스를 fork하여 같은 작업을 하는 동일한 프로세스 두개를 동시에 실행하면 코드 영역, 데이터 영역, 힙 영역 등을 비롯한 모든 자원이 복제되어 메모리에 적재된다.
이는 어찌보면 메모리 낭비이다. 같은 프로그램을 실행하기 위해 메모리에 동일한 내용들이 중복해서 존재하기 때문
반면 스레드들은 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 갖고 그 외에 프로세스가 가지고 있는 자원을 공유한다.
멀티 스레드의 장점
이 때문에 멀티 프로세스로 실행하는 것보다 메모리를 더 효율적으로 사용할 수 있고
프로세스 자원을 서로 공유하기 때문에 협력과 통신에 유리하다.
멀티 스레드의 단점
멀티 프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에는 지장이 적거나 없지만,
멀티 스레드 환경에서는 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.
프로세스 간 통신
- 프로세스끼리는 기본적으로 자원을 공유하지 않지만 프로세스끼리도 충분히 자원을 공유하고 데이터를 주고받을 수 있다.
- 프로세스 간의 자원을 공유하고 데이터를 주고받는 것을 프로세스 간 통신 (IPC: Inter-Process Communication)이라고 부른다.
- 프로세스 간 통신 방식은 여러가지가 있을 수 있다.
- 파일을 통한 프로세스 간 통신: 같은 파일 속 데이터를 두개의 프로세스가 서로 주고받는 경우
- 공유 메모리를 통한 프로세스 간 통신: 서로 공유하는 메모리 영역을 두어 데이터를 주고 받을 수 있다.
- 소켓
- 파이프
'CS공부 > 운영체제 (OS)' 카테고리의 다른 글
[운영체제] 프로세스 동기화 (0) | 2023.07.06 |
---|