○Signal

 ▷프로세스에 특정 사건이 일어났음을 알리는 작은 메세지

 

 ▷Exception, interrupts와 유사

 ▷Kernal -> Process

 ▷작은 Int값 ID로 식별

 

 ▶전송

  ▷Kernal이 Destination pprocess에 전달

  ▷Destination process의 내용의 상태를 Update함으로써 전달.

 

  ▶전달하는 경우

   ▷Kernal이 system event (SIGFPE, SIGCHLD)를 감지했을 경우

   ▷process가 다른 process에게 kill Signal을 보낸 경우

 

  ▶전달 방법

   ▷kill 명령어로전달 (pid / grp)

   ▷Ctrl-c / Ctrl-z

   ▷kill 함수로 전달

 

 ▶수신

  ▶동작의 종류

   ▷Ignore : 무시

   ▷Terminate : process 종료

   ▷SIGCONT 대기 : SIGCONT가 올 때 까지 정지

   ▷Catch Signal handler : Signal handler 호출 (Exception catch와 유사)

 

  ▶pnb = pending & ~block 계산

   ▷Pending되었지만, Nonblocked인 bit vector

   ▷pnb == 0 : 원래 instruction 계속 수행

   ▷pnb != 0 : signal을 받아 적절한 처리, 처리 후에는 원래 Control flow로 돌아감.

 

  ▶Signal Handler Install

   ▷handler_t *signal (int signum, handler_t *handler)

    ▷signum : Handler를 설치 할 

    ▶handler

     ▷SIG_IGN : ignore

     ▷SIG_DFL : default action

     ▷Address of user defined-function

 

   ▶handler 함수

    ▷유저가 정의한 Signal의 행동 함수

    ▷Handling중에는 동일한 Signal은 Block

    ▷동일 프로그램에서 동시에 진행되기 때문에, 주의해야함.

 

    ▶가이드라인

     ▷되도록 짧고 간결하게

     ▷async-signal-safe 함수들만 사용 - printf, sprintf, malloc은 안전하지 않음

     ▷errno를 저장하고 끝나기 전에 복원해라

     ▷shared data에 접근하는 동안 다은 signal을 막아라

     ▷global 변수를 volatile로 선언해라 (레지스터에 저장하지 않음)

     ▷global flag를 volatile sig_atomic_t를 이용해서 선언해라 (flag의 변경 - atomic하게)

 

    ※안전한 I/O 라이브러리

 

 

 ▶Pending

  ▷전송했지만, 수신되지 않은 상태

  ▷Signal은 Queue가 되지 않음 -> 동일한 Type의 Signal은 단 하나만 Pending될 수 있음 (그 뒤에 오는것들은 버림)

  ▷각 프로세스에서 bit vector로 관리 (각 Signal마다 0, 1)

 

  ▶Block (signal mask)

   ▷Pending해둔걸 받지 않고 그 상태에 놔둠

   ▷Unblock된다면, 그 때 받음.

   ▷각 프로세스에서 bit vector로 관리

   ▷sigprocmask : 명시적 Block / Unblock

   ▶Signal Mask 함수들

 

   ◎Temporarily Blocking

 

 

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Shell  (0) 2020.12.12
Process Control  (0) 2020.12.11
Exception Control  (0) 2020.12.03
Library  (0) 2020.12.01
Linking  (0) 2020.12.01

※Linux Process Hierarchy

○Shell

 ▷명령어를 받아 프로그램을 실행하기 위한 프로세스를 생성해줌.

 ▷sh, csh/tosh, bash - Default ("Bourne-Again" Shell)

 

 ◎Simple Shell eval Function

   ▶문제점

    ▷background jobs에 대해 Child가 zombie로 남을 수 있음

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Signal  (0) 2020.12.12
Process Control  (0) 2020.12.11
Exception Control  (0) 2020.12.03
Library  (0) 2020.12.01
Linking  (0) 2020.12.01

●Process

 ▷실행중인 프로그램

 

 ▶Abstraction (추상화)

  ▶Logical Control Flow

   ▷각 프로그램이 각자의 CPU를 가지고 있는 것 처럼 행동함.

   ▷Context Switching에 의해 구현

 

  ▶Private Address Space

   ▷각 프로그램이 독립된 메모리 공간을 가지는 것 처럼 행동함

   ▷Virtual Memory에 의해 구현

 

 

 ▶Reality 

  ▶Traditional

   ▷하나의 Processor가 여러개의 프로세스를 번갈아가며 동시에 실행

   ▷레지스터를 Saved registers에 저장하고, 다음 Process를 실행

 

  ▶Modern

   ▷Multicore Processors (여러 CPU가 하나의 Chip에 있음, 여러 Process 동시 실행 가능)

 

 

 ▶Context Switching

  ▷각 프로세스는 각자의 control flow를 가진다.

  ▷만약 프로세스들의 flow가 겹치면, 이는 Concurrently하게 진행된다.

  ▷그렇지 않으면 Sequential하게 진행된다.

 

  ▶Kernal

   ▷프로세스는 메모리 상주 시스템 OS인 kernal에 의해 관리됨.

   ▷Context switch를 일으킴.

 

 

 ▶Process Groups

  ▷하나의 부모 (foreground process)에 대해 여러 개의 자식(background process)가 존재

  ▷getpgrp() : 현재 프로세스의 Group

  ▷setpgid() : 프로세스의 Group을 바꾼다.

 

