[CS] 운영체제 - 프로세스와 스레드

이상혁·2023년 9월 19일
0

Computer science

목록 보기
10/15
혼자 공부하는 컴퓨터 구조 + 운영체제를 읽고 공부한 내용입니다.

프로세스 개요

프로그램이 실행이 되기 위해서 메모리에 적재하고 실행이 되면 프로세스가 된다.

프로세스 종류

프로세스는 2가지의 종류가 있는데 포그라운드 프로세스백그라운드 프로세스가 있다.

포그라운드 프로세스는 사용자가 보는 앞에서 실행되는 프로세스이다.
백그라운드 프로세스는 사용자가보지 못하는 뒤편에서 실행이 되는 프로세스이다.

프로세스 제어 블록(PCB)

프로세스는 정해진 시간만큼 CPU를 이용하고 시간이 끝나면 다른 프로세스에게 양보하고 다음 자기차례가 올 때까지 기다린다.
이 때, 운영체제는 프로세스 제어 블록(PCB)을 사용한다.

PCB는 프로세스와 관련된 정보를 저장하는 자료 구조이다.
PCB는 커널영역에 생성이 된다.
운영체제는 PCB를 통해서 프로세스를 식별하고 프로세스를 처리하는데 필요한 정보를 판단한다.

PCB안에는 많은 정보가 있는데 프로세스ID, 레지스터 값, 프로세스 상태, CPU 스케줄링 정보, 메모리 관리 정보, 사용한 파일과 입출력장치 목록이 있다.

프로세스 IDPID라고 하기도 하는데, 프로세스를 식별하기 위해 부여하는 고유한 번호이다.

레지스터 값은 프로세스가 자신의 실행 차례가 돌아오면 이전에 작업을 그대로 이어가 위해서 중간의 값들을 저장한다.

프로세스 상태는 현재의 프로세스가 어떠한 상태인지 기록한 정보이다.
현재 입출력 장치를 쓰기 위해서 기다리는 상태인지, CPU를 기다리는 상태인지 정보가 저장되어 있다.

CPU 스케줄링 정보 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록이 된다.

메모리 관리 정보는 프로세스마다 메모리에 저장이 된 위치가 다른데 어느 주소에 저장이 되어 있는지에 대한 정보이다.

사용한 파일과 입출력장치 목록은 프로세스가 실행 과정에서 특정 입출력 장치나 파일을 사용하면 PCB에 해당 내뇽이 명시가 된다.

문맥교환

프로세스가 PCU를 할당을 받아서 사용하다가 다른 프로세스에게 CPU를 넘겨주는 줄 때,
CPU를 넘겨 주는 프로세스의 정보가 백업이 되어야 한다.
그래야 다음에 차례가 돌아올 때 백업한 정보를 가지고 다시 실행을 할 수 있다.

이렇게 실행을 재개하기 위해 필요한 정보를 문맥이라고 하고 문맥은 PCB에 저장이 되어 있다.

프로세스가 교체 되는 과정을 살펴보면
프로세스A가 실행이 되고 있고 프로세스B로 넘겨주어야 한다.
프로세스 A는 다음 차례의 실행 재개를 위해서 문맥을 백업해야 한다.
그래서 프로세스A의 PCB에 문맥을 저장하고
프로세스B의 PCB 문맥을 가지오면서 프로세스B를 실행한다.

이러한 과정을 문맥 교환이라고 한다.

프로세스의 메모리 영역

사용자 영역에서 프로세스는 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장이 된다.

코드 영역은 실행할 수 있는 코드인 기계어 명령어가 저장이 된다.

데이터 영역은 프로그램이 실행이 되는 동안 데이터가 저장이 되는 공간이다.
이 공간을 크기가 고정된 영역으로 정적 할당 영역이라고 한다.

힙 영역은 프로그래머가 직접 할 당할 수 있는 공간이다.

스택 영역은 대이터를 임시적으로 저장하는 공간이다.

프로세스 상태와 계층 구조

프로세스는 여러 상태를거치며 실행이 되는데 생성 상태, 준비 상태, 실행 상태, 대기 상태, 종료 상태가 있다.

