학교수업, CS/운영체제

프로세스/스레드

빨대도둑 2023. 4. 12. 11:11

현대의 운영체제는 시분할 방식을 기본으로 사용하기 때문에 프로세스가 여러 상태를 오가면서 실행한다.

 

PCB

=> 운영체제는 프로그램을 메모리의 적당한 위치를 만들고 작업지시서를 만드는데 그것이 프로세스 제어 블록(PCB)이다. 프로세스 제어블록에도 프로세스를 처리하는 데 필요한 다양한 정보가 들어있다. 프로세스 제어 블록이 없으면 프로그램이 프로세스로 전환되지 못한다. 어떤 프로그램이 프로세스가 되었다는 것은 운영체제로부터 프로세스 제어 블록을 받았다는 의미이다.

- 프로세스 구분자: 메모리에는 여러 개의 프로세스가 존재하므로 각 프로세스를 구분하는 구분자가 필요하다.

- 메모리 관련 정보: CPU를 실행하려면 프로세스가 메모리의 어디에 저장되어 있는지를 알아야 작업을 할 수 있다. 이를 위해 프로세스 제어 블록에는 프로세스의 메모리 위치 정보가 담겨있다.

- 각종 중간값. 프로세스 제어 블록에는 프로세스가 사용했던 중간값이 저장된다. 시분할 시스템에서는 여러 프로세스가 번갈아 가며 실행되기 때문에 각 프로세스는 일정 작업을 한 후에 다른 프로세스에 CPU를 념겨준다.

하나의 프로세스를 실행하려면 프로세스 구분자, 메모리 관련정보, 프로그램 카운터와 각종 레지스터 같은 중간 값을 관리해야 한다. 이러한 정보를 보관하는 데이터 구조가 PCB이다. 프로그램이 프로세스가 되려면 메모리에 올라오는 것과 동시에 PCB가 생성되야 한다. PCB는 운영체제 영역에서 생성되며, 프로그램 종료 시 삭제된다.

 

프로세스 상태

- 생성상태: 프로세스가 메모리에 올라와 실행 준비를 완료한 상태. 프로세스를 관리하는데 필요한 PCB가 생성된다.

- 준비 상태: 프로세스가 CPU를 얻을 때까지 대기한다. 한 번에 하나의 프로세스만 실행할 수 있기 때문에 자기 실행 순서가 될 때까지 준비상태에서 기다려야 한다.

- 실행상태: 준비 단계에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태. 실행 상태에 들어간 프로세스는 일정 시간 동안 CPU를 사용할 권리를 가진다.

- 완료상태: 실행상태의 프로세스가 주어진 시간 동안 작업을 마치면 완료 상태로 진입한다. 완료상태는 프로세스 제어 블록이 사라진 상태를 의미한다.

- 대기상태: 입출력을 요구한 프로세스가 입출력이 완료될 때까지 기다리는 상태를 대기상태라고 한다. 작업의 효율성을 높이기 위해 입출력을 요청한 프로세스를 실행 상태에 두지 않고 대기 상태로 옮기는 것이다. 프로세스는 입출력 장치별로 마련된 큐에서 기다린다.

CPU 스케줄러: 다음에 실행할 프로세스를 선정하는 일을 담당한다. CPU 스케줄러는 준비 상태의 맨 앞에서 기다리고 있는 PCBCPU에 전달하여 작업이 이루어 지게 한다.

디스패치: 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU 스케줄러의 작업.

타임슬라이스: CPU 스케줄러에 의해 선택된 프로세스는 실행 상태에서 일정 시간 동안 작업을 하는데, 프로세스에 배당된 작업 시간을 타임 슬라이스 또는 타임 퀸텀이라고 한다.

 

휴식상태: 프로세스가 작업을 일시적을 쉬는 상태이다. =>잠시 멈춘 것. 멈춘 지역부터 재시작한다.

보류상태: 메모리에서 잠시 쫓겨난 생태=>일시 정지 상태이며 스왑영역에 보관된다.

- 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때 보류상태가 된다.

- 프로그램에 오류가 있어 실행을 미루어야 할 때 보류상태가 된다.

- 바이러스와 같이 악의적인 공격을 하는 프로세스라고 판단될 때 보류상태가 된다.

