티스토리 뷰

반응형

Process Memory Layout


  • Normal function을 실행하면 stack영역을 사용한다. System callkernel stack에서 사용 후 결괏값을 stack 영역에 저장한다.
  • System call을 호출할 때마다 프로세스 1개당 kernel stack 1개를 할당한다.

 

 

 

 

 

 

  • Stack 영역
    • 함수들이 호출될 때 아래로 차면서 데이터가 저장된다.
  • Heap 영역
    • 동적 메모리가 요청될 때 위로 차면서 데이터가 저장된다.
  • Data segment
    • 전역변수가 저장된다.
  • Text segment
    • 바이너리 프로그램 코드가 저장된다.

Process 1과 Process 2는 Physical memory에서 kernel memory 영역을 공유하고 있지만, 다른 주소의 Kernel stack을 할당받아 사용하고 있다.

  • 왜 프로세는 Physical memory의 같은 Kernel memory 영역을 공유하지?
    • 물리적으로는 1대의 컴퓨터에 1개의 OS만 사용 가능하다. 하지만 1개의 프로세스당 1개의 커널 영역이 필요하다. 프로세스가 여러 개면 여러 개의 커널 영역이 필요해지기 때문에, 이를 해결하기 위해 공유된 커널 메모리를 사용한다.
  • 가상 메모리 (Process 1 & 2)에서 같은 주소의 메모리를 사용해도 상관이 없다.
    • why? Physical memory에 있는 주소로 매핑될 때 다른 주소로 변환되기 때문. But, kernel memory 영역에서 같은 주소의 메모리를 사용하면 충돌이 발생한다.

 

Process State


 

Process Control Block (PCB)


  • PCB
    • 커널 내에서 프로세스를 중요한 정보를 가지고 있는 운영체제의 자료구조

 

 

  • Process state: new, ready, running, waiting, terminated와 같은 상태를 저장
  • Process number: 프로세스 고유번호
  • Program counter: 프로세스가 실행할 instruction의 주소
  • Register: CPU 레지스터
  • Memory 관리 정보: 페이지 테이블, memory limit 또는 세그먼트 테이블 등과 같은 정보를 포함.
  • I/O 상태 정보 프로세스에 할당된 입출력 장치들과 열린 파일 목록.

 

 

 

Process Switch and PCB


Process switching에 대한 흐름

 

Scheduler


  • Long-term 스케줄러 (Job scheduler)
    • 스케줄링 알고리즘에 따라 디스크 내의 작업을 메모리로 load
  • Short-term 스케줄러 (CPU scheduler)
    • 메모리에 있는 프로세스 중 하나를 선택해서 CPU에 할당하고 연산한다.
  • 프로세스의 종류
    1. I/O bound 프로세스
    2. CPU-bound 프로세스
  • Long-term 스케줄러는 반드시 I/O-bound 작업과 CPU-bound 작업의 적절한 조합을 선택해야 한다.
    • why? CPU-bound 작업만 선택해서 처리하게 되면 모든 프로세스가 CPU만을 사용하고, I/O device는 비 가동 상태가 되기 때문

 

Operations on Processes


  • 프로세스 생성에 대한 resource
    • Execution type
      1. 부모 & 자식 프로세스가 동시에 작업을 수행을 하는 경우
      2. 부모 프로세스가 자식 프로세스의 작업이 끝날 때까지 대기하는 경우
  • 새로운 child 프로세스 생성
    • Program type
      1. 자식 프로세스가 부모 프로세스의 복사본인 경우 (fork() 함수 실행시)
      2. 자식 프로세스가 완전히 새로운 프로그램인 경우 (exec() 함수 실행 시).
  • fork() system call
    • 완전히 새로운 프로세스를 생성한다.
      • 부모 프로세스를 복제한 프로세스인 경우. 부모 프로세스와 PID만 다르다.
      • 부모와 자식 프로세스는 fork() 호출 이후 동시에 실행한다.
  • exec() system call
    • 현재 프로세스 메모리 공간을 새로운 프로그램으로 대체한다.
      • Binary 파일을 메모리로 로드하고 실행한다.
  • wait() system call
    • 부모 프로세스가 자식 프로세스의 작업이 끝나고 terminate 되기까지 대기하기 위해 호출한다.
    • 만약 부모 프로세스가 wait()를 한 번도 호출하지 않는다면?
      • 좀비 프로세스가 쌓인다. 하지만 'init' 프로세스가 주기적으로 wait()를 호출해서 자식 프로세스의 자원을 release 한다.

 

Interprocess communication (IPC)


  • IPC는 프로세스들이 데이터와 정보의 교환을 가능하게 한다.
  • 2 Types of IPC
    • Shared memory
      • 운영체제의 도움으로 메모리의 영역이 공유된다.
      • 프로세스는 간단하게 메모리로 읽기/쓰기를 한다.
      • 변경사항이 바로 모든 프로세스에게 보인다.
      • 단일 시스템에서만 가능하다. (1대의 컴퓨터에서만 사용 가능)
      • 공유된 메모리 영역만 알면 된다.
    • Message passing
      • 데이터가 메시지로써 전송된다.
      • 분산 시스템에 적합하다.
      • 상대 프로세스를 정확하게 알아야 한다.
  • Shared memory system
    • 메모리를 공유하는 프로세스는 주소 공간의 메모리 영역을 준비한다.
    • 다른 프로세스들은 공유된 메모리를 자신들의 주소 공간에 할당한다.
    • 프로세스들 간의 메모리 접근 제한을 제거하기 위해 OS의 도움이 필요하다.
    • 공유된 메모리를 어떻게 사용할지는 프로세스에게 달려있다. (OS는 관여하지 않는다.)
  • Message-passing system
    • 분산시스템에 적합하다.
    • Send와 Receive 연산이 있다.
    • 상대 프로세스를 명시하는 직접통신과 메시지 박스를 경유한 간접 통신이 있다.

 

Pipes


  • Ordinary pipe
    • 두 개의 프로세스가 producer와 consumer로써 통신한다. (통신은 단방향성이다.)
    • Ordinary pipe의 생성 (Unix 시스템만 해당)
      • pipe(int fd[])
        • fd[0]: read-end, fd[1]: write-end
      • 파이프를 생성한 프로세스(부모 프로세스)에 의해서만 접근이 가능하다.

Ordinary pipe를 통한 프로세스간 통신
Ordinary pipe의 초기화 코드 예제
Ordinary pipe의 초기화 코드 예제의 결과 이해를 돕기 위한 그림

  • Named pipe
    • 양방향(bidirectional) 통신이다.
    • half-duplex 통신이다. (양방향으로 동시에 데이터 전송이 불가능하다.)
    • 부모-자식 관계가 성립하지 않는다.
    • 한 번 생성되면 여러 프로세스가 사용할 수 있다.
    • 생명주기가 프로세스에 묶여있지 않다.
    • 프로세스들은 반드시 물리적으로 같은 PC에서 작동하고 있어야 한다.
반응형

'컴퓨터공학 > 운영체제' 카테고리의 다른 글

[운영체제] 데드락  (0) 2019.10.30
[운영체제] 프로세스 스케줄링  (0) 2019.10.29
[운영체제] 멀티스레드 프로그래밍  (0) 2019.10.29
[운영체제] 시스템 구조  (0) 2019.10.28
[운영체제] 개요  (0) 2019.10.28
댓글