[운영체제] 프로세스 관리

이명우·2023년 3월 23일
1

Computer Science

목록 보기
4/9

🔷🔷프로세스🔷🔷

프로세스란?

❓ 개념

Process is a program in execution

프로세스의 문맥(context)?

  • 프로세스가 현재 어떤 상태에 있는지를 일컫는 개념 (프로세스의 출생에서 사망까지)

  • 현재 이 프로세스는 CPU를 얼마나 썼는가? 과거에 메모리를 얼마나 사용했는가? 얼마나 진행 되었는가? 등 현재 상태를 나타내는 것이 프로세스의 문맥

process context의 분류

  1. CPU의 하드웨어 문맥

    • program counter : CPU가 프로세스의 주소공간 어디에서 code를 실행했는지를 가리키는 값
    • 각종 register : 현재 상태에서 CPU의 레지스터에 어떤 값을 넣고 있었는가
  2. 프로세스의 주소 공간

    • code, data, stack : 변수나 데이터의 값이 얼마인지? 함수가 몇개 실행되었고 어디가 실행되고 있는지 등
  3. 프로세스 관련 커널 자료구조

    • PCB

    • Kernel stack : 그 프로세스의 커널 스택에 어떤 내용이 들어있는지?

프로세스의 상태

  1. Running : CPU를 사용하고 있는 상태

  2. Blocked(wait, sleep) : CPU를 할당해도 무의미한 상태(I/O 등이 만족되지 않음, ex_디스크에서 file을 읽어와야 하는 경우, 키보드 입력이 들어와야하는 경우)

  3. Ready : 모든 준비가 끝났고, CPU의 사용을 기다리는 상태

New(프로세스 생성중인 상태), Terminated(프로세스가 종료중인 상태) 등도 존재

Blocked 상태가 해소되면?

❗ Blocked 상태가 해소되어도 바로 운영체제에 CPU를 할당하는 것(시스템콜)이 아니라, I/O 장치의 컨트롤러들이 인터럽트를 걸고, 프로세스는 Ready상태가 되어 주소를 복사한 후 Ready queue에 주소를 입력하게 된다.

Running에서 Ready?

Timer interrupt가 걸리게 되면, 다시 프로세스가 Ready queue에 들어가서 줄을 서야한다. 이런 경우에는 Running 상태에서 Ready상태가 될 수 있다.

프로세스 상태도

Process Control Block(PCB)

운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보

  • 운영체제 커널의 주소공간에 PCB가 하나씩 있음

구성 요소

  1. OS가 관리상 사용하는 정보 : 프로세스 상태, 프로세스 ID, 스케줄링 정보, 우선도

  2. CPU 수행 관련 하드웨어 값

    • Program counter, registers -> 즉 프로세스의 문맥을 PCB에 저장하는 것

문맥 교환(Context Switch)

CPU가 한 프로세스에서 다른 프로세스로 넘어가는 과정

이 과정에서 일어나는 문맥의 저장과 로드는 PCB를 통해서 하게 됨.

❗ 내어주는 프로세스의 입장 : CPU가 한 프로세스에서 다른 프로세스로 이동할 때, CPU를 내어주는 프로세스는 PCB에 현재 프로세스의 문맥을 PCB에 저장한다.

❗ 받는 프로세스의 입장 : 이전까지의 문맥을 PCB에서 읽어온다.

사용자 프로세스 A가 실행되다가 운영체제에게 서비스를 받고(시스템 콜) 다시 프로세스 A 실행 -> 문맥교환 X

사용자 프로세스 A가 실행되다가 인터럽트가 들어온 프로세스를 Ready queue에 넣는 과정(이 때 CPU는 커널에게 내어주게됨) -> Ready queue에 넣고 다시 CPU가 A에 할당 되기 때문에 문맥교환 X

사용자 프로세스 A에 CPU가 할당 되어있던 중 timer interrupt 발생, 사용자 프로세스 B에게 CPU할당 -> 문맥교환 O

사용자 프로세스 A가 I/O 요청으로 인한 system call 발생 -> I/O를 처리해야하기 때문에 다른 프로세스로 CPU 할당 -> 문맥교환 O

