본문 바로가기

Computer Science/OS

프로세스의 중단과 재시작, 스레드의 개념과 상태 변화

프로세스의 중단과 재시작

중단된 상태라는게 있습니다.

 

준비, 대기 는 실행중인 것은 아니지만 메인 메모리에 올라와 있어야 합니다.

 

중단 상태 - 디스크로 잠시 미뤄저 있어도 되는 에들

 

메모리에 있는지 없는지가 중단, 활동 상태의 기준이 된다.

 

 

왜 중단 될까요?

메모리에 올라와서 활동 프로세스에 있는게 밀려나서 중단 상태로 가는 이유들 입니다.

 

Swapping - 메모리에 있는 너무 많은 프로세스를 중단상태(하드 디스크)로 내려놓습니다.

 

Interactive user request - 사용자가 일부러 중단 시켜놓습니다.

 

Timing - 프로세스 자체는 가끔 돌아갑니다.

 

Parent process request - 부모가 일부러 자식을 중단상태로 만들 수 있습니다.

 

 

 

1번 입니다 

메모리에서 제거하지 디스크에서 제거 하지 않습니다.

 

 

 

프로세스의 관리 - 프로세스의 우선순위 

사람이 타이핑 하면 화면에 빨리 나와야 합니다.

하지만 디스크에서 읽어들이고 출력하는 것은 느려도 됩니다.

즉, 응답에 관해서는 좀 느려도 됩니다.

 

입출력 중심 프로세서는 프로세스 자체가 빨리 끝나는 건가요? 

프로세스 사용했다가 - 입출력 사용했다가 -프로세스 사용했다가 - 입출력 사용했다가  하는 것입니다.

그런데 프로세스를 사용하는 시간이 짧은 것입니다.

한번 cpu를 사용하는 시간이 짧다는 것입니다.

 

PCB에 우선순위(프로세서 스케줄링 정보)가 적혀있습니다.

 

우선운위에 따라서 준비 상태 프로세스 리스트를 구성합니다.

 

스케쥴러가 우선순위를 이용해서 cpu를 할당합니다.

준비 상태에 있는 프로세스 중에 누구를 할당할지 

 

 

누가 cpu를 차지할 것인가가 제일 중요합니다.

 

 

 

 

 

 

프로세스의 관리 - 프로세스의 문맥 교환

무슨 상태였을까? 실행 상태, 준비 상태

 

유저 프로그램이 시스템 콜을 해서 커널모드로 들어갑니다.

PCB에 뭔가 저장하고 PCB에 꺼내오는 것은 사용자 모드에서 할 수 없는 것 입니다.

 

PCB를 스케쥴러가 관리하기 때문에 커널 영역에 들어있습니다.

 

 

준비 상태로 바꿀 때 cpu를 놓으니깐 현제 프로세스를 PCB를 저장하고

다른 PCB로 있는 것을 cpu에 넣어서 돌립니다.

 

프로그램을 돌리고 있는데

scanf와 같은 명령어가 내려온겁니다.(내부적으로는 시스템 콜이 일어납니다.)

그럼 실행중인 프로세스를 cpu가 대기 상태로 가게 하고 문맥 교환이 일어 납니다.

 

시스템 콜 (= 소프트웨어 인터럽트)

 

 

입출력 완료 인터럽트가 일어나면 반드시 문맥 교환이 일어나는가?

아닙니다. 준비상태로 가기 때문 입니다.

 

 

 

 

스레드의 개념과 상태 변화

- 스레드의 개념

- 단일 스레드와 다중(멀티) 스레드

- 스레드의 사용 , 상태 변화, 제어 블록

 

 

 

스레드의 개념과 상태 변화 - 스레드의 개념

제어와 관련된 것은 다 따로 가지고 있습니다.

왜 레지스터와 스택이 제어와 관련되어 있는것인가요? 실행상태이기 때문입니다.

 

실행하다가 함수 콜이 일어나면 스택에 쌓여야 하니 제어와 관련된 부분입니다.

병렬 수행은 기계가 다른 곳에서(=cpu가 여러대)

 

병행 수행은 cpu 하나에서 실행합니다.

 

동일한 주소공간공유는 한 쓰레드 내에 코드는 없습니다. 코드는 같이 사용합니다.

데이터 영역, 힙,전역변수도 마찬가지 입니다.

 

왜 스택이 별도의 스레드에 필요할까요?

스택은 사실 실행 기록입니다.

호출 기록을 가지고 있어야 합니다.

함수 호출이 일어나면 내가 돌아갈 자리를 알고 있어야 합니다.

 

쓰레드를 경량 프로세스 라고도 부릅니다. 

상대적으로 가볍다고 느낍니다.

원래 프로세스를 중량 프로세스라고 부르기도 합니다.

 

오른쪽이 하나의 프로세스 입니다.

 