- 매우 긴 주기로 반복되는 프로세스라 메모라 밖으로 쫓겨내도 큰 문제가 없을 때 보류상태가 된다.

- 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때 보류상태가 된다.

 

문맥 교환

=>  CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업이다. 이때 PCB의 내용이 변경된다. 실행상태에서 나가는 PCB에는 지금까지의 작업 내용을 저장하고, 반대로 들어오는 PCB의 내용으로 다시 CPU가 세팅 된다. 일반적으로 한 프로세스가 자신에게 주어진 시간을 다 사용하면 발생하고, 인터럽트가 걸렸을 때도 발생한다.

문맥교환과 타임 슬라이스와의 관계: 타임 슬라이스가 너무 크면, 한 프로세스의 작업이 끝난 뒤, 다른 프로세서의 작업이 이루어질 때까지 긴 시간이 걸려 작업이 끊겨 보이며, 너무 작으면 시스템의 성능이 떨어진다. 결론적으로 타임 슬라이스는 되도록 짧게 설정하되 문맥 교환에 걸리는 시간을 고려하여 적당한 크기로 하는 것이 좋다.

 

프로세스 구조 

코드영역: 프로그램의 본문이 기술된 곳으로 텍스트 영역이라고 한다.

데이터 영역: 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아 놓은 곳이다.

스택 영역: 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아 놓은 곳이다.

프로세스는 프로그램을 실행할 때 새로 생성된다. 또한 실행중인 프로세스에서 새로운 프로세스를 복사하는 방법도 있다.

 

Fork( )

=>실행중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. 실행하던 것이다. Fork( )시스템 호출을 사용하면 실행 중인 프로세스와 똑 같은 프로세스가 하나 더 만들어 진다. 실행하던 것은 부모 프로세스이며 복사된 프로세스는 자식 프로세스라고 한다. 장점으로는 프로세스 생성속도가 빠르며, 추가 작업 없이 자원을 상속할 수 있다는 것, 시스템 관리를 효율적으로 할 수 있다는 점이 있다.

 

Exec( )

=>프로세스는 그대로 둔 채 내용만 바꾸는 프로세스 호출이다. Exec( ) 시스템 호출을 사용하면 현재의 프로세스가 다른 프로세스로 전환되며, 이미 만들어진 프로세스 구조를 재활용 하기 위한 목적으로 사용한다.

 

프로세스끼리는 약하게 연결되어 있고, 스레드끼리는 강하게 연결되어 있다.

프로세스와 스레드

멀티 태스크: 서로 독립적으로 작동하다가 필요할 때 데이터를 주고받는다.

멀티 스레드: 프로세스 내에 작업을 여러 스레드로 분할함으로써 작업의 부담감을 줄이는 프로세스 운영기법

멀티태스킹: 운영체제가 CPU에 작업을 줄 때 잘게 나누어 주는 기법=>시분할 시스템

멀티프로세싱: CPU 다수를 사용해 여러 개의 스레드를 동시에 처리하는 작업환경을 말한다. 한 개의 컴퓨터에 CPU가 많거나, 1개의 CPU내에 여러 개의 코어에 스레드를 배정해서 동시에 작동하게 하는 것이다.

CPU멀티 스레드: 한 번에 하나씩 처리해야 하는 스레드를 잘게 쪼개어 동시에 처리하는 명령어 병렬처리 기법이다.

스레드는 멀티태스킹의 낭비 요소 제거를 위해 사용되며 비슷한 일을 하는 2개의 프로세스를 만드는 대신 코드, 데이터를 공유하면서 여러 개의 일을 하나의 프로세스에서 하는 것이다.

 

프로세스 구분

프로세스는 동적 프로세스와 정적 프로세스로 나뉜다.

- 동적 프로세스: 스레드가 작업을 하면서 값이 바뀌거나 시로 만들어 지거나 사라지는 영역

- 정적 프로세스: 프로세스가 실행되는 동안 바뀌지 않는 영역

 

멀티스레드의 장단점

=> 하나의 프로세스를 여러 개의 스레드로 구성해서 복잡한 작업을 쉽게 처리 가능하다.

- 응답성 향상: 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있다.

- 자원공유: 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 작업을 원활하게 지원할 수 있다.

