Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • boj
  • 다이나믹 프로그래밍
  • Kubernetes
  • BFS
  • Network
  • DFS
  • 프로그래머스
  • 백트래킹
  • docker
  • django

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

SystemSoftware - Exceptional Control Flow #3
CS/SystemSoftware

SystemSoftware - Exceptional Control Flow #3

2021. 6. 9. 22:53
 

SystemSoftware - Creating Processes #2

SystemSoftware - Creating Processes #1 OS에서 process를 만드는 방식에 대해서 알아보자 process는 fork()라는 syscall을 통해서 child process를 생성한다. fork를 호출한 process가 parent process가 되고,..

hyeo-noo.tistory.com

 

지난번에 이어서 Exceptional Control Flow에서의 Shells, Signals, Nonlocal jumps에 대해서 알아보자

 

 

Shell : processor를 생성해 주는 역할

 

shell의 종류

  • sh shell
  • csh/tcsh
  • bash shell : default Linux shell

 

 

shell의 동작을 간단하게 알아보자

사용자의 입력을 받을 준비를 한다(while(1))

 

MAXLINE만큼의 입력 버퍼를 cmdline에 저장한다.

 

해당 cmdline을 실행한다. (eval(cmdline))

 

 

eval함수에 대해서 알아보자

 

eval() : cmdline을 받아서 해석하는 역할

 

builtin_command : shell 자체에서 수행하는 명령어

 

builtin_command가 아니라면 새로운 process를 만들어준다.(Fork()) 

새로운 process가 만들어지면 지난번에 알아보았던 execve를 통해서 새로운 프로그램을 시작한다.

 

만약 backgraound에서 실행되는 작업(명령어 끝에 &를 붙인다)이 아니라면 작업이 종료될 때까지 기다린다.(waitpid())

만약 background작업이라면 생성된 child의 pid와 cmdline을 출력하고 종료한다.

 

 

 

발생할 수 있는 문제 : 만약 child가 background process인 경우 좀비 상태로 남아있을 가능성이 있다. 

 - child보다 parent가 먼저 종료되는 경우(parent가 없는데 언제 leaping을 하는지?)

 

 

어떻게 처리하는지?

child가 종료되는 경우 커널에 signal을 보내면 OS에서 signal을 받아서 child를 처리할 수 있다.


Signal : process에게 어떠한 event가 발생했음을 알려주는 것

 

  • exception, interrupt등과 동작의 형태는 유사하다
  • 단, 소프트웨어로만 구성된다.
  • signal은 각각의 type이 있고 고유 ID를 가진다.

 

대표적인 signal 종류

 

Signal Concepts: Sending a Signal

시그널을 받는 process의 상태를 조금 바꾸면서(목적지의 bit를 조금 바꿈) 보낸다.

 

 

시그널을 보내는 이유

  1. divide-by-zero이거나 child를 종료하는 경우같은 system event가 발생한 경우 (Kernal의 시그널)
  2. 다른 process가 의도적으로 kill system call을 호출했을 때(다른 process의 시그널)

 

Signal Concepts: Receiving a Signal

 

시그널을 받는 방법

  1. 시그널 무시(아무것도 안함)
  2. process 종료
  3. 해당 시그널을 처리하기 위한 시그널 handler(user-level function)를 호출

 

 

시그널을 받고 -> 시그널 핸들러를 호출 -> 시그널 핸들러를 실행하고 -> 시그널 핸들러가 다음 명령으로 return

'CS > SystemSoftware' 카테고리의 다른 글

Cache Lab trans.c #2  (0) 2021.06.25
SystemSoftware - Cache Memory #3  (0) 2021.06.16
Cache Lab csim.c #1  (1) 2021.06.07
SystemSoftware - Cache Memory #2  (0) 2021.06.06
SystemSoftware - Cache Memory #1  (1) 2021.06.06
    'CS/SystemSoftware' 카테고리의 다른 글
    • Cache Lab trans.c #2
    • SystemSoftware - Cache Memory #3
    • Cache Lab csim.c #1
    • SystemSoftware - Cache Memory #2

    티스토리툴바