10. 프로세스와 스레드

10.2 프로세스 상태와 계층구조

10.2.1 프로세스상태

여러 프로세스가 다양한 상태를 가지고 있다.
이런 상태를 pcb에 기록해서 관리하고 있다.

1.생성상태
이제 막 메모리에 적재되어 PCB를 할당받은 상태
준비가 완료되었다면 준비상태로

2.준비상태
당장이라도 CPU를할당받아 실행할 수 있지만
자신의 차례가 아니기에 기다리는 상태
자신의 차례가 된다면 실행상태로 된다.(=디스패치)

3.실행상태
CPU를 할당받아 실행중인 상태
할당된 시간을 모두 사용시(타이머 인터럽트 발생시) 준비상태로 돌아간다.
실행 도중 입출력장치를 사용하면 입출력 작업이 끝날때까지 대기상태로 간다.

4.대기상태
프로세스가 실행 도중 입출력 장치를 사용하는 경우
입출력 작업은 CPU에 비해 느리기때문이 에 경우 대기상태로 접어든다.
입출력 작업이 끝나면 (입출력 완료인터럽트를 받으면) 준비상태로 간다.

5.종료상태
프로세스가 종료된 상태
PCB, 프로세스 메모리영역을 정리한다.

10.2.2 프로세스 계층구조

대부분의 운영체제에서 프로세스를 계층적으로 관리한다.
프로세스 실행도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.

새 프로세스를 생성한 프로세스 : 부모 프로세스
부모 프로세스에 의해 생성된 프로세스 : 자식프로세스

부모 프로세스와 자식은 별개의 프로세스 이므로 각기 다른 PID를 가진다.
일부 운영체제에서는 자식프로세스 PCB에 부모 프로세스 PID(PPID)를 명시하기도한다.

자식은 또다른 자식을 낳고 그 자식이 또다른 자식을 낳을 수 있어서 계층적인 구조를 가지게 된다.

최초프로세스는 컴퓨터라 부팅될때 실행되는 프로세스라고 할 수 있다.
이프로세스들이 자식을 트리처럼 가지를 친다.

10.2.3 프로세스 생성기법

(윈도우와는 큰 관련이 없다.)
부모 프로세스가 자식 프로세스를 어떻게 만들어내고 자식 프로세스는 어떻게 자신만의 코드를 실행할까?

위 사진에서 로그인 프로세스가 어헏게 배쉬프로세스를 실행햇고 어디의 메모리에 적재되어 있을까

많은 운영체제애서는 복제와 옷갈아입기를 사용해서 생성한다.

부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성한다. - 복제
자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리공간을 다른 프로그램으로 교체한다. - 옷갈아입기

10.2.3.1 fork 시스템호출

복사본(= 자식 프로세스 생성)
부모 프로세스의 자원 상속 (메모리 내용, 열린파일의 목록 등)

완전히 복사한것이지만 엄연히 다른 프로세스라 pid가 다르다.

자식이 부모와 완전 동일한 내용을 가지게 된다.
이대로 실행하게 되면 똑같은 프로세스를 동시에 실행하는 것이다.
여기서 자식이 exec시스템호출을 한다.

10.2.3.2 exec시스템 호출

메모리 공간을 새로운 프로그램으로 덮어쓰기
코드/데이터 영역은 실행할프로그램으로 변경되고 나머지 영역은 초기화된다.

bash영역의 프로세스에서 ls라는 명령어를 쳤다고 해보자.
->
fork시스템호출을 통해서 자신과 동일한 시스템을 만들어낸다.
->
자식프로세스는 exec시스템 호출을 통해서 ls라는 명령어를 실행하기 위한 코드로 변환한다.
->
옷을 갈아입고 자식 프로세스를 실행하게 된다.

부모프로세스가 자식프로세스를 부르는 것은 이 과정이 반복되는 과정이라고 할 수 있다.

10.3 스레드