- 효율성 향상: 여러 개의 프로세스를 생성할 필요가 없어 불필요한 자원의 중복을 막음으로써 시스템의 효율이 향상된다.

- 다중 CPU지원: 다중 CPU가 멀티 스레드를 동시 처리하면서 CPU사용량이 증가하고 프로세스의 처리 시간이 단축된다.

단점: 모든 자원을 공유하기 때문에 한 스레드에 문제가 발생하면 전체 프로세스에 영향을 미친다.

 

멀티스레드 모델

- 사용자 스레드(1 to N 모델): 사용자 스레드는 사용자 레벨에서 라이브러리를 사용하는 스레드를 구현한다. 이때 사용자 스레드 라이브러리는 커널이 지원하는 스케줄링이나 동기화 같은 기능을 대신 구현한다. 커널 입장에서는 일반 프로세스이지만 커널이 하는 일을 라이브러리가 대신 처리하여 여러 개의 스레드로 작동하며 문맥교환이 필요없다. 하지만 커널 스레드가 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기하는 단점이 있다.

- 커널 스레드(1 to 1 모델): 커널이 멀티스레드를 지원하는 방식으로, 하나의 사용자 스레드가 하나의 커널 스레드와 연결된다. 독립적으로 스케줄링되며 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 있다. 커널 레벨에서 모든 작업을 지원하기 때문에 멀티 CPU를 사용할 수 있고, 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 계속할 수 있다. 하지만 문맥교환을 하기 때문에 오버헤드 때문에 느리게 작동한다.

- 멀티레벨 스레드(M to N 모델): 사용자 스레드와 커널 스레드 방식을 혼용한다. 대기 상태에 들어가면 다른 커널스레드가 대신 작업을 하여 사용자 스레드보다 유연하게 작업을 처리할 수 있다. 하지만 커널 스레드를 같이 사용하기 때문에 문맥 교환 시 오버헤드가 있어 사용자 스레드만큼 빠르지 않다.

=> 따라서 바르게 움직여야 하는 스레드는 사용자 스레드로 작동하고, 안정적으로 움직여야 하는 스레드는 커널 스레드로 작동한다.

 

동적할당 영역과 시스템 호출

코드 영역은 프로그램의 본체가 있는 곳이고, 데이터 영역은 프로그램이 사용하려고 정의한 변수와 데이터가 있는 곳이다. 포인터를 제외한 일반적인 변수는 선언할 때 그 크기가 결정된다. 따라서 코드 영역과 데이터 영역은 프로세스가 실행되기 직전에 위치와 크기가 결정되고, 실행 동안 변하지 않으므로 정적 할당 영역이라고 한다.

스택영역과 힙 영역은 프로세스가 실행되는 동안 만들어지는 영역으로 그 크기가 늘기도 하고 줄어들기도 하는 동적 할당 영역이다.

 

스택영역을 사용하는 작업

- 첫째: 호출한 함수가 종료되면 함수를 호출하기 전 코드로 되돌아와야 하는데, 되돌아올 메모리의 주소를 스택에 저장한다.

- 둘째: 스택은 변수 사용 범위에 영향을 미치는 영역을 구현하는데 사용된다. 변수는 전역변수와 지역변수로 나뉘는데, 전역변수는 프로그램 내에 있는 모든 함수에서 사용할 수 있고, 지역 변수는 특정 함수에서만 사용할 수 있다. 지역 변수는 함수가 호출될 때만 사용되다가 함수가 종료되면 사용한 공간을 반환해야 하는데, 지역 변수를 저장할 때 스택이 사용된다.

=>조금이라도 빨리 작동하는 프로그램을 만들고 싶다면 모든 코드를 main( )함수에 집어넣고 함수 호출을 최소화하면 스택을 유지하는 비용이 절약되어 프로그램 속도가 빨라진다.

=> 같은 프로그램이라도 메모리 공간을 많이 사용하는 프로그램은 공간을 적게 사용하는 프로그램보다 느리다.

'학교수업, CS > 운영체제' 카테고리의 다른 글

교착상태  (0) 2023.04.12
프로세스 동기화  (0) 2023.04.12
스케줄링  (0) 2023.04.12
버스, 버퍼, 캐시  (0) 2023.04.12
운영체제의 개요  (0) 2023.04.12