일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 인덱스
- vscode
- error
- watchOverflow
- prettier
- JavaScript
- v-bind
- vue2
- slidePerView
- swiper
- eslint
- css
- javascirpt
- js
- slidePerGroup
- activeIndex
- Vue
- swiperOption
- display
- realIndex
- slideChange
- querySelector
- eslint prettier
- index
- centerSlides
- loop:true
- classlist
- jquery
- archiver
- CORS
- Today
- Total
코딩하는 둥둥
[ 쉽게 배우는 운영체제 ] 3-3. 프로세스의 연산 본문
프로세스의 구조
프로세스는 코드 영역, 데이터 영역, 스택 영역으로 구성된다.
이때 데이터 영역은 일반 데이터 영역과 힙heap 영역으로 나뉜다.
코드 영역 code area
프로그램의 본문이 기술된 곳으로 텍스트 영역 text area이라고도 한다. 프로그래머가 작성한 프로그램은 코드 영역에 탑재되며 자기 자신을 수정하는 프로그램은 존재하지 않기 때문에 탑재된 코드는 읽기 전용으로 처리된다.
데이터 영역 data area
코드가 실행되면서 사용하는 변수variable나 파일 등의 각종 데이터를 모아 놓은 곳이다. 데이터는 변하는 값이기 때문에 기본적으로 읽기와 쓰기가 가능하다. 물론 상수 constant로 선언된 변수는 읽기 전용이지만 대부분의 변수는 읽기와 쓰기가 가능하다.
스택 영역 stack area
운영체제가 프로세스를 실행하기위해 부수적으로 필요한 데이터를 모아 놓은 것이다. 스택 영역은 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게는 보이지 않는다.
프로세스의 생성과 복사
프로세스는 프로그램을 실행할 때 새로 생성된다. 사용자가 프로그램을 실행하면 운영체제는 프로그램을 메모리로 가져와 코드 영역에 넣고 프로세스 제어 블록을 생성한다 그리고 메모리에 데이터 영역과 스택 영역을 확보한 후 프로세스를 실행한다.
fork() 시스템 호출의 개념
fork() 시스템 호출은 실행중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. 프로그램을 복사해서 사용할 경우 처음 프로그램을 실행하는 속도보다 훨씬 빠르다.
프로세스를 복사할때 기존의 프로세스는 부모 프로세스가 되고 새로 생긴 프로세스는 자식 프로세스가 되며, 두 프로세스는 부모-자식 관계로 연결된다.
fork() 시스템 호출의 동작 과정
프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어진다.
단, 프로세스 제어 블록의 내용 중 일부가 변경되는데 변경되는 부분은 다음과 같다.
- 프로세스 구분자가 바뀐다.
- 메모리 관련 정보가 바뀐다.
- 부모 프로세스 구분자 PID와 자식 프로세스 구분자 CPID가 바뀐다.
fork() 시스템 호출의 장점
- 프로그램을 새로 가져오지 않고 기존 메모리에서 복사하기 때문에 프로세스의 생성 속도가 빠르다.
- 부모 프로세스가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속할 수 있다.
- 부모 프로세스와 자식 프로세스가 연결되어있기 때문에 시스템 관리를 효율적으로 할 수 있다.
fork() 문 이전에 파일을 열거나 변수를 선언하면 이것이 모두 자식 프로세스에 상속된다는 점이다. 그러나 부모 프로세스와 자식 프로세스가 서로 독립적이기 때문에 둘 중 어느 것이 먼저 출력될지는 알 수 없다.
프로세스의 전환
exec() 시스템 호출의 개념
exec() 시스템은 기존의 프로세스를 그대로 둔 채 내용만 새로운 프로세스로 전환하는 함수이다.
프로세스 구조체를 재활용하기 위해 사용한다. 새로운 코드 영역만 가져오면 되기 때문에 운영체제의 작업이 수월하다.
exec() 시스템 호출의 개념
exec() 시스템 호출을 하면 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버린다. 또한, 데이터 영역이 새로운 변수로 채워지고 프로세스를 처음 시작하는 것처럼 스택 영역이 리셋된다. 이때 각종 프로세스 구분자(PID, CPID, PPID)는 남겨둔다.
유닉스에서 exec() 시스템 호출은 인자 parameter에 따라 exec(), ececlp(), execvp()와 가은 함수가 있는데 모두 기능이 동일하다.
프로세스의 계층 구조
유닉스의 프로세스 계층 구조
유닉스에서 커널이 처음 메모리에 올라와 부팅이 되면 커널 관련 프로세스를 여러 개 만드는데, 그중 init 프로세스는 전체 프로세스의 출발점이 된다. 운영체제는 프로세스를 효율적으로 관리하기 위해 init 프로세스를 만든 다음 나머지 프로세스를 init프로세스의 자식으로 만든다. init프로세스는 fork()와 exec() 시스템 호출을 이용해 자식 프로세스를 만든다.
프로세스 계층 구조의 장점
여러 작업의 동시 처리
용이한 자원 회수
고아 프로세스 orphan process
프로세스가 종료된 후에도 비정상적으로 남아있는 프로세스를 고아 프로세스 또는 좀비 프로세스 zombie process라고 한다. 고아 프로세스는 부모 프로세스가 자식보다 먼저 죽는 경우에 발생한다. 좀비 프로세스는 자식 프로세스가 종료했음에도 부모가 뒤처리를 하지 않을 때 발생했다.
컴퓨터에 고아나 좀비 프로세스가 많아지며 자원이 낭비됨으로 효율적인 운영에 방해가 된다. 따라서 운영체제는 반환되지 못한 자원을 회수하는 자원회수를 주기적으로 해야 한다.
'Computer Science > 쉽게 배우는 운영체제' 카테고리의 다른 글
[ 쉽게 배우는 운영체제 ] 3-5. 동적 할당 영역과 시스템 호출 (0) | 2022.07.21 |
---|---|
[ 쉽게 배우는 운영체제 ] 3-4. 스레드 (0) | 2022.07.20 |
[ 쉽게 배우는 운영체제 ] 3-2. 프로세스 제어 블록과 문맥 교환 (0) | 2022.07.19 |
[ 쉽게 배우는 운영체제 ] 3-1. 프로세스의 개요 (0) | 2022.07.19 |
[ 쉽게 배우는 운영체제 ] 2-5. 무어의 법칙과 암달의 법칙 (0) | 2022.07.17 |