채널톡 아이콘

인프런 커뮤니티 질문&답변

한울님의 프로필 이미지

작성한 질문수 36

그림으로 쉽게 배우는 운영체제

프로세스 상태

PCB 및 프로세스 상태에서

해결된 질문

작성

·

357

1

안녕하세요 

좋은 강의 잘 듣고 있습니다!
다름이 아니오라, 

PCB 강의에서

1. PCB들은 연결리스트라는 자료구조로 저장된다고 하셨는데 연결리스트로 연결되는 순서가 OS가 시분할시스템을 통해 돌아가면서 실행시키는 프로세스의 순서와 동일한 것인가요?

2. PCB의 구조 중 포인터 부분에서 부모와 자식 프로세스에 대한 포인터가 있다고 하셨는데 A->B->C의 예시에서, PCB B의 경우, 부모 프로세스는 A이고 자식 프로세스는 C가 되는 것인지, 그리고 할당된 자원에 대한 포인터의 경우 할당된 자원은 메모리가 맞는 것인가요?

프로세스의 상태 강의에서,

3. 현대 OS에서는 동시에 수많은 프로세스가 실행된다고 하셨고, CPU의 경우는 매우 빠른 속도로 프로세스를 순간마다 1개씩 처리한다고도 하셨는데 그렇다면 OS의 경우에는 여러 개의 CPU로 구성되어있기 때문에 시분할 시스템을 사용하더라도 동시에 여러 개의 프로세스를 실행한다고 말할 수 있는 것인가요?

4. 프로세스의 상태 중 생성 상태는 PCB를 생성하고 메모리에 프로그램 적재를 요청한 상태라고 하셨는데 프로세스의 정의는 '프로그램이 메모리에 올라가서 실행 중인 상태'인 것으로 알고 있습니다. 그런데 지금 생성 상태는, 아직 메모리에 프로그램이 올라가지도 않은 상태라 이 상태의 프로세스는 프로세스라고 부를 수 있는지, 프로세스의 정의에 적합하지 않은 것 같아 혼란스럽습니다...

 

감사합니다!

 

답변 1

0

감자님의 프로필 이미지
감자
지식공유자

안녕하세요 온수옴님!
강의를 듣다가 궁금증이 생기셨군요
바로 해결해드리겠습니다!

1. PCB들은 연결리스트라는 자료구조로 저장된다고 하셨는데 연결리스트로 연결되는 순서가 OS가 시분할시스템을 통해 돌아가면서 실행시키는 프로세스의 순서와 동일한 것인가요?

FIFO라는 스케줄링 알고리즘이라면 그 순서가 맞습니다!
하지만 운영체제는 프로세스들을 효율적으로 관리하기 위해 다른 스케줄링 알고리즘을 개발해서 조금 더 복잡한 방법을 사용합니다.
이 부분은 바로 뒤 섹션인 CPU스케줄링 섹션에서 자세히 다룹니다.

 

2. PCB의 구조 중 포인터 부분에서 부모와 자식 프로세스에 대한 포인터가 있다고 하셨는데 A->B->C의 예시에서, PCB B의 경우, 부모 프로세스는 A이고 자식 프로세스는 C가 되는 것인지, 그리고 할당된 자원에 대한 포인터의 경우 할당된 자원은 메모리가 맞는 것인가요?

맞습니다. A를 복사해서 B라는 자식 프로세스가 생긴다면 A의 자식은 B이고 B의 부모는 A입니다.
똑같이 B를 복사해서 C라는 자식 프로세스가 생긴다면 B의 자식은 C이고 C의 부모는 B입니다.
할당된 자원의 경우 메모리가 맞습니다. 이 부분은 메모리 관련 정보로 보시면 됩니다!

 

3. 현대 OS에서는 동시에 수많은 프로세스가 실행된다고 하셨고, CPU의 경우는 매우 빠른 속도로 프로세스를 순간마다 1개씩 처리한다고도 하셨는데 그렇다면 OS의 경우에는 여러 개의 CPU로 구성되어있기 때문에 시분할 시스템을 사용하더라도 동시에 여러 개의 프로세스를 실행한다고 말할 수 있는 것인가요?

