Process and Concurrency(13)

G·2022년 11월 20일
0

2-2 System programming

목록 보기
11/15
post-custom-banner

Proccess and Concurrency

Content

  • Process
  • Context Switching
  • Concurrent Proceses: 병행성은 Multiprocess(+ 4가지의 syscall), Multithreading, 동기화와 데드락, 스케줄링, 분산프로그래밍(어떠한 프로세서들에게 할당할 것인가?)
  • Process Control
  • Fork: Creatin New Processes
  • Fork-Exec Model

Prgram

프로그램이란 디스크에 있는 데이터와 instruction이 저장된 실행 가능한 이진 파일이다. 그냥 이진 데이터이다. 각 오브젝트들이 합쳐져 하나의 파일로 바뀌었다. 오브젝트에선 안 보이던 Segment header table이 생겼다. 이는 오브젝트에 대한 index 정보가 담겨 있는 section이다.
얘네들을 크게 코드와 데이터로 추상화시킬 수 있다. 그리고 symbol table은 load되지 않는다. 그냥 linking, debugging을 위한 정보이다.
요약해서, Program이란 데이터와 코드가 디스크에 있는 상태를 뜻한다. 그렇기 때문에 state가 없다.

Process

process란 수행 중인 또는 가능한 Program을 뜻한다. 이 포스트에선 실행 중인 Program의 instance를 뜻 한다. 프로세스엔 state가 존재한다. instruction이 작동하며 메모리나 레지스터가 변경되기 때문에 state가 변경된다. 디스크에 있을 때 section이란 단어를 썼지만, 실행 중인 프로세스엔 segment란 표현이 쓰인다. 같은 성질을 가진 데이터의 집합이다.(code segment, data segment 등)
프로그램이 실행가능하려면 메모리에 load가 되어야 한다. code와 data는 그대로 올라온다.(loading time) 이후 stack과 heap이 프로세스를 위해 초기화가 된다. 프로그램이 실행되려면, 커널이 관리를 해야하기 때문에 커널 영역에 process control block라는 data structure가 각 프로세스마다 생성된다 이름, PID, 디스크 위치, 부모 프로세스 등 메타데이터를 저장한 자료구조이다. 이를 PCB라 한다.

프로세스 단위에서 핵심적인 가상화를 제공한다 각 프로세스가 실행 중일 때, 하나의 프로세스만 수행되는 것이 아니라 여러개의 프로세스가 백그라운드에서 실행되게 된다. 사용자는 그냥 하나의 프로세스만 실행되는 것으로 생각하게 된다. 이것을 illusion이라고 한다. 다시, 멀티 프로세스가 백그라운드에서 실행되고 있다. 이걸 어떻게 가능하게 할까? round robin scheduling을 통해 사용한다. 시간 단위(time slices)로 나눠서 이 시간을 기반으로 여러개의 프로세스를 swtiching한다. 이것을 context switching이라고 부른다.
각 프로세스마다 weight에 따라 time sharing을 한다.
virtual address space, 마치 혼자 하나의 프로세스를 위해 메모리를 다 쓰고 있는 것 같은 illusion을 준다. virtual memory에 기반을 한 것이다. 실제는 없는데 있는 것 같은 것을 칭할 때 virtual 단어를 사용한다.(실제로 메모리를 혼자 쓰고 있는 것 같지만, 그렇지 않기에 일루전을 준다. 그래서 virtual이란 단어를 사용한다. 가상계좌도 여기에 포함된다.)

Multiprocessing: The illusion


멀티프로세싱이란 여러개의 프로세스가 메모리에 올라와 있고 동시에 프로세스를 수행한다.

  • 한 명 이상의 사용자가 어플리케이션을 사용한다.
  • 백그라운드에서 다른 프로세스가 작동한다.

Multiprocessing: The Reality(Single Core)


CPU가 하나인데, 어떻게 여러개의 프로세스가 실행될까? 위에서 time sharing을 통해, CPU scheduler가 다음 프로세스를 선택하는 context switching이 일어난다고 했다.
이를 process들이 interleaved 되어 있다고 한다. context swtiching이 일어날 때 "프로세스가 끼어든다"라고 표현한다.