📆스케줄러(Scheduler)

운영체제의 일부, 스케줄링을 하는 코드를 일컫는 말

스케줄러의 종류

  1. 장기 스케줄러(메모리 스케줄러) : 프로세스에 메모리를 할당하는 결정(ready 상태)

    • 흔히 알고있는 운영체제에는 장기스케줄러가 없음 -> 곧바로 메모리를 할당 받게됨(바로 ready상태)

    • 예전의 시스템에서는 존재했던 개념

  2. 단기 스케줄러(CPU 스케줄러) : CPU를 어떤 프로세스에 할당할지 결정(running 상태에 둘 프로세스 결정)

  1. 중기 스케줄러(Swapper) : 프로세스에게서 메모리를 빼앗는 결정

    • 메모리가 부족할때 특정 프로세스를 메모리에서 통째로 도려냄

    • 장기 스케줄러가 없기 때문에 필요해지는 스케줄러

    • degree of Multiprogramming을 제어

    degree of Multiprogramming : 현재 메인 메모리에 존재하는 활성화된 일의 수

    active -> inactive : swap out
    inactive -> active : swap in

중기 스케줄러에 의해 추가되는 프로세스의 상태

❗ Suspended(stopped) : 외부적인 이유로 프로세스의 수행이 정지된 상태, 프로세스가 통째로 디스크에 swap out 된다.(메모리를 통째로 빼앗긴 상태) ex) 사용자가 프로그램을 일시 정지시킨 경우.

  • Blocked와 Suspended 상태의 차이 : Blocked 상태의 경우 특정한 조건(I/O 완료 등)이 만족되면 Ready 상태로 넘어갈 수 있는 반면에, Suspended 상태의 경우에는 외부에서 임의로 프로그램을 resume 해주어야 한다.

📦 Thread

프로세스 내에서 실행되고 있는 흐름의 단위

각 스레드 별로 레지스터 값 및 stack에는 다른 위치와 다른 값이 존재함. 동일한 프로세스 내에서 여러 스레드를 실행할 수 있고, 이는 효율성을 챙길 수 있는 경우가 된다.

스레드란?

  • A thread(or lightweight process) is a basic unit of CPU utilization

  • Thread의 구성

    • program counter
    • register set
    • stack space
  • Thread가 동료 thread와 공유하는 부분(=task)

    	* code section
    • data section
    • OS resources
  • 다중 스레드 : 한 스레드가 blocked 상태인 경우에도 동일한 테스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있게 된다.

Benefits of Threads

  • 응답성(Responsiveness) : 다중 스레드의 경우 다른 스레드가 blocked여도 running될 수 있음

  • 자원 공유(Resource Sharing) : 동일 프로세스 내 스레드 끼리는 여러 자원을 공유하기 때문에 효율적이다.

  • 효율적 : 프로세스 한 개 생성 vs 스레드 한 개 생성을 비교했을 때, 스레드 한 개를 만드는 것이 전자에 비해 매우 효율적이다. 따라서 여러 프로세스를 만드는 것보다 한 프로세스 내에 스레드를 여러개 생성하는 것이 좋음

  • 병렬성 : 가령, 1000X1000의 2차원 행렬을 코어가 하나인 CPU로 계산한다고 했을 때, 일일이 계산을 해줘야 함, 하지만 코어가 여러개인 CPU가 스레드 여러개로 병렬적인 계산을 할 경우 훨씬 더 효율적인 계산이 가능함

스레드의 구현

Kernel Threads

  • 스레드를 운영체제가 알고 있는 경우, 운영체제 커널이 직접 스레드에게 지원

  • 서로 다른 스레드가 운영체제에게 서로 다른 프로세스로 간주됨

  • 커널이 스레드를 인지하고 있을 경우 A라는 스레드에서 B라는 스레드에게 CPU를 넘기는 방식

User Threads

  • 운영체제는 프로세스에게 CPU를 할당

  • 사용자 프로그램 단위에서 지원하는 스레드이기 때문에 프로세스가 스레드에 CPU를 할당

⏯ 프로세스의 생성 및 종료

