반응형
프로그램 vs 프로세스 vs 스레드
프로그램
- 어떤 작업을 위해 실행할 수 있는 파일
- 메모리에 올라가지 않은 Windows의 *.exe 같은 정적 파일
(메모리에 올라가다: 실행을 하려면 OS가 독립적인 메모리 공간을 할당해줘야 함)
프로세스
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
- OS로부터 시스템 자원을 할당 받는 작업의 단위
스레드
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로
- 프로세스 내에 여러개 존재할 수 있으며 Code, Data, Heap 영역은 공유하고 Stack은 각자 할당 받음
- 실행 중 오류 발생 시 다른 스레드까지 강제 종료될 수 있음
🔻 데이터 영역
더보기
- 코드: 현재 프로세스에서 실행 중인 프로그램의 바이너리 코드
- 데이터: 전역 변수, 상수 등
- 힙: 런타임에 할당할 메모리 영역
- 스택: 지역 함수, 변수처럼 현재 실행 중인 컨텍스트와 관련된 정보
멀티 프로세스 vs 멀티 스레드
멀티 프로세스
- 하나의 응용 프로그램을 여러 프로세스로 구성해 각 프로세스가 하나의 작업을 처리하도록 하는 것
- 여러 자식 프로세스 중 하나가 문제 발생 시 해당 프로세스만 죽음. (= 서로 영향 없음)
- Context-Switching에서의 오버헤드
- 캐시 메모리 초기화 등 무거운 작업이 진행되어 많은 시간이 소모
- 프로세스 사이에 공유된 메모리가 없음
(= Context Switching 발생 시 캐시의 모든 데이터를 리셋하고 정보를 불러와야 함)
- 프로세스 간 복잡한 통신 기법 필요 (IPC; Inter-Process Communication)
🔻 Context-Switching이란?
더보기
: 현재 진행중인 프로세스의 상태를 저장하고 다음 진행할 프로세스의 상태 값을 읽어 적용하는 과정
➕ 프로세스 상태
- new: 프로세스를 위한 PCB가 생성되었지만 메모리에는 올라가있지 않은 상태
- ready: 프로세스가 CPU를 점유하고 사용이 가능한(dispatch) 상태
- running: 프로세스가 현재 CPU를 점유해 작업을 처리 중인 상태
- waiting: running 상태인 프로세스가 입출력을 요청한 후 입출력 완료때까지 기다리는 상태
- terminated: 프로세스가 작업을 완료해 메모리 자원을 반납하고 PCB가 삭제된 상태
Context-Switcing은 인터럽트 기반으로 동작한다.
- 인터럽트 발생 시 CPU가 진행 중인 작업 중단
- 해야할 일이 정의된 인터럽트 서비스 루틴 수행
- 현재 실행 중인 Task의 Process Control Block 정보 저장
- 다음 실행할 Task의 Process Control Block 정보 읽어 Register에 적재
➕ 인터럽트란?
- CPU가 프로그램을 실행중에 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것
- 하드웨어 인터럽트: 하드웨어가 발생시킨 인터럽트
- 소프트웨어 인터럽트
- Exception: 프로그램의 오류 발생
- System Call: 프로그램이 커널 함수 호출
- 인터럽트 벡터: 인터럽트가 발생했을 때, 그 인터럽트를 처리할 수 있는 서비스 루틴들의 주소를 가지고 있는 공간
context switching 예외 케이스
- 프로세스 A 실행 중에 인터럽트나 시스템콜 호출
- 커널 모드로 수행
- 프로세스 A로 복귀
이 경우에도 CPU 수행 정보 등 context 일부를 PCB에 저장은 해야한다. 프로세스 A 실행 후 어떤 로직을 거쳐 CPU를 프로세스 B에게 넘겨주게 되어야 context switching이라고 한다.
➕ 커널 모드와 사용자 모드
- 커널 모드: OS가 CPU의 제어권 갖고 명령 수행. 특권 명령 수행 가능
- 사용자 모드: 일반 사용자 프로그램이 CPU 제어권 갖고 명령 수행. 일반 명령만 수행 가능
➕ 특권 명령이란?
- 일반 명령: 메모든 프로그램이 수행할 수 있는 명령
- 특권 명령: 보안이 필요한 명령 (ex: 입출력 장치, 타이머 장치 접근 명령 등)
🔻 PCB란?
더보기
- = Process Controler Block
- 멀티 태스킹에서 커널이 각 프로세스의 정보를 저장하고 관리하기 위해 사용
(스레드의 정보를 저장하는건 Thread Control Block으로 PCB에 저장됨) - 커널의 데이터 영역에 저장됨
- PCB의 레지스터에 프로그램 카운터 저장
(프로그램 카운터: Context Switching이 일어날 때 현재까지 실행된 코드와 다음으로 실행할 코드 주소)
저장되는 정보 (구조체로 유지)
- OS가 관리상 사용하는 정보
- 프로세스 상태, ID
- 스케줄링 정보, 우선순위
- CPU 수행 관련 하드웨어 값
- Program counter, registers
- 메모리 관련
- Code, Data, Stack 위치 정보
- 파일 관련
- Open file descriptors
멀티 스레드
- Context-Switching 시 공유하는 메모리 만큼 메모리 자원을 아낄 수 있음
- 스레드는 Stack 영역을 제외한 모든 메모리를 공유해 통신의 부담이 적음 -> 응답 시간 ↓
- 한 스레드가 프로세스 내 자원 망치면 모든 프로세스가 종료되어야 함
- 자원 공유로 인한 동기화 문제
- 각 스레드는 자신만의 실행 상태를 가질 수 있어 서로 다른 CPU에서도 동작 가능
-> 여러 CPU를 단일 회로로 통합한 멀티 코어 프로세서를 이용하면 물리적인 병렬 처리 가능
🔻 동시성과 병렬성
더보기
- 동시성: 동시 실행되는 것처럼 보임
- 병렬성: 실제로 동시에 실행
참고
반응형
'Develop > CS' 카테고리의 다른 글
[DB] group function 에러 (0) | 2022.07.03 |
---|---|
[1% 네트워크] chapter 1. 웹 브라우저가 메시지를 만든다. (0) | 2022.07.02 |
[MariaDB] 설치 방법 (+the same name already exists 에러) (0) | 2021.12.26 |
[MySQL] SQL 오류: Data truncation: Incorrect string value ... (2) | 2021.12.03 |
세션과 Redis (0) | 2021.11.29 |