지난번에 이어서 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 Concepts: Sending a Signal
시그널을 받는 process의 상태를 조금 바꾸면서(목적지의 bit를 조금 바꿈) 보낸다.
시그널을 보내는 이유
- divide-by-zero이거나 child를 종료하는 경우같은 system event가 발생한 경우 (Kernal의 시그널)
- 다른 process가 의도적으로 kill system call을 호출했을 때(다른 process의 시그널)
Signal Concepts: Receiving a Signal
시그널을 받는 방법
- 시그널 무시(아무것도 안함)
- process 종료
- 해당 시그널을 처리하기 위한 시그널 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 |