IT/컴퓨터구조와 운영체제

[Process] Process의 개념, Address Space, State, Context switch, API

kykyky 2024. 3. 27. 22:27

💡프로세스란

Program: 실행 파일. 코드와 데이터로 이루어져 있음.

Process: program의 실행 중인 instance.

출처: Wikipedia

 

💡프로세스의 Address Space (Memory Layout)

모든 각각의 프로세스는 아래와 같이 자신만의 가상 메모리 주소 공간을 가진다.

 

출처: 고려대학교 CSL

 

stack: 지역 변수

heap: 동적 할당된 변수 

BSS: 초기화되지 않은 정적 변수

data: 초기화된 정적 변수

text: 프로그램 코드 

 

💡프로세스 스케줄링

CPU 안에는 core가 있는데, 이 코어라는 것은 엄밀하게는 한 순간에 하나의 프로세스만을 다룰 수 있으므로, 여러 개의 프로세스가 (거의) 동시에 돌아가기 위해서는 교통정리, 즉 스케줄링이 필요하다.

 

프로세스의 state

출처: https://teaching.csse.uwa.edu.au/units/CITS2002/lectures/lecture07/singlepage.html

 

✅New

새 프로세스가 생성되었지만, 아직 운영체제가 실행을 허가하지 않은 상태.

아직 메인 메모리에 로드되진 않았지만 PCB는 생성되었음.


✅Ready

메인 메모리에 로드되었고 실행될 준비가 되었음을 알리며 대기 중인 상태.

 

✅Running

CPU에서 실행 중인 상태.

만약 이 프로세스가 critical section에 있다면, 다른 프로세스들은 Ready 상태에서 기다려야 함.

 

✅Blocked/Waiting

특정 event(eg. completion of I/O operation, waiting for other processes, synchronization signal, ...) 발생 전까지는 실행될 수 없어 기다리는 상태.

 

✅Exit/Terminated

complete되거나 abort되어 OS에 의해 방출된 상태.

 

 

Context switching

현재 실행중인 프로세스의 state를 추후의 복원을 위해 저장한 뒤, 다른 프로세스의 state를 로드하고 실행하는 것이다.

이를 통해 연관된 각 프로세스의 state는 변화한다.

 

출처: BYJU'S

 

 

 

상세한 단계

 

 

 

 

프로그램 1과 2가 있는데, 현재는 CPU에서 프로그램1이 실행되고 있고, 프로그램 2는 멈춰있다.

 

 

 

 

 

그런데 이때 운영체제가 프로그램 1을 멈춰서, 프로그램 1은 CPU에서 쫓겨났다.

프로그램 1의 context 정보가 memory로 돌아간다.

 

 

 

 

 

 

그리고 운영체제는 CPU에 프로그램 2를 재개한다.

프로그램 2의 context 정보가 CPU에 들어온다.

 

 

 

 

 

 

 

이제 프로그램 2가 CPU를 차지하고 실행되고 있으며, 프로그램 1은 멈춰 있다.

 

 

 

 

 

출처: 고려대학교 CSL

 

💡프로세스의 생성과 종료

 

프로세스 생성을 일으키는 event

- 시스템 startup (컴퓨터 켤 때.)

- 사용자 request (eg. 화면 아이콘 더블클릭하여 켤 때.)

- 다른 프로세스가 프로세스 생성 시스템 콜을 실행할 때.

 

프로세스 종료의 조건

- Normal exit (voluntary)
- Error exit (voluntary)
- Fatal error (involuntary)
- 다른 프로세스가 kill (involuntary)

 

💡프로세스 Hierarchy

프로세스는 fork()를 통해 부모와 자식 관계가 형성될 수 있으며, 이 관계가 반복되어 전체적으로는 계층적 구조가 만들어진다.

이들의 구분을 위해 PID가 부여되어 있다.

 

출처: https://slideplayer.com/slide/8544147/

 

 

💡프로세스 API

🚩

fork(): 프로세스 복사본 생성

이 새 프로세스는 자신만의 메모리 주소 공간 (copied from parent), 레지스터 set (copeid from parent)를 가진다.

부모 프로세스가 받는 리턴값은 자식 프로세스의 PID이고, 자식 프로세스가 받는 리턴값은 0이다.

🚩

exec(): 다른 프로세스로 전환

현재 프로세스의 주소 공간을 새 프로세스가 덮어쓴다.

복사본을 생성하는 것이 아니므로, 전환 후의 주소 공간 내 값들은 이전과 달라진다. 

출처: 고려대학교 CSL

 

getpid(): calling process의 PID 반환

 

getppid(): calling process의 parent process의 PID 반환

 

signal(): signal을 포착

 

kill(): 다른? 프로세스에게 signal을 보냄.