맞습니다. CPU가 1개라면 동시에 여러 개의 프로세스가 실행될 수 없고 한 순간에는 하나의 프로세스만 실행되지만 그 속도가 매우 빨라서 동시에 실행되는 것 처럼 보인 것입니다.
하지만 CPU가 여러 개라면 한 순간에 CPU 개수만큼 프로세스를 실행할 수 있기 때문에 여러 개의 프로세스를 실행한다고 말할 수 있습니다.

 

4. 프로세스의 상태 중 생성 상태는 PCB를 생성하고 메모리에 프로그램 적재를 요청한 상태라고 하셨는데 프로세스의 정의는 '프로그램이 메모리에 올라가서 실행 중인 상태'인 것으로 알고 있습니다. 그런데 지금 생성 상태는, 아직 메모리에 프로그램이 올라가지도 않은 상태라 이 상태의 프로세스는 프로세스라고 부를 수 있는지, 프로세스의 정의에 적합하지 않은 것 같아 혼란스럽습니다...

말그대로 프로세스 상태 중 생성 상태는 생성할 때 일어나는 상태입니다.
정확히 말하면 아직 프로세스가 생성되지 않은 상태죠.
쉬운 이해를 위해서 "프로그램이 메모리에 올라가서 실행 중인 상태"라고 말했지만 실제로 PCB가 생성되어야 프로세스라고 부를 수 있습니다.
하지만 프로세스 상태에 생성 상태가 없다면 프로세스가 만들어지는 과정없이 바로 준비상태가 되어야하기 때문에 이해가 어렵습니다.
따라서 따지고 보면 프로세스는 아니지만 생성요청 바로 준비상태로 넘어가기 때문에 그 과정을 표현하기 위해 프로세스 상태에 표현되는 것입니다!

한울님의 프로필 이미지
한울
질문자

그러면 PCB만 생성 상태에서 만들어지고 진짜 프로세스는 생성 상태에서 프로그램이 메모리 적재 승인을 받고 올라가 준비상태가 되는 그 순간 만들어진다는 말씀이신가요?

감자님의 프로필 이미지
감자
지식공유자

먼저 메모리 적재 요청을 하고 승인이 떨어지면 그때 PCB(프로세스)가 생성됩니다!
PCB에는 프로세스의 메모리 정보도 저장되기 때문에 메모리 적재가 완료되어야 PCB를 완벽히 초기화 할 수 있습니다.
따라서 프로세스가 사용할 메모리 확보 -> PCB 초기화(프로세스 생성)가 됩니다.

PCB와 프로세스를 따로 분리하지 않고 PCB = 프로세스로 보시면 됩니다.
흔히 편의상 컨텍스트 스위칭을 할 때 프로세스가 스케줄링 큐에 들어간다고 표현하지만
실제로는 PCB가 스케줄링 큐에 들어가기 때문이죠.

한울님의 프로필 이미지
한울
질문자

그럼 PCB(프로세스)가 요청을 승인받아 생성되는 순간 준비 상태로 변경되는 것인가요?

그리고 생성과 초기화는 동일한 의미인지도 궁금합니다...

감자님의 프로필 이미지
감자
지식공유자

맞습니다.

생성과 동시에 초기화가되고 스케줄링 큐에 들어가면서 준비상태가 됩니다!

한울님의 프로필 이미지
한울
질문자

친절한 답변 정말 감사드립니다!

감자님의 프로필 이미지
감자
지식공유자

😊

한울님의 프로필 이미지
한울
질문자

1가지만 더 여쭤봐도 괜찮을까요?

생성 상태에서 PCB(프로세스)가 생성 및 초기화될 때 

초기화의 경우 초기값이 PCB(프로세스)의 각 구조별로 세팅된다는 의미인가요?

감자님의 프로필 이미지
감자
지식공유자

각 구조별로가 정확히 무엇을 말씀하시는 건지 잘 모르겠습니다.ㅠ
초기화라면 프로세스 ID와 메모리 위치, 프로그램이 시작되어야할 위치에 프로그램 카운터를 설정등을 해줍니다!