스레드는 각각 따로 스택을 가지고 있습니다.

 

 

전체는 한 프로세스가 차지 하고 있는 메모리 공간입니다.

 

한 프로세스는 여러개의 스레드를 가질 수 있습니다.

공통적으로 힙, 데이터, 코드를 가질 수 있습니다.

스레드는 각각 스택을 가지고 있습니다.

스레드의 스택 포인터를 가지고 스레드 안에 함수 호출을 알 수 있습니다.

 

프로그램 카운터는 다음에 실행할 명령어 주소 입니다.

스레드 프로그램 포인터(=프로그램 카운터)는 

스레드 들은 같은 코드를 실행하고 있습니다. 하지만 같은 코드에서 다른 곳을 실행하고 있습니다.

 

 

 

 

스레드 병행 수행의 이점

 

스레드 들이 동시에 수행되는 것입니다.

여러 실행흐름으로 나눈게 뭐가 좋은지 보여줍니다.

화면 곳곳을 스레드로 따로 붙힙니다. ui를 통해 뭘 시켰는데 시간이 걸리는 일이 되었는대도 다른 곳에서 다른 스레드가 실행 될 수 있습니다.

 

 

프로세스를 2개 이상 써서 실행시키면 자원을 공유하는데 메모리 공유나, 메세지 패싱(통신방법)이 필요합니다.

하지만 스레드들은 통신을 쉽게합니다.

 

어떻게 쉽게 할까요?

같은 프로세스 안에서 힙, 데이터, 코드들을 공유하기 때문에 마치 전역변수로도 공유할 수 있습니다.

 

cpu입장에서 스레드를 바꾸는건 프로세스 내에서 스레드를 바꾸는 것 입니다.

문맥 교환은 cpu의 할당을 바꾸는 것입니다.

할당을 바꾸려면 PCB를 이동시켜야 하니 더 자원(=오버해드)이 많이 듭니다.

 

스레드의 크기 자체가 작으니깐 저렴합니다.

프로세스를 만들려면

이것을 다 만들어야 합니다.

스레드는 그것보다 크기가 작습니다.

맨위에 PCB가 있습니다.

 

 

 

 

 

스레드의 개념과 상태 변화 - 단일 스레드와 다중(멀티) 스레드

스레드라는 계념이 나오기 전 왼쪽 상태였습니다.

 

 

기본적인 자원은 공유하되 실행적인 자원만 따로 가지고 있습니다.

 

 

4번 입니다.

독립적인 다중 수행도 할 수 있습니다.

 

 

4번 입니다.

 

하나의 프로세스는 여러개의 스레드를 공유할 수 있습니다.

스레드는 하나의 프로세스에 속합니다.

 

 

스레드의 개념과 상태 변화 - 스레드의 사용 , 상태 변화, 제어 블록

Multithreaded Server Architecture

서버는 요청을 처리한느 스레드를 하나만들어서 처리하고 서버는 돌아서와서 다시 응답을 받을 준비합니다.

 

 

워드 편집기 프로세스는 3개의 스레드를 쓰는거 같습니다.

각자 독립적으로 돌아갑니다.

 

비동기적 요소를 구현한 예라는 뜻은 무엇일까요?

입력을 받았을 때 신호의 상관없이 수행하는 것입니다.

불규칙한 신호가 올 때 그 때 그 때 수행하는 것 입니다.

무슨 일을 하는 시간에 맞출 필요가 없습니다.

 

각 스레드 들은 각자 할일을 합니다.

 

 

RPC - 네트워크에서 멀리 떨어지는 것을 콜 하는것 입니다.

RPC 하면 서버에 요청을 합니다.

맨 위에는 스레드를 사용하지 않고 프로세스 1개로만 합니다.

 

스레드를 2개로 나눴지만 cpu는 여전히 하나입니다.

대기하고 있는 동안 다른 스레드가 도는 것입니다.

 

P스레드를 이용해서 스레드를 구현한 예 입니다.

 

스레드를 create했는대 스레드 변수의 주소를 주었습니다.

 

스레드를 실행할 때 무슨일을 실행할지 줘야합니다. 그것을 함수로 주었습니다.

 

이 프로세스 안에 몇개의 스레드가 있을 까요? = 독립적으로 실행 흐름이 총 몇개인가?

3개 입니다.

main 스레드, 스레드1, 스레드2 로 총 3개입니다.

 

 

 

 

파이썬를 이용해서 스레드를 구현한 예 입니다

 

스레드를 선언 합니다.

실행은 start()를 해야합니다.

 

그다음에 join은 해야하는데 

프로세스 wait와 비슷합니다. join까지 기다립니다.

실행 흐름이 합쳐지는 것입니다.

 

2번째 스레드가 오래 걸린다면 가다렸다가 t2.join()이 끝날 때 까지 기다립니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90