일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 혼공머신
- c언어
- SQL
- 정보처리기사실기
- JSP
- 중학1-1
- 오블완
- 컴퓨터구조
- 자바 실습
- 데이터베이스
- 딥러닝
- rnn
- JDBC
- 개발일기
- 자바
- 연습문제
- JSP/Servlet
- 자바스크립트심화
- 순환신경망
- html/css
- 컴퓨터비전
- 머신러닝
- 데이터분석
- 중학수학
- 상속
- 디버깅
- 정보처리기사필기
- 자바스크립트
- 파이썬
- CSS
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
프로세스와 스레드 1 - 프로세스 개요 본문
프로세스 관리는 운영체제의 핵심 서비스이다. 운영체제가 관리하는 프로세스가 무엇인지 알아보고 프로세스가 실행되는 과정들을 살펴보겠다.
지금까지는 단순히 '실행 중인 프로그램'이라고 표현했지만, 이 프로그램을 프로세스라고 한다. 프로그램은 실행되기 전까지는 그저 보조기억장치에 있는 데이터 덩어리일 뿐이지만, 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 된다. 이 과정을 '프로세스를 생성한다'라고 표현한다.
프로세스 직접 확인하기
컴퓨터가 부팅되는 순간부터 수많은 프로세스들이 실행된다. 윈도우에서는 작업 관리자의 [프로세스] 탭에서 확인할 수 있고, 유닉스 운영체제에서는 ps 명령어로 확인할 수 있다.
실제로 컴퓨터를 켜고 확인해보면 자신이 실행한 프로세스 외에도 알 수 없는 여러 프로세스가 실행되고 있는 것을 볼 수 있다.
백그라운드 프로세스를 유닉스 운영체제에서는 데몬이라 부르고, 윈도우 운영체제에서는 서비스라고 부른다.
프로세스 제어 블록
운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다. 이를 위해 운영체제는 프로세스 제어 블록(PCB)을 이용한다.
PCB는 커널 영역에 생성된다. 운영체제도 수많은 프로세스들 사이에서 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는데 필요한 정보를 판단한다.
PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다. 다시 말해 '새로운 프로세스가 생성되었다'는 말은 '운영체제가 PCB를 생성했다'는 말과 같고, '프로세스가 종료되었다'는 말은 '운영체제가 해당 PCB를 폐기했다'는 말과 같다.
PCB에 담기는 정보는 운영체제마다 차이가 있다.
같은 일을 수행하는 프로그램이라 할지라도 두 번 실행하면 PID가 다른 두 개의 프로세스가 생성된다.
이렇게 같은 프로세스인데 PID가 다른 프로세스가 생성되는 것을 확인할 수 있다.
그래야만 이전까지 진행했던 작업들을 그대로 이어 실행할 수 있다. 그래서 PCB 안에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.
프로세스마다 메모리에 저장된 위치가 다르다. PCB에는 베이스 레지스터, 한계 레지스터 값과 같은 정보들이 담긴다. 프로세스의 주소를 알기 위한 또 다른 중요 정보 중 하나인 페이지 테이블 정도도 PCB에 담긴다.
문맥 교환
실행 문맥을 잘 기억해두면 언제든 해당 프로세스의 실행을 재개할 수 있기 때문에 프로세스가 CPU를 사용할 수 있는 시간이 다 되거나 예기치 못한 상황이 발생하여 인터럽트가 발생하면 운영체제는 해당 프로세스의 PCB에 문맥을 백업한다.
문맥 교환이 자주 일어나면 프로세스는 그만큼 빨리 번갈아 가며 수행되기 때문에 우리의 눈에는 프로세스들이 동시에 실행되는 것처럼 보인다. 문맥 교환을 자주 하면 오버헤드가 발생할 수 있기 때문에 문맥 교환이 자주 일어난다고 해서 반드시 좋은 건 아니다.
프로세스의 메모리 영역
코드 영역과 데이터 영역은 그 크기가 변하지 않는다. 프로그램을 구성하는 명령어들이 갑자기 바뀔 일이 없으니 코드 영역의 크기가 변할리 없고, 데이터 영역에 저장될 내용은 프로그램이 실행되는 동안에만 유지되기 때문이다.
그래서 코드 영역과 데이터 영역은 '크기가 고정된 영역'이라는 점에서 정적 할당 영역이라고 부른다. 반면 힙 영역과 스택 영역은 프로세스 실행 과정에서 그 크기가 변할 수 있는 영역이므로 두 영역을 동적 할당 영역이라고 부른다.
메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 한다. 메모리 공간을 반환한다는 의미는 '더 이상 해당 메모리 공간을 사용하지 않겠다'라고 운영체제에 말해주는 것과 같다.
메모리 공간을 반환하지 않는다면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비를 초래한다. 이런 문제를 메모리 누수라고 한다. 많은 개발자가 자주 마주치는 문제 중 하나이다.
일시적으로 저장할 데이터는 스택 영역에 PUSH 되고, 더 이상 필요하지 않은 데이터는 POP 됨으로써 스택 영역에서 사라진다.
단원 마무리하기
학습을 마치고
오후에 이 공부를 하다가 너무 하기 싫어서 한참 놀다가 저녁 무렵에 다시 시작해본다. 쉬는 사이에 마음도 많이 회복되었고 다시 공부할 수 있는 몸과 마음이 되었다. 가끔 슬럼프가 올 때도 있지만, 요즘 내게 슬럼프란 존재하지 않을 만큼 일상과 휴식이 특별히 다를 게 없어졌다.
슬럼프는 평소보다 열정이 식어지는 때를 말한다. 그리고 이 열정은 때로 충분한 휴식을 줄 때 회복되는 경우가 많다는 걸 알게 되었다.
'알고리즘 및 자료 관리 > 컴퓨터 구조 & 운영체제' 카테고리의 다른 글
프로세스와 스레드 3 - 파이썬 코드로 프로세스 확인 실습해보기 (0) | 2024.10.17 |
---|---|
프로세스와 스레드 2 - 프로세스 상태와 계층 구조 (0) | 2024.10.17 |
운영체제 시작하기 4 - 운영체제의 큰 그림 3 : 시스템 호출 실습해보기 (0) | 2024.10.17 |
운영체제 시작하기 3 - 운영체제의 큰 그림 2 : 운영체제의 핵심 서비스 (0) | 2024.10.17 |
운영체제 시작하기 2 - 운영체제의 큰 그림 1 : 운영체제의 심장, 커널에 대하여 (1) | 2024.10.17 |