○Process Control

 ▶Process ID 얻기

  ▷pid_t getpid(void) : 현재 process의 PID 반환

 

  ▷pid_t getppid(void) : 부모 process의 PID 반환

 

 

 ▶프로세스 종료

  ▷행동이 terminate인 signal을 받음.

 

  ▷main routine에서 return

 

  ▶void exit(int status)

   ▷exit status를 status로 설정하고, 종료시킴

   ▷0이면 종료 성공, 아니면 에러

   ▷단 한번만 호출되며, 리턴되지 않음.

 

 

 ▶프로세스 생성 (Child process)

  ▶int fork(void)

   ▷Child 프로세스를 생성함.

   ▷Child에는 0을, Parent에는 Child의 PID를 return함.

   ▷Child는 Parent와 거의 유사함. (Parent의 Virtual Address Space, Open File Descriptor를 복사함 (하지만 메모리를 공유하지는 않음))

   ▷Child는 Parent와 Concurrent하게 진행됨.

   ▷한번 호출되면, 2번 return됨 (Parent, Child)

 

  ▶Process Graph

   ▷Vertex : Statement의 실행

   ▷Edge a->b : a다음에 b가 일어남

   ▷Edge에 현재 변수를 기록 가능

   ▷printf Vertex는 출력을 기록 가능

   ▷Inedge가 없는 vertex에서 시작 (Start vertex)

   ▷topological sort :  모든 Vertices의 순서가 왼쪽에서 오른쪽으로 감. -> feasible (발생가능)

 

  ▶Reaping/Waiting Child process

   ▷Zombie 상태의 Child process를 제거

    ▷zombie : 종료되었지만, 시스템 리소스를 차지하는 상황

   ▷Parent가 kernal에 exit status information을 전달하면, Kernal에서 이를 제거

   ▷Parent가 먼저 종료되면, init 프로세스가 대신 제거

 

  ▶Synchronizing Child

   ▶int wait(int *child_status)

    ▷Child 프로세스가 종료할 때 까지 Parent 프로세스가 대기한다.

    ▷Child process PID return

    ▶child_status!=NULL 이라면 MACRO를 통해 status 확인 가능

     ▷WIFEXITED : 정상적인 종료라면 true

     ▷WEXITSTATUS : 정상적으로 종료된 child의 status

 

   ▶int waitpid(pid_t pid, int& status, int options)

    ▷특정 Child에 대해 wait 가능

    ▷옵션 설정 가능

 

  ▶int execve(char *filename, char *argv[], char *envp[])

   ▷동시에 다른 프로그램 시행 가능

   ▷파일 : obj, 스크립트, 실행 파일...

   ▷env : 환경 변수

   ▷Parent에서 복사한 Code, Data, Stack을 Overwrite한다. (PID는 유지)

   ▷return

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Signal  (0) 2020.12.12
Shell  (0) 2020.12.12
Exception Control  (0) 2020.12.03
Library  (0) 2020.12.01
Linking  (0) 2020.12.01

○Exception Control

 ▷CPU는 단순히 명령을 읽고, 실행하기만 함. -> 시스템 상태 변화에 대응하기 힘듬.

 ▷예외 상황에 대응하기 위해 Kernal 사용

 

 ▶Exception

  ▷특정 event에 대응항져 Control을 User에서 Kernal로 이전시킴.

  ▷각 event는 고유한 exception handler를 가짐.

 

  ▶Asynchronous Exception

   ▷외부 프로세서의 interrupt pin에 의해 발생

   ▷next instruction을 return

   ▷Timer interrput, I/O interrupt from external device

 

  ▶Synchronous Exception

   ▶Traps

    ▷의도적인 Exception

    ▷next instruction을 return함

    ▷system calls, breakpoint traps, special instructions

 

   ▶Faults

    ▷의도적이지 않지만, 복구 가능한 Exception

    ▷current instruction을 다시 시도하거나, abort

    ▷page faults, protection faults(unrecoverable), floating poinr exceptions

 

   ▶Aborts

    ▷의도적이지 않고, 복구 불가능한 Exception

    ▷Abort함.

    ▷illegal instruction, parity error, machine check

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Shell  (0) 2020.12.12
Process Control  (0) 2020.12.11
Library  (0) 2020.12.01
Linking  (0) 2020.12.01
Memory Performance  (0) 2020.11.24

○Static Library (.a)

 ▷여러 개의 Relocatable Object File을 모아 index가 있는 하나의 파일로 만든다.

 ▷unresolved external reference를 resolve하면 이를 reference하게 한다.

 

 ▶생성

  ▷.o 파일을 한데 묶어 생성

 

 ▶Linking

 

 

 ▶자주 사용되는 Library

  ▷C Standard Library (libc.a)

  ▷C Math Librarry (libm.a)

 

 

 

○Dynamic Library (.so, DLLs)

 ▶Static Library의 단점을 보완하기 위해 새롭게 고안된 라이브러리

  ▷라이브러리 코드가 실행 파일내에 내장되기 때문에, 실행 파일의 크기가 커진다.

  ▷라이브러리가 동시에 여러 파일에 포함되어 실행되면 메모리 공간 효율이 떨어짐

 

 ▷필요시에 사용할 수 있도록 최소한의 정보만 포함하거나, 독립적으로 DLL을 로드/사용/해제 가능

 

 ▶Linking

  ▶load-time linking

   ▷exe 파일이 처음 load되고 실행될 때, link함. (.so)

 

  ▶run-time linking

   ▷프로그램 실행 중에 dlopen()을 통해 link함. 

   ▷dlopen(), dlsym() 작업이 선행되어야 함.

   ▷사용이 끝난 뒤에는 dlclose()를 해주어야 함.

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Process Control  (0) 2020.12.11
Exception Control  (0) 2020.12.03
Linking  (0) 2020.12.01
Memory Performance  (0) 2020.11.24
Cache Memory  (0) 2020.11.19

+ Recent posts