CS 정리 | OS | 3. 프로세스 관리 (2) | kocw 반효경 교수님

Konseo·2023년 9월 7일
0

운영체제

목록 보기
6/19

프로세스 상태도

  • 자신의 코드를 수행할 때는 User mode에서 running 됨
  • system call을 통해 커널의 코드를 수행 중일 때에도 해당 프로세스는 여전히 kernel mode에서 running 중임
    • 즉, 본인과 상관없는 interrupt에 의해 CPU가 OS에게 뺏겼다고 하더라도, 이것은 여전히 running 중이라고 간주한다.
    • ex. A 프로그램이 아닌 타 프로그램이 IO작업 완료 후 발생시킨 인터럽트
  • Blocked 상태에서 Suspended 됐더라도 이벤트가 발생하거나 IO작업이 완료되는 경우에 Syspended Ready 상태로 바뀔 수 있음

Thread

  • 기존 프로세스는 메모리 주소공간에 stack, data, code 가 존재하고 OS에는 해당 프로세스에 대한 PCB가 존재한다고 하였음.

💡 생각을 해봅시다
내가 만약 워드파일을 10개 띄운다면 각 10개의 프로세스가 생성됨. 하지만 해당 프로세스들은 모두 같은 실행프로그램이기 때문에 stack 영역은 다르더라도 적어도 code 영역은 같을 것임.

즉, 동일한 실행 프로그램에 대해서 여러개의 프로세스를 띄우게 되면 code나 data 영역들이 중복되어 메모리에 올라가게 됨 -> 메모리 낭비. 비효율 🤮

  • CPU가 수행하는 부분만 별도로 갖고 ( = 스레드), 다른 영역은 share 하는 구조
  • 스레드는 결국 CPU 수행 단위이며 lightweight process로도 불림
  • 스레드의 구성
    • PC
    • 레지스터 집합
    • stack space
  • 동료 스레드와 공유하는 부분 (=task)
    • code section
    • data section
    • OS resources
  • 전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있음

스레드의 장점 1

  • 다중 스레드로 구성된 테스크 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다.

  • 비동기식 입출력은 스레드 환경에서 효과적으로 사용된다.

  • 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.

  • 스레드를 사용하면 병렬성을 높일 수 있다.

스레드의 장점 2

  • responsiveness
    • ex. multi-threaded Web
      • if one thread is blocked (eg.network)
      • another thread is continue (eg. display)
  • resource sharing
  • economy
    • creating & CPU switching thread(rather than a process)
    • 솔라리스의 경우 위 두 가지 오버헤드가 각각 30배, 5개 더 걸림
  • utilization of MP(멀티프로세서) Architectures

스레드 구현 방법

  • Some are supported by kernel
    • 이미 OS가 스레드 개념을 알고 있도록 구현하는 것 (OS가 스레드를 지원)
    • kernel thread
  • Others are supported by library
    • User threads
    • 프로세스 내부에서 사용자 프로그램 단에서 스레드 진행