생성 상태는 이제 막 메모리에 적재되어 PCB를 할당 받은 상태이다.
실행할 준비를 마치면 곧바로 실행이 되는 것이 아니라 준비 상태가 된다.

준비 상태는 당장이라도 CPU를 할당을 받아 실행을 받을 수 있는 상태이다.
아직 자신의 차례가 아니라 기다리고 있다.

실행 상태는 CPU를 할당을 받아서 실행 중인 상태이다.
일정 시간 CPU를 사용하게 되면 준비 상태로 돌아간다.
이 때, 입출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태로 변한다.

대기 상태는 입출력 장치의 작업을 기다리는 상태이다.
입출력 장치의 작업이 끝나면 다시 준비 상태로 돌아간다.

종료 상태는 프로세스가 종료된 상테이다.

이 과정을 표로 나타낸 것이 프로세스 상태 다이어그램이다.

프로세스 계층 구조

프로세스는 실행 도중 시스템 호출을 통해서 다른 프로세스를 생성할 수 있다.
이 때, 새로운 프로세스를 만든 프로세스를 부모 프로세스라고 하고,
부모 프로세스에의해 생성된 프로세스를 자식 프로세스라고 한다.

부모 프로세스와 자식프로세는 엄연히 다른 프로세스이기 때문에 각기 다른 PID를 가진다.
대신 부모 프로세스에 PID는 자식 프로세스의 PPID로 저장이 된다.

컴퓨터가 실행이 될 때, 최초의 프로세스가 실행이 되고 자식 프로세스들을 생성하고 생성된 자식 프로세스들이 새로운 프로세스들을 낳는 형식으로 프로세스가 동시에 실행이 된다.
이 과정이 트리형식으로 구조를 가지는데, 이를 프로세스 계층 구조라고 한다.

프로세스 생성 기법

부모 프로세스는 fork를 통해서 자신의 복사본을 만든다.
그리고 이 복사본은 exec를 통해서 자신의 메모리 공간을 다른 프로그램으로 교체를 한다.
여기서 forkexec는 시스템 호출이다.

자세히 살펴보면 부모 프로세스가 fork를 통해서 복사본을 만들면 부모 프로세스의 자원들, 메모리 내의 내용등 모든 것이 똑같이 복사가 된다.
exec를 호출하면 새로운 프로그램으로 덮어쓰여지는데 코드영역과 데이터 영역이 실행이 될 새로운 프로그램의 코드와 데이터로 변경 되고 나머지 영역을초기화가 된다.

스레드

스레드실행의 단위이다.
즉, 프로세스를 구성하는 실행의 흐름의 단위이다.

프로세스와 스레드

이전에 프로세스는 프로세스가 하나의 작업만을 처리했다.
하지만 스레드라는 개념이 도입이 되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다.
여기서 중요한 점은 스레드는 프로세스의 자원 공유한다.

멀티 프로세스와 멀티 스레드

프로세스들이 동시에 실행이 되는 것을 멀티 프로세스,
스레드로 프로세스들이 동시에 실행이 되는 것을 멀티스레드라고 한다.

멀티 프로세스와 멀티 스레드의 차이는 기본적으로 자원을 공유하는데 있어서 있다.
멀티 프로세스는 자원을 각자가 독립적으로 가지고 있지만 멀티 스레드는 다른 스레드들과 공유를 한다.
멀티 프로세스는 복제가 되면 통제로 메모리에 적재가 되어서 자기 자신만의 자원을 갖는다.
멀티 스레드는 스택영역만을 자기 자신이 가지고 있기 때문에 나머지 영역에 자원을 공유가 된다.

그렇기 때문에 멀티 프로세스는 메모리가 크지만 독립적이기 때문에 다른 프로세스에 영향을 주지 않는다.
반대로, 멀티 스레드는 메모리를 아낄 수 있지만 같은 자원을 공유하고 있어서 다른 스레드에 영향을 줄 수 있다는 단점이 있다.

profile
개발 공부 하기 위해 만든 블로그

0개의 댓글