[Project 1] 밑거름 공부

민픽minpic·2023년 6월 20일
0

[TIL] Today I Learned

목록 보기
22/25


/* 해당 자료는 반효경 교수님의 운영체제 강의 자료를 기반으로 정리되었습니다.
! */

첫 주차 project1을 들어가기 전에 project1을 진행하기 위해 알아야할 개념들을 정리하고 진행하려고 한다.

프로세스 상태

Process is a program in execution!

프로세스 상태(status)는 개념적으로 5가지 정도로 나눌 수 있다.

  1. new : 프로세스가 생성되는 상태
  2. ready : 다른 조건은 모두 만족하는데, cpu가 할당되지 않아서 기다리는 상태
  3. running : cpu가 instruction을 수행 중인 상태
  4. blocked : cpu를 주어도 당장 instruction 할 수 없는 상태
  5. terminated(dying) : 수행이 끝난 상태

위에 그림에서 볼 수 있듯이, 현재 cpu에서 돌고 있는 process는 running의 상태이고, running을 기다리는 ready 상태의 프로세스들은 ready queue에서 기다리고 있다.
더불어 I/O를 기다리는 process 들은 당장 cpu가 준비되더라도 I/O가 되어야 실행할 수 있는 process들은 blocked 상태로 I/O queue에서 기다리고 있다.

더불어 공유 데이터를 사용하려고 기다리는 프로세스도 blocked 상태로 resource queue 에서 기다리고 있다.

Process Control Block (PCB)

운영체제가 각 프로세스들을 관리하기 위해서 PCB에 프로세스에 관한 정보를 담아둔다. 위에서 프로세스의 상태를 여기다 저장 한다.

Context Switch (문맥교환)

CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정을 말한다.

만약 A프로세스에서 B프로세스로 context swithch 가 일어난다고 하면, 다음과 같은 절차를 거친다.

  1. 유저모드에서 커널모드로 변경되고
  2. 커널모드 상태에서 A의 PCB에 A의 상태를 저장하고
  3. 다음에 실행 될 프로세스를 선택한다 (B가됨)
  4. B의 PCB로 부터 정보를 CPU에 저장하고,
  5. 커널모드에서 유저모드로 변경하여 프로세스를 실행한다.

여기서 무조건 인터럽트나 시스템 콜이 발생한다고 해서 문맥교환이 일어나는게 아니다.

만약 A프로세스를 실행하다가 인터럽트가 들어오면, 인터럽트 관련 루틴을 돌고 다시 A프로세스로 돌아가는 경우가 있다. 이럴 경우 프로세스가 변경되지 않는다. 즉 문맥교환이 일어난게 아니다.

하지만 timer interrupt나 I/O 요청 시스템 콜이 호출되면,
프로세스가 변경되기 때문에 문맥교환이 일어난다.

쓰레드

쓰레드는 프로세스 내에서 실행되는 흐름의 단위를 말한다. (가장 작은)


위의 그림 처럼 PCB내에 여러 쓰레드에 대한 정보가 들어간다.
쓰레드 별로 프로그램 카운터, 레지스터 세트, 스택 스페이스를 포함한다.

쓰레드를 사용하면 좋은 점이 몇 가지 있다.
1. 응답이 빠르고 2. 자원을 공유하고 3. 경제적이고 4. cpu가 여러 개면 병렬로 사용이 가능

만약에 쓰레드가 없이 프로세스들로만 프로그램이 작동된다면, 위에서 문맥 교환이 일어날때 처럼, 매번 프로세스가 변경될 때마다, 데이터들을 저장하고 cpu에게 정보를 넘겨주는 작업들이 반복된다. 왜냐하면 프로세스 별로는 메모리를 공유하지 않기 때문이다.

그런데 쓰레드를 사용하게 되면, 메모리를 공유하게 되어 문맥 전환에 부하가 적고, 응답이 빠르다. 즉 경제적이다.

하지만 메모리를 공유하게 되면서 동기화의 문제를 겪게된다. 그런 동기화를 잘 이루게 해줄 수 있는 방법이 몇 가지 있다.

동기화를 처리하는 방법 3가지

  1. lock()/unlock()
  2. 카운팅 세마포어
  3. 모니터

LOCK() / UNLOCK()

현재 running 중인 쓰레드가 공유 자원을 사용하려고 할 때,
lock을 소유하는 다른 쓰레드가 있는지 확인하고(holder 확인), 없다면 자신이 소유하면서 다른 쓰레드가 접근하지 못하도록 lock을 걸어, 자신이 사용하는 동안 사용하지 못하게 하는 방법이다.

lock의 holder는 즉 뮤텍스이다.
뮤텍스는 프로세스나 스레드가 공유자원을 lock()을 통해 잠금을 설정하고, 사용한 후에는 unlock()을 통해 잠금을 해제하는 객체이다.

profile
사진찍는 개발자 / 한 가지 개념이라도 깊이있게

0개의 댓글