프로세스(process)
란 실행중에 있는 프로그램(Program)
을 의미
프로그램(Program)
: 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태
스케줄링
의 대상이 되는 작업(task)과 같은 의미로 사용
프로세스 내부에는 최소 하나의 스레드(thread)
를 가지고 있는데, 실제로는 스레드(thread)
단위로 스케줄링
하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게되는데 이 순간부터 프로세스라고 명명
프로세스는 독립된 객체로서 생성되면 각각의 메모리 자원을 할당받고 서로에게 접근 불가능
접근이 불가능하기 때문에 여러개의 프로세스를 처리하기 위해서 서로의 상태 자원을 공유하려면 IPC라는 커뮤니케이션 기법이 필요
IPC(Inter Process Communication)
: 커널의 공유 메모리를 활용하여 프로세스들간의 상태 정보를 주고받음
ex. 본인은 엑셀 프로그램(excel.exe)을 켰다. 이때 엑셀을 실행시키기 위해 컴퓨터는 엑셀 프로그램을 읽어야 한다. 컴퓨터에서 모든 프로그램은 코드로 작성되어 있다. 이 코드 파일을 컴퓨터가 읽으려면 CPU가 이해할 수 있는 형태인 저급 언어(0과 1로 이루어진 기계어)로 프로그램이 만들어져야 한다. 0과 1로 작성된 실행 프로그램을 코드 이미지 또는 바이너리라고 부르며, 보통 exe란 확장자가 붙는다. 이 exe 프로그램을 실행하면 메모리에 실행할 데이터가 올라가고, CPU가 이 데이터의 코드를 한줄씩 읽어 나가며 실행한다. 이때, 메모리에 올려진 데이터를 프로세스라고 한다.
프로세스들 간의 의사소통을 하는 것을 IPC
라고 한다.
프로세스가 통신 가능하다는 것은 서로 다른 프로세스가 데이터를 주고받을 수 있다는 것이며, 동시에 접근 가능한 메모리 즉, 프로세스들이 공유하는 메모리가 필요하다는 뜻
따라서 컴퓨터 내부에서 보다 효율적으로 정보를 주고받기 위한 통신의 일종이라고 생각하면 되고, 인터넷 통신을 IPC의 확장으로 이해할 수 있다. (프로세스간 통신이 서버-클라이언트 간 통신과 유사하기 때문)
① 공유 메모리
② 파이프(pipe)
통신을 위한 메모리공간(버퍼)을 생성하여 프로세스가 데이터를 주고받게끔 함
③ 소켓(Socket)
④ 메시지 큐(Message Queue)
⑤ 메모리 맵(Memory Map)
⑥ RPC(Remote Procedure Call)
- 스텁(stub) : 리눅스에서 공유 라이브러리의 일부분 중
- 프로시저 : 루틴, 서브루틴, 함수와 같은 뜻으로 사용되며 하나의 프로시저는 특정 작업을 수행하기 위한 프로그램의 일부, 또는 어떤 행동을 수행하기 위한 일련의 작업순서를 말함
이러한 IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어
와 뮤텍스
를 사용한다.(공유된 자원에 한번에 하나의 프로세스만 접근시킬 때)
세마포어(Semaphore)
- 위의 다른 IPC 설비들이 대부분 프로세스간 메시지 전송을 목적으로 하는 것에 반해, 세마포어는 프로세스간 데이터를 동기화하고 보호하는데 목적을 둔다.
- 공유된 자원에 여러개의 프로세스가 동시에 접근하면 안되며, 한번에 하나의 프로세스만 접근 가능하도록 할 때 사용
프로세스당 하나씩 존재
프로세스를 실행시키기 위해서는 코드의 데이터를 메모리에 올려 실행, 이때 프로세스마다 고유한 가상 메모리 공간을 제공하고 이 공간은 4개로 나눔
Code 영역(Text Segment)
Data 영역(Data Segment)
Heap 영역
Stack 영역
① 프로세스 생성(new)
② 실행 가능(Ready)
③ 실행 상태(Running)
④ 대기(Blocked)
⑤ 종료(Terminated, exit)
컴퓨터에서는 프로세스를 처리하기위한 PC
와 SP
라는 레지스터가 존재
프로세스의 실행 및 메모리 관리와 관련된 역할 수행
레지스터
란?
CPU의 빠른 데이터 처리를 돕기 위해 사용되는 임시 저장 공간으로, 처리중인 데이터나 처리결과가 담기게되는 공간
PC(Program Counter)
SP(Stack Pointer)
프로그램이 실행되면 프로세스의 정보를 저장하는 별도의 공간이 따로 생기게 되는데 운영체제의 커널(Kernel) 또한 하나의 프로그램이므로 프로세스와 같이 정보를 저장할 수 있는 공간(stack, data, heap...)이 생김. 이때 커널의 데이터(Data) 영역에서는 각 프로세스의 상태, CPU 사용의 정보, 메모리 사용 정보 등 각종 자원을 관리하기 위해서 PCB라는 공간을 만듦
커널(Kernel)
이란?
운영체제의 핵심부로 컴퓨터 자원들을 관리하는 역할을 수행
(컴퓨터 자원(system resource) : CPU, 메모리, 파일, 네트워크, 입출력 장치 등)
하드웨어와 응용 프로그램 간의 상호작용을 관리
주요 기능은 프로세스 관리, 메모리 관리, 입출력 관리, 파일 시스템 관리 등
시스템 최상위 권한을 가지고 있어 하드웨어 자원에 직접 접근하고, 응용 프로그램이 원활하게 실행될 수 있도록 관리
즉, 커널은 항상 컴퓨터 자원만 바라보고 있는데 사용자와의 상호작용은 전혀 지원 X
그래서 시스템 프로그램 쉘(Shell)을 사용쉘(Shell)
이란?
사용자가 컴퓨터에게 전달하는 명령을 해석하는 프로그램, 커널과 사용자간의 다리 역할 수행
사용자와 운영체제 간의 인터페이스 역할 수행
사용자는 이것을 통해 운영체제와 상호작용하고 작업을 수행할 수 있으며, 커널을 호출해 운영체제 기능과 서비스 조작 가능
인터페이스
: 사용자가 운영체제에게 정보, 명령, 신호 등을 교환하기 위한 규칙
즉, PCB란 운영체제가 프로세스를 관리하기 위해 사용하는 데이터 구조
각 프로세스마다 유지되며, 해당 프로세스의 상태 정보와 제어정보를 저장
프로세스가 생성되면 운영체제는 PCB를 할당하고 프로세스가 종료되면 해당 PCB를 해제
PC와 SP 값이 PCB에 저장되고 필요하면 PCB에서 불러와 코드 실행이 멈춰 있던 곳의 주소를 찾아가 다시 실행할 수 있게 해줌
프로그램이 잠시 중단된 상태에서 다시 실행할 때, 처음부터 되돌아가서 실행하지 않고 실행을 이어서 처리할 수 있게 해줌
현재 Process State
New, Ready, Wait, Running, Terminated
이 상태 정보는 프로세스의 스케줄링과 상호작용하여 프로세스의 실행을 관리
Process ID, Parent Process ID
CPU registers
프로세스의 레지스터 상태를 저장하는 공간
Program Counter
프로세스가 다음에 실행할 명령어(코드)의 주소를 가리키는 포인터
프로세스가 중단되었을 때 다시 시작할 위치를 알려주는 중요한 역할
CPU Sceduling 정보
CPU Sceduling에 필요한 우선순위 및 scheduling queues의 pointer
Memory 관리 정보
프로세스가 사용하는 메모리 공간의 주소 범위, 페이지 테이블, 메모리 할당 정보 등과 같이 메모리 관리에 필요한 정보를 저장
페이지 테이블
: 페이징 프로세스의 메모리 주소를 관리할 때 프로세스의 페이지 정보({페이지 번호:페이지에 해당하는 데이터의 실제 물리주소})를 저장하고 있는 테이블
세그먼트 테이블
: 프로세스를 논리적 내용으로 잘라 메모리에 배치하는 방식을 세그멘테이션이라고 함, 세그먼트 테이블은 이 세그먼트들의 실제 물리적 메모리 주소 정보를 담고 있음(base: / limit)쌍으로 이루어짐
Accounting 정보
process를 실행한 user의 정보
I/O 상태 정보
프로세스가 현재 사용 중인 입출력 장치와 관련된 정보를 포함
어떤 입출력을 보내고 있는지, 어떤 파일을 열어두었는지 등
PCB는 현재 프로세스가 instruction의 어떤 곳 까지 실행하였는지, register에는 어떤 값들이 저장되어 있는지 등 현재 시점의 모든 상태를 가지고 있음
따라서 운영체제의 sceduler가 현재 프로세스를 정지하고 다른 프로세스를 Dispatch하기 전에 현재 프로세스의 상태를 PCB에 저장한다면 다시 원래 프로세스의 실행 순서가 돌아왔을 때 이전에 하던 작업을 PCB를 통해 그대로 복원 가능
프로세스는 서로의 데이터에 접근하는것이 직접적으로 불가능한것에 반해, 스레드는 프로세스 내부에 존재하기때문에 프로세스의 Code/Data/Heap 메모리 영역을 공유할 수 있다. 또한 스레드들끼리 서로의 데이터에도 접근 가능(IPC가 필요없음), 한 스레드가 프로세스 자원을 변경하면 다른 이웃 스레드(sibling thread)도 변경 사항을 확인 가능
스레드도 일종의 작업단위라서 프로세스처럼 작업 처리. 즉, 스레드도 프로세스처럼 작업을 병렬로 처리하여 속도를 증가시킬 수 있음
스레드는 일종의 함수로 구현. 스레드도 함수라서 데이터(지역 변수)를 다루고, 데이터를 관리하기위해 stack 메모리 영역을 가짐. 이 stack 공간은 프로세스가 가지는 stack 메모리 영역과는 별개이며 스레드의 메모리 영역을 thread stack이라고 명명
프로세스는 메모리 영역을 4가지(code, data, stack, heap)으로 나누지만 스레드는 thread stack 메모리 공간만 가지고 있음
스레드 안에 포함된 데이터(지역변수)는 thread stack에 저장(단, 프로세스의 stack 영역에는 스레드 지역변수 포함 X)
하나의 프로세스는 내부에 여러개의 스레드를 가질 수 있음
하나의 프로세스 안에 스레드는 몇개까지 만들 수 있을까?
쓰레드는 남은 램의 크기 이상은 만들수 없다!
하나의 프로세스 내부에서 여러개의 스레드로 자원을 공유하며 작업을 나누어 수행하는 것
장점
- 시스템 자원소모 감소(자원의 효율성 증대)
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리 가능
- 시스템 처리율 향상(처리비용 감소)
- 스레드 간 데이터를 주고받는 것이 간단해지고 시스템 자원 소모가 줄어듦
- 스레드 사이의 작업량이 작아 context switcing이 빠름(캐시 메모리를 비울 필요가 X)
- 간단한 통신 방법으로 프로그램 응답시간 단축
- 스레드는 프로세스 내 스택 영역을 제외한 메모리 영역을 공유하기에 통신 비용이 ↓
- 힙(Heap)영역을 공유하므로 데이터 주고받기 가능
단점
- 자원을 공유하기 때문에 동기화 문제 발생 가능성(병목현상, 데드락 등..)
- 주의 깊은 설계가 필요하고 디버깅이 어려움(불필요한 부분까지 동기화하면 대기시간으로 인해 성능저하 발생)
- 하나의 스레드에 문제가 생기면 전체 프로세스에 영향을 미침
- 단일 프로세스 시스템의 경우 효과 ↓
두개 이상의 다수 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)를 동시에 처리하는 것(병렬처리)
각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용
장점
- 독립된 구조로 안정성이 높음
- 프로세스 중 하나가 문제가 생겨도 다른 프로세스에 영향을 미치지않아 정지하는 문제가 생기지않음(다만, 작업 속도는 조금 느려질 수 있음)
- 여러개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세스(CPU)가 이를 공유하면 비용적으로 저렴
단점
- 독립된 메모리 영역이기 때문에 작업량이 많을수록(Context switching이 자주일어나서 주소 공간의 공유가 잦을 경우) 오버헤드가 발생하여 성능저하 발생
Context Switching
- CPU는 한번에 하나의 프로세스만 실행 가능
- CPU에서 여러 프로세스를 돌아가면서 작업하는 것 ==
context switching
- 구체적으로, 동작중인 프로세스가 대기를 하면서 해당 프로세스의
상태(context)
를 보관, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업
프로세스는 생성되면서 PC를 포함하여 메모리 공간 등을 복사하여 별도의 자원을 할당하지만, 스레드는 메모리 공간과 자원을 공유하기 때문
따라서 프로세스는 통신할 수 있는 공간이 없기 때문에 통신을 위한 별도의 공간을 만들어줘야해서 스레드 간 통신보다 어렵다고 볼수 있다.
이를 위해서 커널 영역에서
IPC
라는내부 프로세스간 통신(Inter Process Communication)
을 제공하게 되고, 프로세스는 커널이 제공하는 IPC 설비를 이용해서 프로세스간 통신이 가능