A라는 프로세스가 수행되고 있다가 메모리 영역을 사용하다가, 커널로 인해 context swtiching이 개입이 되면 레지스터 정보가 문제가 된다. 이 부분은 공유되는 자원이기 때문에. 다른 프로세스가 overwrite한다면 다시 프로세스가 사용될 때 의미가 없는 데이터가 되어버린다. 그렇기 때문에 context swtiching이 일어나기 이전에 정보를 다른 곳에 저장해야한다. 저장공간이 PCB안에 있는 Saved area(register)이다.

switch 이후 다시 switch되어 A 프로세스로 돌아온다면 다시 정보를 load해야 한다.

Multiprocessing:(Modern) Reality


CPU가 두 개라도 방법은 같다. 주 메모리를 공유한다. 그리고 각각의 CPU는 다른 프로세스를 실행한다.

Multiprocessing: The Reality


이런 식으로 병행적인 context switching으로 인해 사용자는 하나의 프로세스만 실행한다는 일루전이 생긴다. Virtualizing CPU라고 불리운다.

Context switching


프로세스는 커널 코드에 의해 관리된다.(별도의 프로세스가 아니다.) A 프로세스가 실행되다 read라는 syscall가 호출된다면 커널모드로 모드가 바뀐다.(핸들러의 개념이 그대로 적용) 그래서 read function이 수행된다.
유저 프로세스의 부분으로써(질문) 실행되는 것이다. 그런데 read가 실행되는 동안 사용자가 입력을 하지 않는다면 그 동안 실행할 process switch가 실행된다. 그럼 프로세스 B의 커널모드가 실행된다. 이때 프로세스 B의 중단되었던 정보가 전부 load된다. 그리고 유저모드로 돌아간다.(그 밑 부분은 그냥 넘기겠다.)

Independent Logical Control Flow

Private address space

Concurrent Processes


다시 Illusion에 대한 내용이다. A와 B를 보자. A의 시작 이후 context switching을 통해 B가 실행된다. B가 interleaved가 되었다. A를 사용하고 있는 사용자 입장에선 그냥 CPU가 A만을 위해서 작동한다고 생각할 수 있다. 그런데 A 프로세스 사이에 B와 C로 switching이 일어난다. 이를 다시 한 번 illusion이라 부른다

  • A와 B, A와 C는 Concurrent하다.
  • B와 C는 Sequential하다.

사실 우리의 눈에는 이렇게 보인다.

사용자가 보는 시각을 parallel(물리적으로 동시에 실행됨, 병렬성)하다고 칭한다. parallel은 concurrent의 부분집합이 된다.

Processes

네 개의 프로세스 관리 함수를 알아보고 관계를 이해해보자.
fork(), exec(), exit(), wait() 어떤 목적으로 사용되는지, 네 가지의 함수를 알아보자.

실습해보고 이해해ㅗ자

Creating New Processes and Program

  • fork()라는 syscall을 이용하여 수동으로 프로세스를 만드는 것을 알아보자.
  • Cloning: fork를 호출한 프로세스를 부모 프로세스라한다. 이 부모 프로세스를 복제한다.
    부모 복제본의 copy를 만든다 생각하면 된다. 이게 자식 process가 된다. 부모의 메타데이터와 다른 메타데이터를 받는다.
  • Replacing: 새로운 process를 만드는 것이 아니라, new program으로 코드와 data가 바뀐다. PID는 같은데 프로그램이 새로 실행된다. 이것을 exec() 함수가 실행한다.
    그러므로 Cloning + Replacing은 fork() + exec()이다.
    요약적으로 부모의 프로세스를 복제하여 새로운 프로세스를 만들고 여기에 프로그램을 실행시켜 자식 프로세스를 만드는 것이다.


getty는 터미널 준비를 위한 소프트웨어이다. login을 위한 프로세스로 fork하는 것이 아니라 replace만 하는 것이다. login은 새로운 프로그램을 실행시키는 것이다. 점선은 계속해서 프로그램을 실행하는 것이다.