프로세스의 각 구조별로가 프로세스마다 라는 뜻이였다면 맞습니다.
PCB는 프로세스마다 개별적으로 가지고 있습니다. (프로세스 A는 PCB A, 프로세스 B는 PCB B)

만약 각 구조별로가 PCB구조를 설명한 그림의 구조를 말한다고한다면 모든 값들이 초기값을 가지는게 맞습니다. 초기엔 특별한 값이 없으니 메모리 공간도 빈 공간이고 프로그램 카운터도 프로그램의 시작주소로 세팅되는 것입니다!

한울님의 프로필 이미지
한울
질문자

앗 PCB그림 구조에 있는 구조들(포인터,프로그램 카운터 등...)을 말한 것이었습니다!

답변 정말 감사드립니다

한울님의 프로필 이미지
한울
질문자

몇 가지만 더 궁금한 것이 생겼습니다..ㅠㅠ

1. 생성 상태일 때, 메모리 적재 요청을 송신하는 것과 수신하는 것은 무엇인가요?

(ex. A가 메모리 적재 요청을 했고 B가 승인했다..일 때 A,B가 궁금합니다) 

 2. 맨 처음 질문 중 2번째 질문에서 말한 예시가 PCB A -> PCB B -> PCB C를 말한 것이었는데

서로 다른 프로그램에 기반을 둔 프로세스라도 복사가 되어서 부모-자식 프로세스가 될 수 있는 것인가요?

감자님의 프로필 이미지
감자
지식공유자

1. 생성 상태일 때, 메모리 적재 요청을 송신하는 것과 수신하는 것은 무엇인가요?

보통 프로세스를 생성하는 것은 커널이 진행하는데 송신과 수신을 전부 커널이합니다.
메뉴얼을 봐도 커널이라고만 나와있어서 다른 말이 있는지 정확히 모르겠네요.. ㅎㅎ 

2. 맨 처음 질문 중 2번째 질문에서 말한 예시가 PCB A -> PCB B -> PCB C를 말한 것이었는데 서로 다른 프로그램에 기반을 둔 프로세스라도 복사가 되어서 부모-자식 프로세스가 될 수 있는 것인가요?

모든 프로세스는 INIT 프로세스에서 각각 자식으로 만들어져서 조상은 같을 수는 있지만
다른 프로그램에서 복사된 프로세스 끼리는 부모-자식 관계가 될 수 없습니다!


한울님의 프로필 이미지
한울
질문자

그러면 서로 다른 프로그램에서 만들어진 프로세스(PCB) A,B,C가 연결리스트 형식으로 A->B->C  이렇게 연결되어 있다고 해도 부모,자식 프로세스를 가리키는 포인터에서는 전혀 다른 프로세스를 가리키게 되는 것인가요?

감자님의 프로필 이미지
감자
지식공유자

네 연결리스트로 관리하는 것은 운영체제가 전체 PCB를 관리하기 위한 리스트입니다!

자식, 부모를 가리키는 포인터와는 별개의 구조입니다.

한울님의 프로필 이미지
한울
질문자

그렇다면 이 경우에는 자식,부모를 가리키는 포인터에는 아무런 값도 들어가 있지 않은 상태인 건가요?

감자님의 프로필 이미지
감자
지식공유자

부모 프로세스는 자신이 복사된 부모 프로세스를 가리키게되고
자식 프로세스는 있을 수도, 없을 수도 있습니다!

한울님의 프로필 이미지
한울
질문자

그렇다면 만약 프로그램 A가 메모리에 올라가 생긴 프로세스 A가 있다면 이 프로세스 A의 부모 프로세스는 누가 되는 것인가요?

자꾸 여쭤봐서 죄송합니다 ㅠㅠㅠ

감자님의 프로필 이미지
감자
지식공유자

비슷한 질문에 대한 답변을 이전에 한 적이 있어서 링크 첨부해드리겠습니다!

한울님의 프로필 이미지
한울
질문자

감사합니다!