프로세스 생성

  • 부모 프로세스(parent process)가 자식 프로세스(children proess)를 생성
  • 부모와 자식은 각각 별개의 프로세스임
  • 프로세스의 트리(계층 구조) 형성
  • 프로세스는 자원을 필요로 함
    • OS로부터 받는다
    • 부모와 공유한다
  • 자원의 공유
    • 부모와 자식이 모든 자원을 공유하는 모델
    • 일부를 공유하는 모델
    • 전혀 공유하지 않는 모델
  • 수행 (Execution)
    • 부모와 자식은 공존하며 수행되는 모델
    • 자식이 종료(termicate)될 때까지 부모가 기다리는(wait) 모델
  • 주소 공간 (address space)
    • 자식은 부모의 공간을 복사함 (binary + OS data)
    • 자식은 그 공간에 새로운 프로그램을 올림
  • 유닉스의 예
    • fork() 시스템 콜이 새로운 프로세스를 생성
      • 부모를 그대로 복사 (PID를 제외한 OS data + binary
      • 주소 공간 할당
    • fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림

프로세스 종료

  • 프로세스가 마지막 명령을 수행한 후 OS에게 알려줌 (Exit)
    • 자식이 부모에게 output data를 보냅 (via wait)
    • 프로세스의 각종 자원들이 OS에게 반납함
  • 부모 프로세스가 자식의 수행을 종료시킴 (abort)
    • 자식이 할당 자원의 한계치를 넘어서는 경우
    • 자식에게 할당된 태스크가 더 이상 필요하지 않는 경우
    • 부모가 먼저 종료(exit)하고 싶은 경우
      • OS는 부모프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않음
      • 단계적인 종료

프로세스와 관련한 시스템 콜

fork() 시스템 콜

  • A process is created by the fork() system call
int main()
{
  int pid;
  pid = fork()
  if (pid==0) /* this is child */
    printf("Hello, I am child")
  else if (pid>0) /* this is parent */
    printf("Hello, I am parent")
}
  • fork()되어 생성된 프로세스는 자신이 자식 프로세스인지 부모 프로세스인지 알지 못함
  • 따라서 fork() 실행 시 반환되는 pid를 통해 부모/자식을 구분
    • Child process : pid = 0
    • Parent process : pid > 0

exec() 시스템 콜

  • A process can execute a different program by the exec() system call
    • replaces the memory image of the caller with a new program
  • 즉, execlp() 실행 순간 완전히 새로운 프로그램이 덮어씌워지는 것임. 따라서 execlp() 아래의 코드는 수행되지 않음
int main()
  print("hello");
  execlp("bin/date","bin/date",(char*)0);
  print("bye");
  • ex. ls-l
    • execlp("ls","ls","-l",(char *)0);
  • 보통 자식에게는 fork()후 execlp()를 통해 새로운 프로그램을 돌림

wait() 시스템 콜

  • 프로세스 A가 wait() 시스템 콜을 호출하면
    • 커널은 child가 종료될 때까지 프로세스 A를 sleep시킨다 (blocked 상태)
    • 예시
      • 커맨드 창에 vi A 를 입력하면 A에 대한 편집창이 뜨고, 편집창이 닫힐 때까지 커맨드에 명령어를 입력할 수 없음 (cf. 쉘==하나의 프로세스)

exit() 시스템 콜

  • 프로그램을 종료시키는 함수
  • 자발적 종료
    • 마지막 statement 수행 후 exit() 시스템 콜을 통해 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌
  • 비자발적 종료
    • 부모 프로세스가 자식 프로세스를 강제 종료시킴
      • 자식 프로세스가 한계치를 넘어서는 자원 요청
      • 자식에게 할당된 테스크가 더 이상 필요하지 않음
    • 키보드로 kill, break 등을 친 경우
    • 부모가 종료하는 경우
      • 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨

프로세스 간 협력

  • 독립적 프로세스
    • 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
  • 협력 프로세스
    • 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
  • 프로세스가 간 협력 메커니즘(IPC: Interprocess Communication)
    • 메시지를 전달하는 방법
      • message passing : 커널을 통해 메시지 전달
    • 주소 공간을 공유하는 방법
      • shared meemory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 메커니즘

    🤔 그렇다면 thread도 협력 프로세스에 속하는 개념일까?
    thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만, 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능하다

message passing 기법

  • 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고고 통신하는 시스템
  • Direct Communication
    • 통신하려는 프로세스의 이름을 명시적으로 표시
      • `Process P` (`Send(Q, message)`) -> `Process Q` (`Receive(P,message)`)
  • Indirect Communication
    • mailbox(또는 port)를 통해 메시지를 간접 전달
      • `Process P` (`Send(Q, message)`) -> Mailbox M -> `Process Q` (`Receive(P,message)`)
      • 이 경우는 mailbox를 먼저 열어본 프로세스에게 메시지가 전달됨.
      • 즉, 수신자가 명시되지 않음

shared memory 기법

  • 원칙적으로는 각 프로세스가 독립적인 주소 공간을 갖기 때문에 메모리 공간이 공유되지 않음
  • 두 프로세스 간 서로 신뢰할 수 있다는 전제하에 shared memory를 구성해야함
profile
둔한 붓이 총명함을 이긴다

0개의 댓글