fork: Creating New Processes


fork() syscall은 한 번 호출하면, 두 번 리턴이 된다. 이게 무슨 뜻일까? 한 프로세스에서 fork를 호출하면 두 가지의 값이 리턴된다. 부모 프로세스에겐 리턴값이 양수이다. 리턴값이 0이면 자식 프로세스를 의미한다.
양수와 0이 리턴되는 것이다.

pid_t fork(void)

  • 새로운 자식프로세스를 생성한다. pid를 제외하고 부모 프로세스와 동일하다.
  • OS는 부모 프로세스와 완전히 동일한 복제본을 생성한다.
    부모 프로세스이 메모리를 그대로 복사하여 만들어진다.(stack, heap), return value(%rax)만 제외하고 레지스터의 정보도 그대로 복사한다. File descriptors도 공유한다.(뒷장에서)

    Parent가 fork를 호출했을 때, 자식 프로세스가 생성되고 두 프로세스가 작동되는 것을 확인할 수 있다. 그리고 두 프로세스는 분리되어 있다. 자식 프로세스가 업데이트 되었다고 부모 프로세스에 반영되는 것은 아니다.

    pid_t type은 integer이다. Fork 함수로 리턴값을 받는다면 자식은 0이고 부모는 양수이다.
    두 개의 프로세스가 생긴다면 Fork 함수가 반환된 이후에 부모프로세스, 자식프로세스 모두 동작한다. Fork 리턴 이후 네 번째 줄부터 동작한다. 자식 프로세스는 2가 출력, 부모 프로세스는 0이 출력된다.

Modeling fork with Process Graphs

새로운 프로세스를 만들며 출력값들을 분석할 때 어려울 수 있다. 맞는 출력인지, feasible(실현 가능한) 한지를 판단하기 위한 도구로 Process Graph를 알아볼 것이다. notation으로 a -> b 는 a가 b보다 먼저 일어났다는 것이다.

main에서 Fork를 호출하면 branch가 하나 생길 것이다. parent 부분을 보면, printf를 출력한다. 이것을 label을 써준다. 그리고 종료한다. 이렇게 Process Graph를 만들어 출력값이 feasible 한지 알아볼 수 있다.
이것을 topological sort라 할 수 있다. 선후관계를 기반으로 정렬한 것이다.
printf이전에 exit가 나온다면 feasible하지 않다. 왜냐하면 시간상, 순서상 가능하지 않기 때문이다.

위의 graph는 a->b->(e,c)->(f,d) 시간상으로 잘 맞는다.
그런데 밑의 graph는 a->b->(e,c) 부분에서 f가 나왔기 때문에 가능하지 않은 graph이다. infeasible하다.
추가로 edge가 존재하지 않는 부모 프로세스의 printf와 자식 프로세스의 printf중의 선후관계는 알 수 없다. single core라고 가정했을 때, 스케쥴러에 의존적이기 때문에 그렇다.

Fork-Exec

Fork sys call만 본다면 단순히 A process를 복제하는 것이다. 똑같은 프로세스 두 개가 생기는 것이다. 자식 프로세스를 만드는 이유는 새로운 프로그램을 실행하기 위함이다. 이 부분을 Exec sys call이 해결해준다.
exec()

  • 한 번 호출하면 절대 리턴하지 않는다.: 프로세스가 분리된다는 것이다.
  • heap, stack이 새로 초기화된다.
  • 새로운 프로그램이 자식 프로세스에 할당된다.
    fork()를 호출했을 때, 부모의 stack pointer와 PC값이 모두 같은데, exec() 호출을 한다면, stack pointer가 초기화가되고, PC도 초기화가 된다. 만약 process가 ls라면 PC가 ls 프로그램의 시작 entry point로 초기화되는 것이다.(무슨 소린지 잘 모르겠다..)


ls 커맨드 입력시 구조이다.
환경변수에서 ls의 경로를 찾아 fork()과 exec()을 하여 ls에 있는 code와 data 부분이 채워지게 되며 별도의 프로그램을 실행하게 된다.

profile
열심히 안 사는 사람
post-custom-banner

0개의 댓글