쉽게 말하자면 프로세스란 실행 중인 프로그램을 말한다.
자세히 알아보자
운영체제의 주 목적은 사용자 프로그램을 실행하는 것이지만 커널 안에서 보다 사용자 공간에서 가장 잘 할 수 있는 다양한 시스템 작업을 할 필요가 있다.
그래서 하나의 시스템은 일부는 사용자 코드를 실행하고 나머지는 운영체제 코드를 실행하는 프로세스들의 집합체이다.
우선 그림을 보고가자면
이 그림은 프로세스 메모리 배치의 그림이다.
**컴퓨터 구조에서 많이 봤다면 같은 것이다.
다시 말하겠다.
프로세스란 실행 중인 프로그램이다.
프로세스의 현재의 상태는 프로그램 카운터(PC) 값과 나머지 프로세서 레지스터의 내용으로 나타낸다.
1. Text: the executable code
실행 코드가 들어간다.
2. Data: global variables
전역 변수가 들어간다
3. Heap: memory(be allocated dynamically)
프로그램 실행 중에 동적으로 할당되는 메모리
4. Stack: temporary data storage
함수를 호출할 때 임시 데이터 저장장소이다(함수 매개변수, 복귀 주소 및 지역변수)
**text와 data는 처음부터 사이즈의 크기가 정해져있고 프로세스가 실행되는 동안 바뀌지 않는다.\
**또한 하나의 프로그램도 여러 개의 프로세스를 가질 수 있고 여러 개로 수행되기도 한다.
** One program can be several processes : Consider multiple users executing the same program
위에 더해서 텍스트나 데이터 섹션의 크기는 고정, 스택이나 힙은 동적
** 함수가 호출될 때마다 함수 매개변수, 지역변수 및 복귀 주소를 포함하는 활성화 레코드(activation record)가 스택에 push 된다. // 물론 함수에서 제어가 돌아오면 스택에서 다시 pop된다.
**스택도 있지만 힙도 마찬가지로 메모리가 동적으로 할당되니까 힙이 커지고 메모리가 시스템에 반환되면 다시 작아진다.
**운영체제는 여기서 스택 과 힙이 겹치지 않게 해야 한다.
다시 말하지만 프로그램 자체는 프로세스가 아니다라는 것을 말하고 지나가자.
프로그램은 명령어 리스트를 내용으로 가진 디스크에 저장된 파일, 단지 실행 파일일 뿐인다.
그래서 수동적인 존재라고도 한다.
반대로 프로세스는 다음에 실행할 명령어를 지정하는 프로그램 카운터와 관련 자원의 집합을 가진 능동적인 존재이라고 한다.
영어로는 ... 이렇다 잘 보자
• Program is passive entity stored on disk (executable file), process is active
• Program becomes process when executable file loaded into memory
• Execution of program started via GUI mouse clicks, command line entry of its name, etc
• One program can be several processes
• Consider multiple users executing the same program
이거는 C 프로그램에서 실제로 메모리 배치인데
영어로 되어있어도 화살표보면 대충 알거다.
이제 프로세스에 대해 살짝 알아봤으니
정말로 프로세스가 어떻게 만들어지고 실행되는지를 알아보자
상태에는 5가지가 있다.
1. 새로운,New: 프로세스가 만들어짐
프로세스 생성을 말한다. // 프로세스를 생성하고 있는 단계로 커널 공간에 PCB가 만들어진 상태
2. 실행중, Running: instruction이 실행중
명령어가 실행됨을 말한다
//CPU 할당중이겠지??
3. 대기중, Waiting: 어떤 event가 생기기를 기다리는 중
프로세스가 어떤 이벤트(I/O 같은)가 일어나길 기다린다.
4. 준비중, Ready: 프로세서에 할당되기를 기다리는 중
프로세스가 처리기에 할당되기를 기다린다.
//프로세스가 메모리에 적재된 상태로 실행하는데 필요한 자원을 모두 얻은 상태
//아직 CPU를 받지는 않았지만 CPU를 할당 받으면 바로 실행 가능한 상태
//ready상태를 가지는 여러개의 프로세스들이 존재할 수 있음
5. 종료, Terminated: 프로세스가 실행을 끝마침
프로세스의 실행이 끝났다.
//프로세스의 실행이 완료되고 할당된 CPU를 반납, PCB가 파괴된다.
**중요한 것은 어느 한 순간에 한 processor 에서는 오직 하나의 프로세스만이 실행될 수 있다.
즉, 다른 많은 프로세스가 준비나 대기 상태에 있을 수 있다는 것이다.
6가지 프로세스 상태의 요인들
하나하나 알아보자
new -> ready (admitted)
new 상태에서 OS에 의해 승인을 받아 프로세스가 생성되면
해당 프로세스의 PCB(Process Control Block, 커널 내 자료구조)이 OS커널의 Ready Queue에 올라옴
ready -> running (scheduler dispatch)
Ready Queue에 있는 프로세스들 중에서 스케줄링 알고리즘에 의해 선택받은 프로세스가 CPU를 할당받음
//Scheduler에 의해 dispatch 되는 것을 Scheduler dispatch라고 부름
running -> waiting ( I/O wait)
현재 CPU를 받아 명령어를 수행중인 프로세스가 I/O 작업을 해야하는 경우로 CPU를 반납하고 해당 장치 큐에 들어가게 됨
waiting -> ready (I/O completion)
I/O 작업을 위해 장치 큐에있던 프로세스가 디스크 컨트롤러에 의해 서비스를 받아 일을 하고 디스크 컨트롤러가 인터럽트를 발생하여 프로세스가 한 일을(로컬버퍼에 저장된 데이터) 메모리에 올려놓고 프로세스는 다시 Ready Queue에 들어가게 됨
running -> ready (interrupt)
CPU를 할당받아 일을 하다 특정 이유로 다른 프로세스에게 CPU를 주고(dispatch) 다시 CPU를 기다림
interrupt 같은 경우는 우선 순위가 높기 때문에 CPU 자원 뺏김
running -> terminated (exit)
프로세스 실행이 완료되어 자원을 반납한 상태
그래서 프로세스들이 그럼 저렇게 된다는 것은 알겠는데..??
무슨 상태인지 내가 어떻게 확인하는데??
그것은 바로 PCB(Process Control Block)이다.
운영체제는 PCB를 프로세스에 대한 중요한 정보를 저장해놓을 수 있는 저장 장소로 쓴다.
아무튼 각 프로세스는 운영체제에서 프로세스 제어 블록에 의해 표현된다.
블록은 이렇게 생겼다.
알아보자
몇 가지 것들이 들어있다.
1. 프로세스 상태, Process state: 위에서 설명했듯이 new, ready, waiting, running 등 의 상태를 가진다.
위에 설명했듯이 5가지를 가진다
2.계정 정보, Accounting information – CPU used, clock time elapsed since start, time limits
CPU 사용시간, 경과 시간, 시간 제한, 계정 번호, 프로세스 번호 등을 포함한다.
3. 프로그램 카운터,Program counter: 다음 실행해야 할 instruction의 주소를 가리킨다.
프로세스가 다음에 실행할 명령어 주소를 가리킨다.
4. CPU의 레지스터, CPU registers : contents of all process-centric registers
// 컴퓨터 구조에 따라 다르다.
5. CPU 스케줄링 정보,CPU scheduling information- priorities, scheduling queue pointers
// 프로세스 우선순위, 스케줄 매개변수를 가짐
프로세스 우선순위, 스케줄 큐에 대한 포인터, 다른 스케줄 매개변수 등이 있다.
(프로세스 스케줄링에서 또 배운다)
6. 메모리 관리 정보, Memory-management information – memory allocated to the process
// 프로세스에 메모리 할당
페이지 테이블, 세그먼트 테이블 등이 있다.
7. 입출력 상태 정보, I/O status information – I/O devices allocated to process, list of open files
// 프로세스에 Device 할당
프로세스에 할당된 입출력 장치들과 열린 파일의 목록 등
많이도 들어있다.
**프로세스 제어블록이 하는 일은 회계 데이터와 함께 프로세스를 시작시키거나 다시 시작시키는 데 필요한 모든 데이터를 위한 저장소 역할을 한다.
마지막으로 스레드, thread에 대해서 설명하겠다.
사실 프로세스가 단일의 실행 스레드를 실행하는 프로그램이다. 따지고 보면 진짜 일하는 것은 스레드란 얘기다.
process is a program that performs a single thread of execution.
해석하면 단일 스레드를 수행하는 프로그램이 프로세스라고 한다.
?? 정말 헷갈린다. 프로세스가 그럼 스레드인가? 라고 생각할 수 있다.
그림으로 표현해보자면
그림 설명: 물을 끓이기(process)를 위해서 CPU 위의 Thread(불)을 사용하는 것
프로세스를 처리하는 것이 스레드라고 보면 되겠다.
프로세스는 독립적인 메모리 공간인 것은 아까 봤고 프로세스 구조를 보면 코드, 데이터, 스택, 힙 다들어있다.
근데 프로세스를 CPU에서 실행한다고 했는데 사실 Thread가 실행하는 것이다.
예를 들어서 한 스레드가 워드 프로세서 프로그램을 실행 중이면, 실행되는 명령어의 단일 스레드가 존재한다.
이 단일 제어 스레드는 프로세스가 한 번에 한 가지 일만 실행하도록 허용한다.
++그렇지만 현재 운영체제에서는 한 프로세스도 다수의 스레드를 가질 수 있게 한다.
**특히 다중처리기 시스템에서 여러 스레드가 병렬로 실행될 수 있다.
So far, process has a single thread of execution
• Consider having multiple program counters per process
• Multiple locations can execute at once
• Multiple threads of control -> threads
• Must then have storage for thread details, multiple program counters in PCB
프로세스와 스레드의 차이
프로세스는 컴퓨터에서 현재 실행되고 있는 프로그램으로 메모리에 올라와서 독립적인 메모리 공간을 가진다.
스레드는 프로세스 내에서 실행되는 흐름으로 프로세스 자원을 공유한다.
'컴퓨터(Computer Science) > 운영체제(Operation System)' 카테고리의 다른 글
Process Life Cycle, 프로세스 생성부터 종료까지 (0) | 2020.05.29 |
---|---|
프로세스 스케줄링(Process scheduling)이란? (0) | 2020.05.29 |
Multiprogramming vs Multitasking 멀티프로그래밍과 멀티태스킹의 차이 (0) | 2020.05.29 |
프로세스에서의 동기화 (Process Synchronization) [운영체제] (0) | 2020.05.28 |
동기화, 모니터 : Synchronization, Monitor [운영체제] (0) | 2020.05.28 |