👉 실행시키기 전에는 코드가 구현되어있는 파일일 뿐. 사용하려면 보조 기억장치에서 프로세스가 필요로 하는 재료들이 메모리에 올라가야한다.
👉 (ctrl + alt + delete)의 작업관리창에 표시되어있는 것들 !
프로그램을 실행하면 -> 운영체제로부터 실행에 필요한 자원을 할당 받음 -> 프로세스
1) Code : 코드 자체를 구성하는 메모리 영역 (프로그램 명령)
2) Data : 전역 변수, 정적 변수, 배열 등 (초기화 된 데이터)
3) stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)
4) Heap : 동적 할당 시 사용 (new(), mallock() 등)
해당 프로세스에 대한 정보를 담고 있는 PCB 블럭이 프로세스 생성 시 함께 만들어진다.
각 프로세스는 별도의 주소 공간에서 실행되고 서로 독자적인 메모리 공간을 갖기 때문에 서로 메모리 공간을 공유할 수 없다. 즉, 다른 프로세스의 변수나 자료 구조에 접근할 수 없다.
다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC)을 사용해야한다.
프로세스는 최소 하나 이상의 스레드를 포함한다.
🔍 프로세서 : 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛. 이는 중앙 처리 장치(CPU)를 뜻하며 명령어를 해석하는 컴퓨터의 한 부분
예전엔 컴퓨터가 한번에 하나의 동작만을 수행했다. 다중 작업을 가능하게하는 '멀티태스킹' 기능이 나오면서 컴퓨터가 프로세스 여러 개를 함께 돌리는 것이 가능해졌다.
여러 프로세스를 한꺼번에 돌리는 작업은 동시적, 병령적 또는 이 둘의 혼합으로 이루어진다.
🔍 Context Switching : 프로세서는 원래 한번에 하나의 프로세스만 실행시킬 수 있다.
A 프로세스가 올라갔다가 내려와야 B 프로세스가 올라갈 수 있고 다시 A 프로세스가 올라가기 위해서는 B 프로세스가 내려오는 작업이 필요하다. ( 반복이 많아지게 되면 CPU의 부담이 늘어나고, 중복된 자원들이 비효율적으로 관리된다.)
1) 동시성(Concurrency)
동시성은 프로세서 하나가 프로그램 1,2,3,4 여러 작업을 돌아가며 일부분씩 수행하는 방식이다. 이 과정이 매우 빠른 속도로 돌아가게 되면서 사람들에게는 이 프로세스들이 동시에 진행되는 것처럼 보인다.
2) 병렬성(Parallelism)
병렬성은 프로세서 하나에 코어 여러 개가 달려서 각각 동시에 작업을 하는 방식이다. 듀얼코어, 쿼드코어, 옥타코어와 같은 명칭의 프로세서가 달린 컴퓨터에서 할 수 있는 방식이다. 코어를 여러 개를 달아 작업을 분담하게 만든 것이다.
한 프로세스 안에서도 여러 가지 작업이 동시에 진행되는 경우가 있다.
브라우저가 실행 중일 때
1) 파일을 다운받고
2) 웹 서핑도 하고
3) 노래도 듣는 등의 작업 등을 진행하는 경우가 생긴다.
이런 여러 가지 작업으로 생기는 갈래들을 스레드(Thread)라고 한다.
🔍 다른 자원은 공유하지만 굳이 스택만 분리해서 사용하는 이유!
- LIFO (Last In First Out) 후입 선출이라는 스택의 특성과 연관이 있다.
- 코드와 데이터 힙 영역을 공유하는 것에는 큰 문제가 없음
- 그러나 스택 영역은 스택이 쌓이면 위에서부터 프로세스가 섞인 채로 순서대로 나오게 되므로
더 복잡해지기 때문에 원할한 실행 흐름을 위해 스택은 따로 독립적으로 존재하게 된다.
프로세스는 각 작업마다 운영체제로부터 자원을 할당받기 위해 시스템 콜을 하는 부담이 생기지만 멀티 스레드를 사용한다면 시스템 콜을 한번만 해도 되기 때문에 효율적이다. 또한 IPC 방식보다는 스레드 간 통신이 덜 복잡하고 시스템 자원 사용이 더 적으므로 통신의 부담도 줄일 수 있다.
https://velog.io/@gparkkii/ProgramProcessThread
https://devuna.tistory.com/21
https://www.youtube.com/watch?v=1grtWKqTn50
https://www.youtube.com/watch?v=iks_Xb9DtTM