프로세스의 생성

  • 부모 프로세스가 자식 프로세스 생성(복제 생성)

  • 프로세스의 트리(계층 구조) 형성 : 프로세스의 족보

  • 프로세스의 자원 : 운영체제로부터 받거나 부모와 공유(이례적인 경우)

  • 수행 (Execution) : 부모와 자식은 공존하며 수행되는 모델, 자식이 terminate 할때까지 부모가 기다리는 모델도 존재

  • 주소 공간(Address space) : 자식의 주소공간 = 부모의 공간 복사, 자식이 실행될 경우 부모가 있던 그 위치에서 실행이 됨

  • fork() 시스템콜 이후에 exec() 시스템 콜을 하면서 새로운 프로그램을 자식 프로세스에 덮어 씌움 (부모와 동일한 프로세스 실행이 되는걸 막기 위함)

프로세스의 종료

✔ 과정

case 1 : 프로세스가 마지막 명령 수행 -> 자식이 부모 프로세스에게 이를 알림 -> 프로세스의 각종 자원들이 운영체제에게 반납됨

case 2 : 부모 프로세스가 자식의 수행을 종료시킴(abort)

  • 자식이 할당 자원의 한계치를 넘어서는 경우

  • 자식에게 할당된 테스크가 더 이상 필요하지 않은 경우

  • 부모가 종료(exit)하는 경우 : 프로세스끼리는 계층구조를 갖기 때문에 부모를 종료시키기 위해서 자식을 종료시킨다.

fork() 시스템 콜

  • 자식 프로세스를 하나 생성하기 위한 커널 호출 함수

  • 코드 내에서 fork()가 실행됐을 경우, fork() 이후의 코드부터 자식 프로세스 실행

❓ 자식과 부모의 구분은 어떻게? : pid 값을 부모에게는 양수, 자식에게는 0 할당하여 구분, pid 값에 따라서 다른 구문 실행, 만약 pid 값이 없을 경우에는 동일한 작업 수행(보통 이런 경우는 없음)

exec() 시스템 콜

int main()
	printf('\n Hello');
    execlp('bindata', 'bindata',(char *)0);
    printf('\n Hello');
)

execlp() 이후로 완전히 새로운 프로그램으로 바뀌게 됨. pid값이 있을 경우 자식과 부모를 구분하여 자식에게는 execlp()를 적용하는 식으로 다른 작업을 수행할 수 있게 함

wait() 시스템 콜

프로세스 A가 wait() 시스템 콜을 호출 -> 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다(blocked상태) -> childprocess 종료 -> 커널이 프로세스 A를 깨운다(ready 상태)

exit() 시스템 콜

  1. 자발적 종료
  • 프로세스가 정상적으로 종료할때 호출되는 시스템 콜
  • 호출시 프로그램을 종료시키게 됨
  1. 비자발적 종료
  • 부모 프로세스가 자식 프로세스를 강제 종료(자식 프로세스의 과도한 자원 요청, 자식 태스크가 더 이상 필요하지 않음)
  • 키보드로 kill, break 입력
  • 부모가 종료됨(부모가 종료하기 전에 자식이 종료되어야함)

🤲 프로세스 간 협력

  1. 독립적 프로세스 : 다른 프로세스의 수행에 영향을 미치지 못함

  2. 협력적 프로세스 : 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음

  3. 프로세스 간 협력 메커니즘 (IPC:Interprocess Communication)

  • 메시지를 전달하는 방법
    (1)message passing : 커널을 통해 메시지 전달
  • 주소 공간의 공유
    (1)shared memory : 메모리를 공유하여 공유된 공간에서 커뮤니케이션(시스템 콜을 통해서 프로세스 간 메모리를 공유하게 됨)
    (2)thread : 사실상 하나의 프로세스 이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능

Message Passing

  • message system : 프로세스 사이에 공유 변수를 일체 사용하지 않고 통신하는 시스템
  1. Direct Communication : 통신하려는 프로세스의 이름을 명시적으로 표시
  1. Indirect Communication : mailbox or port를 통해 메시지 간접 전달

자료 출처 : 이화여자대학교 반효경 교수님 운영체제 강의

profile
백엔드 개발자

0개의 댓글