운영체제 #2 프로세스와 병행성 1

yeong·2022년 11월 5일
0

운영체제

목록 보기
2/3

예전에는 컴퓨터가 비싼 놈이었다. 컴퓨터가 일을 하고 사람이 기다려야지, 사람이 일을 하는 동안 컴퓨터가 기다리게 하는 것은 돈을 펑펑 날리는 일이었다. 그래서 사람들은 실행하고 싶은 것을 요청했고, 컴퓨터는 이를 순서대로 하나씩 실행했다. 그래서 당시의 컴퓨팅 시스템은 지금보다 단순했다.
그런데... (지난 포스팅에 쓴 것처럼) 컴퓨터는 짱짱 발전했고, 동시에 여러 사람의 여러가지 요청을 수행할 수 있는 시대가 도래했다.

한번에 여러 개의 프로그램이 동시에 실행되려면(병렬성) 어떤 일들이 일어나야 하는가?

프프, 애펙, 포토샵, 일러가 동시에 실행되고 있다면,
이 프로그램들이 한순간에 실행되고 있는 것인가?
답은 '아니다'. 한 순간에 실행되고 있는 것은 네 가지 중에 하나다. 그 줄을 쓰레드라고 부른다.

  • 쓰레드: 명령어를 실행하고 있는 객체

병렬성을 어떻게 실행할지는 자원을 어떻게 할당하느냐의 문제다

  • 자원 1) CPU 시간 : 어느 순간 누가 CPU를 점령하고 있느냐
  • 자원 2) 메모리 : 어느 쓰레드(프로세스)가 어느 부분의 메모리에 접근하고 읽고 쓸 수 있느냐

각 프로그램은 본인이 CPU시간과 메모리를 독점하고 있다고 가정하고 만들어진다. 그러나 이것은 환상 😙 OS는 자원을 각 프로그램에 나누어 할당한다. 짧은 시간을 두고 A, B, C.. 의 프로세스를 번갈아가며 실행하는 것

명령어 수행 흐름

  • 프로세서(CPU)는 메모리에서 명령어를 가져와서 하나씩 수행하고 (instruction fetch), 수행한 결과는 레지스터에 들어간다 (메모리에 들어가기도 함)
  • 명령어가 저장되어 있는 메모리의 주소는 Program Counter(PC)라는 레지스터에 기록되어 있다

프로세스

  • 프로그램을 메모리에 읽어들여 실행하기 시작하는 순간 하나의 프로세스가 만들어진다. 실행이 끝나면 프로세스가 없어진다
  • 프로세스는 명령어의 흐름과 해당 명령어가 실행되면서 사용하는 메모리와 자원으로 이루어져있다
  • 프로세스는 돌아가며 실행되는데, 만약 A라는 프로세스가 실행되다가 B라는 프로세스에게 CPU시간을 넘겨줬다고 하자. 다시 A 프로세스에게 CPU시간이 돌아온다면 OS는 적어도 어느 명령줄까지 실행되었는지를 기억하고 있어야 한다. 이를 기억하고 있는 것이 프로그램 레지스터(PC)다
  • 실행된 명령줄뿐 아니라 메모리 엑세스 정보, I/O에 대한 정보처럼 프로세스가 생존하기 위한 최소한의 정보가 필요한데, 이를 context라고 부른다.
  • context와 레지스터 값은 PCB(process control block)에 들어있고, PCB는 메인 메모리에 저장된다

스케쥴링

  • 다음 순서에 어떤 프로세스를 수행할지 결정하는 것

운영체제는 어떻게 한 프로세스의 CPU를 빼앗아와서 다음 프로세스에게 넘겨줄까?

일정 간격마다 끼어들 수 있으면 된다. 하드웨어 타이머를 설정하면 일정한 간격으로 프로세서에 interrupt를 줄 수 있다. (=timer interrupt)

이것이 발생하면 interrupt handler가 실행되고, 핸들러에서 커널에 스케쥴러를 호출한다. 스케쥴러는 지금 실행하고 있는 놈을 다음 실행할 놈으로 바꾼다. 이 행위를 context switch라고 한다.

context switch

  • context를 PCB에 저장하고, 정해진 정책에 따라 다음으로 실행할 프로세스를 고른다 (=스케쥴링) 그 프로세스의 PCB을 읽어와서 실행한다
  • 빨라야 한다

그렇다면 수행되는 각 쓰레드를 서로 다른 쓰레드로부터 어떻게 보호할 수 있을까?

  1. 메모리 경계
  2. 파일 접근 제한
  3. CPU 독점 제한

1. 메모리 경계

  • 프로그램이 실행되면 메모리 환경 내에 텍스트, 데이터, 힙, 스택 섹션이 생성되며 프로세스로 존재한다. 각 프로세스는 4GB내의 영역 내에서 서로 다른 address space를 가진다. 실제 물리적인 메모리에는 서로 섞여있지만 OS가 이를 그룹화하여 관리한다
  • 다른 프로세스가 사용하고 있는 메모리를 함부로 엿보거나 침범하거나 훼손하지 않도록 보호를 제공
  • 공간을 나눠쓴다

2. 파일 경계

3. CPU 독점 제한

  • 시간을 나눠쓴다

프로세스의 상태
OS마다 다른 이름을 가지고 있지만 대부분은 아래와 같다
1. new : 프로세스가 처음 만들어진 상태
2. ready : 시스템에 받아들여진 상태, CPU 자원을 할당하기만 하면 바로 실행될 수 있음. PCB구조로 표현되어 ready queue에 붙는다. 스케쥴러가 정책에 따라 다음번 실행할 프로세스를 결정할 때 ready queue에서 고른다. 이를 dispatch라고 한다
3. running : 실행되고 있는 상태
4. waiting : 기다리고 있는 상태, I/O가 완료되기를 기다릴 때. 어떤 이벤트가 발생하길 기다릴 때. child process가 끝나기를 기다릴 때가 이 상태에 해당됨
5. terminated : running 상태의 프로세스가 종료된 상태, 청소 작업이 일어남

profile
Yes I am

0개의 댓글