티스토리 뷰
프로세스
프로그램
- 어떤 작업을 하기 위해 해야할 일들을 순서대로 나열한 것
- 컴퓨터에서 어떤 작업을 위해 실행할 수 있는 '정적인 상태'의 파일
프로세스
- 프로그램이 실행되서 돌아가고 있는 상태, 컴퓨터에서 연속적으로 실행되고 있는 '동적인 상태'의 컴퓨터 프로그램
- 프로세스는 운영체제가 메모리 등의 필요한 자원을 할당해준 '실행중인 프로그램'
- 프로그램을 실행하면 운영체제로부터 실행에 필요한 자원을 할당받아 '프로세스'가 되는 것
프로세스 문맥
- 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규명하기 위해 필요한 정보
- 시분할 시스템 환경에서 명령을 수행하기 위해서 이전에 어디까지 명령을 수행했는지 정확한 수행 시점과 상태를 재현할 수 있는 정보가 필요하고 이 정보가 프로세스 문맥
- 프로세스 문맥은 하드웨어 문맥, 프로세스의 주소공간, 커널상의 문맥으로 나뉨
하드웨어 문맥
- CPU 수행 상태를 나타내는 것으로PC(Program Counter) 와 각종 레지스터에 저장하고 있는 값들을 말한다.
프로세스의 주소공간
- 코드, 데이터, 스택으로 구성된 프로세스만의 독자적인 주소 공간을 말한다.
커널상의 문맥
- 프로세스를 관리하기 위한 자료구조인 PCB 와 Kernel Stack을 말한다.
문맥교환(context switch)
- 한 프로세스에서 다른 프로세스로 CPU의 제어권을 넘겨주는 과정
문맥교환은 언제 발생할까?
- 시분할 시스템에서 프로세스의 CPU 점유가 끝이나면 다른 프로세스로 CPU를 넘겨주게 된다. 이때 문맥 교환이 발생한다.
문맥 교환 발생 과정
- CPU를 내어주는 프로세스의 문맥을 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 문맥을 PCB로 부터 읽어 실제 하드웨어로 복원
프로세스의 메모리 공간
- 메모리는 크게 Kernel 영역과 User 영역으로 나뉘며, Kernel 영역에는 운영체제 (OS)가 적재되고 User 영역에는 일반 프로세스가 적재된다.
Code 영역
- 사용자가 작성한 프로그램 함수들의 코드가 CPU 에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간
- 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없도록 Read Only로 되어 있음
Data 영역
- 전역 변수 또는 Static 변수 등 프로그램이 사용하는 데이터를 저장하는 공간
BSS 영역
- 초기화되지 않은 전역 변수 또는 Static 변수를 위한 공간
Stack 영역
- 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터 (지역변수, 매개변수, 리턴값)을 임시로 저장하는 영역으로 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
- 이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임이라고 한다.
Heap 영역
- 프로그래머가 필요할 때마다 사용하는 메모리 영역으로 메모리 공간이 동적으로 할당되고 해제된다.
프로세스 제어블록(PCB)
- 운영체제는 PCB에 담긴 프로세스 정보를 이용하여 프로세스를 관리하고 제어한다.
- 프로세스가 생성될 때 마다 고유의 PCB가 생성되어 메인 메모리에 유지되고, 프로세스가 완료되면 제거된다.
- PCB는 프로세스의 중요한 정보를 포함하고 있으므로 일반 사용자는 접근하지 못하는 보호된 메모리 영역에 존재한다.
PCB에는 어떤 정보가 담겨있을까?
- Process id
- Process state
- Program counter
- CPU register : CPU에서 사용한 레지스터의 값을 잃지 않기 위해 PCB에 그 값을 저장
- CPU scheduling information : 프로세스의 우선순위, 최종 실행 시간, 스케줄링 큐를 가리키는 포인터 등
- Memory management information : 레지스터, 페이지 테이블, 세그먼트 테이블의 base, limit값에 대한 정보
- Accounting informaion : CPU 사용 시간, 실제 사용된 시간, 시간 제한 등
- I/O status informaion : 프로세스에 할당된 I/O기기에 해당하는 정보
멀티 프로세스
- 두개 이상 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)을 동시에 처리하는 것이다. (병렬처리)
- 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용한다.
프로세스 수행 상태 변화 과정
1) 시작(New) 상태
- 프로세스가 시작되어 그 프로세스를 위한 각종 자료구조는 생성되었지만 아직 메모리 획득을 승인받지 못한 상태다.
2) 준비(Ready) 상태
- 프로세스가 CPU를 할당받기를 기다리는 상태다.
- 프로세스가 CPU만 보유하면 당장 명령을 실행할 수 있지만 CPU를 할당받지 못한 상태다.
- 준비 큐(ready queue)라는 자료구조에 저장된다.
3) 실행(Running) 상태
- 프로세스가 CPU를 할당받아 기계어 명령을 수행하는 상태다.
- 한 번에 하나의 프로세스만 실행 상태가 될 수 있다.
4) 대기/봉쇄(Blocked, Sleep, Wait) 상태
- CPU를 할당받더라도 당장 명령을 실행할 수 없는 프로세스의 상태다.
- 프로세스가 입출력 요청이나 이벤트 발생 등의 이유로 CPU를 반납하고 기다리는 상태다.
- 대기 큐(waiting queue)라는 자료구조에 저장된다.
5) 중지 대기/봉쇄(Suspended Blocked) 상태
- 봉쇄(Blocked) 상태에 있던 프로세스가 중기 스케줄러에 의해 스왑 아웃된 상태다.
6) 중지 준비(Suspended Ready) 상태
- 준비(Ready) 상태에 있던 프로세스가 중기 스케줄러에 의해 디스크로 스왑 아웃된 상태다.
7) 종료(terminated) 상태
- 프로세스가 수행을 완료하거나 에러 등의 이유로 중단된 상태다.
- 프로세스가 종료되었으나 운영체제가 그 프로세스와 관련된 자료구조를 완전히 정리하지 못한 상태다.
- 시스템에서 제거된다.
프로세스끼리 협력하는 방법
- 프로세스 간 협력 메커니즘을 IPC(Interprocess Communication)이라 한다. IPC에는 크게 두 가지 방법이 있다. 첫 번째는 message passing, 두 번째는 shared memory이다.
Message Passing
- message passing은 프로세스 A가 프로세스 B와 서로 메시지를 주고받으며 실행되는 것이다. 커널을 통해 메시지를 전달한다.
- message passing은 전달받을 프로세스의 이름을 명시하느냐 않느냐에 따라서 또 두 가지 방법으로 나뉜다. Direct communication으로 이름을 명시하는 방법이며 두 번째는 Indirect communication으로 명시하지 않고 mailbox 혹은 port를 통해 간접적으로 전달하는 방법
Shared Memory
- 프로세스 간의 협력을 위해 shared memory를 두어 일부 영역은 물리적으로 매핑이 되도록 겹쳐놓는다.
- 프로세스 생성 시 기본적으로 주소 공간은 서로 겹치지 않기 때문에 커널에게 shared memory를 사용하겠다는 system call을 해야 한다.
fork() 명령어에 대해 설명
- fork() 함수는 함수를 호출한 프로세스를 복사하는 기능을 한다. 이때 부모 프로세스와 자식 프로세스가 나뉘어 실행되는데, 원래 진행되던 프로세스는 부모 프로세스(parent), 복사된 프로세스를 자식 프로세스(child) 라고 한다.
- fork() 함수는 프로세스 id, 즉 pid 를 반환하게 되는데 이때 부모 프로세스에서는 자식 pid가 반환되고 자식 프로세스에서는 0이 반환된다. 만약 fork() 함수 실행이 실패하면 -1을 반환한다.
쓰레드
스레드
- 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다.
- 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 시퀀스이다.
- 하나의 프로세스는 하나 이상의 스레드를 갖고 있다.
- 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
스레드의 메모리 공간
- 쓰레드는 프로세스의 heap, static, code 영역 등을 공유한다. 각각의 프로세스가 독립적인 stack, heap, code, data 영역을 가진 반면에, 한 프로세스에 속한 쓰레드는 stack 영역을 제외한 메모리 영역은 공유한다.
스레드 제어블록(TCB)
- TCB(Thread Control Block)는 PCB보다 적은 데이터를 가지는 자료구조이다.
스레드 ID
- 스레드가 생성될 때 운영 체제에서 스레드에 할당하는 고유 식별자
스레드 상태
- 스레드가 시스템을 통해 진행됨에 따라 변경되는 스레드의 상태
CPU 정보
- 스레드가 얼마나 진행되었는지, 어떤 데이터가 사용되고 있는지 등 OS가 알아야 하는 모든 정보가 포함스레드
우선 순위
- 스레드 스케줄러가 READY 대기열에서 다음에 선택해야 하는 스레드를 결정하는 데 도움이 되는 다른 스레드에 대한 스레드의 가중치(또는 우선 순위)
PCB를 가리키는 포인터
이 스레드 생성을 트리거한 프로세스를 가리키는 포인터
이 스레드가 생성한 스레드를 가리키는 포인터
stack 포인터
- stack : 스레드가 함수 호출할때 저장하는 곳
사용자 수준 스레드와 커널 수준 스레드의 차이
커널 수준 스레드
- 커널 수준 스레드는 커널 레벨에서 생성되는 스레드이다.
- 운영체제 시스템 내에서 생성되어 동작하는 스레드로, 커널이 직접 관리한다.
사용자 수준 스레드
- 스레드를 관리하는 라이브러리로 인해 사용자 단에서 생성 및 관리되는 스레드이다.
- 커널이 따로 관리하지 않고, 커널이 이 스레드에 대해서 알지도 못한다.
멀티 스레딩 프로그래밍
- 멀티스레딩은 하나 이상의 순차적 명령어 세트(sequential set of instructions)를 동시/병렬적(concurrent/parallel)으로 실행하는 것을 말한다.
- 단일 프로세서(single processor)에서, 멀티스레딩으로 실행하는 프로그램은 마치 병렬적으로 실행되는 것 처럼 보인다. 하지만 실제로는, 한 프로세서가 스케줄링 알고리즘을 통해 문맥을 전환(switching)해가며 실행하는 것이다.
멀티 스레드 프로그래밍의 장단점
장점
- 컴퓨터 자원을 더 효율적으로 활용하고, 여러 작업 동시에 처리 가능
단점
- race condition, deadlocks, shared resources, and callbacks events 같은 문제들 발생 가능
멀티 프로세스대신 멀티 스레드를 사용하는 이유
- 새로운 프로세스를 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠르다.
- 프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능하다.
- 프로세스의 작업전환보다 스레드의 작업전환이 더 빠르다.
멀티 스레드 프로그래밍에서 주의할 점
- 하나의 스레드만 실행중일 때는 실행시간이 오히려 지연될 수 있다.
- 스레드 스케쥴링을 신경써야 한다.
Thread-Safe하다는 의미와 그렇게 설계하는 방법
- 멀티 쓰레드 프로그래밍에서, 어떤 공유 자원에 여러 쓰레드가 동시에 접근해도, 프로그램 실행에 문제가 없는 상태를 의미한다.
- Mutual exclusion (상호 배제), Atomic operation (원자 연산), Thread-local storage (쓰레드 지역 저장소), Re-entrancy (재진입성) 등의 방법이 있다.
Mutual exclusion (상호 배제)
- 공유자원에 하나의 Thread 만 접근할 수 있도록, 세마포어/뮤텍스로 락을 통제하는 방법이다.
- 일반적으로 많이 사용되는 방식이다.
Atomic operation (원자 연산)
- 공유자원에 원자적으로 접근하는 방법이다.
Thread-local storage (쓰레드 지역 저장소)
- 공유 자원의 사용을 최대한 줄이고, 각각의 쓰레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는 방법이다.
Re-entrancy (재진입성)
- 쓰레드 호출과 상관 없이 프로그램에 문제가 없도록 작성하는 방법이다.
'학습 내용 > 학습 정리' 카테고리의 다른 글
운영체제 - CPU 스케줄링 (0) | 2024.01.25 |
---|---|
운영체제 기본 (1) | 2024.01.11 |
MySQL의 Join 기법 (2) | 2024.01.11 |
Database Key (0) | 2024.01.11 |
스프링 - 2022-4-13 (0) | 2022.04.13 |