스레드를 할때 하드웨어 스레드가 아닌 소프트웨어 스레드를 기준으로 만들 것이다.
실무에서는 이 스레드르 반드시 고려하며 만드는 경우가 많다.

스레드는 프로세스를 구성하는 실행 흐름의 단위이다.
하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.

하나의 프로세스는 여러개의 스레드로 동시에 실행할 수 있다.

실행흐름이 여러개인 프로세스 (멀티 스레드 프로세스)는 여러 명령어를 동시 실행가능하다.

스레드는 무엇으로 구성되어잇길래 어떻게 실행흐름을 나눌 수 있나?

스레드의 구성요소
스레드 ID 프로그램 카운터를 비롯한 레지스터값 스택 등
실행에 필요한 최소한의 정보를 가지고 있다.

그래서 스레드마다 다른 프로그램을 실행할 수 있게된다
이를 병행해서 실행하게 된다.

중요한점은 스레드들은 실행에 필요한 최소한의 자원을 가지고 있다.
프로세스의 자원을 공유하면서 실행된다.
같은 코드영역 힙영역 데이터영역을 공유하고 있다.

프로세스를 이루는 스레드들은 그 자원을 공유할 수 있다.

최근 CPU자원을 할당하는게 프로세스에 할당하는게아니라 요즘 운영체제는 스레드단위로 CPU를 할당하고 실행한다.

10.3.1 멀티 프로세스 VS 멀티 스레드

동일한 작업을 수행하는 단일 스레드 프로세스 여러개 실행
VS
하나의 프로세스를 여러 스레도로 실행

어떤차이점이 있을까

화면에 HELLO OS를 실행하는 프로세스가 있다고 해보자.
3번포크를 하면 프로세스가 3개만들어진다.
이것이 동시에 3번 실행되서 3번 출력되게 될 것이다.

반면에 프로세스에 실행흐름을 3개만들면
똑같이 3번출력되게 될 것이다.

프로세스끼리는 기본적으로 자원을 공유하지 않고
스레드는 같은 프로세스의 자원을 공유하고 있다.

그래서 만약 프로세를 fork하면 코드데이터힙영역등 모든 자원이 복제되어 생성된다.
저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두개가 통째로 메모리에 적재된다.
(쓰기식 복사를 사용하면 통채로 복사하지 않는다. 그렇지만 현재는 통채로 복사한다고 이해해보자)

스레드들은 각기 다른 스레드 ID
프로그램 카운터 값을 포함한 레지스터값 스택을 가질뿐
프로세스가 가지는 자원을 공유한다.

따라서
스레드는 멀티프로세스에 비해 자원을 공유하기 때문에 협력에 강점이 있다.
그렇지만 항상 좋은 것은 아님!

멀티프로세스에서 하나의 프로세스가 문제생기면 다른 프로세스에 영향을 미치지 않거나 거의적지만
멀티스레드에서느 하나에 문제가생기면 전체에 영향을 미칠 수 있다.

그래서 주의해야한다.

기본적으로 프로세스간 자원을 공유하지 않지만
자원을 주고받을 수 있다. 이를 프로세스간 통신 IPC라고 한다.
파일을 통한 프로세스간 통신, 공유 메모리를 통한 프로세스 간 통신

2023.09.27

일단 공간을 만들고 자식의 코드를 넣는다.
쓰레드끼리는 자원을 공유하기가 쉽고
프로세스끼리는 자원을 공유하기가 어려운이유에 대해서 알지 못했는데
아예 처음부터 하나의 프로세스안에서 쓰레드가 같은 자원을 사용하고 있음을 이해하니 그 이해가 쉬워졌다.

'개념정리 > 컴퓨터 구조 및 운영체제' 카테고리의 다른 글

2023.09.21 운영체제  (0) 2023.09.28
2023.09.12 운영체제  (0) 2023.09.12
2023.09.08 컴퓨터구조  (0) 2023.09.09
2023.09.06 컴퓨터구조  (0) 2023.09.06
2023.09.05 컴퓨터구조  (0) 2023.09.06

+ Recent posts