프로세스 API란?


운영체제가 프로세스의 생성 및 제어를 위해서 제공하는 API다.

 

 

 

 

 

fork() System Call


fork() System Call(시스템 호출)은 새로운 프로세스를 생성하기 위해 사용된다.

동일 프로그램에서 부모 프로세스로부터 자식 프로세스가 생성된다.

 

 

 

 

 

wait() System Call


wait() System Call은 부모 프로세스가 자식 프로세스의 종료까지 기다리도록 하기 위해 사용된다.

 

 

 

 

 

 

exec() System Call


이 시스템 호출은 호출자 프로그램(the calling program)으로부터 다른 프로그램을 실행할 때 사용된다.

fork()의 경우는 동일 프로그램의 복제 프로세스를 생성하는데 반해, 다른 프로그램을 실행하고자 한다면 exec()를 사용할 수 있다. 

 

exec()(+ execvp())를 실행할 경우, executable(실행 가능한 파일)의 이름과 몇몇 arguments(인자)를 고려하여 코드 및 정적 데이터를 로드하고, 현재 코드 세그먼트에 덮어쓴다. 또한 힙과 스택 및 프로그램의 메모리 공간의 다른 부분들은 다시 초기화된다(re-initialized). 그런다음 운영체제는 해당 프로그램을 실행하면 해당 프로세스의 argv로 모든 인수를 전달한다.

 

따라서, 새로운 프로세스를 생성한다기보다는 현재 실행중인 프로그램을 해당 프로그램으로 변환한다고 볼 수 있다. exec()가 성공적으로 실행된다면, 이전 프로그램은 거의 실행되지 않는다고 볼 수 있으며, 성공적인 exec() 호출은 반환되지 않는다. (a successful call to exec() never returns)

 

 

 

 

 

Unix Shell 과 Process API


프로세스를 생성하는 단순한 메커니즘과 다르게 이렇게 이상한 exec()와 fork()와 같은 인터페이스를 만든 것일까?

 

왜냐하면, 이와 같은 fork()와 exec()의 분리가 Unix 쉘을 만드는 데 필수적이기 때문이다.

쉘에 적용하였을 때, fork()는 exec()와는 다르게 호출 후에 계속 코드를 실행하는 것이 가능하다. 그리고 이를 통해서 실행되는 프로그램의 환경을 변경하는 것이 가능하다.

 

쉘은 사용자 프로그램(user program)에 불과하며, 사용자에게 프롬프트를 출력하고 다음 입력을 기다린다. 사용자가 명령을 입력하면, 쉘은 실행 파일이 있는 파일 시스템의 위치를 파악하고, fork()를 호출하여 커맨드(명령)를 실행하기 위한 새로운 프로세스를 생성한 뒤에, 일부 변형된 exec()를 호출하여 커맨드를 실행한다. 그리고 wait()를 호출하여 명령이 완료되기까지 기다린다. 자식 프로세스가 완료되면, 쉘은 wait()로부터 return(반환)되고, 프롬프트에 다시 출력한 뒤, 유저의 다음 명령(커맨드)를 기다린다.

 

이처럼, fork()와 exec()의 분리는 쉘이 유용한 여러 가지 작업을 쉽게 수행할 수 있도록 한다.

 

 

 

 

 

Process Control and Users


fork(), exec(), wait() 외에도 유닉스 시스템의 프로세스와 상호 작용하기 위한 많은 인터페이스들이 있다. 예를 들어, kill() 호출은 프로세스에 pause, die, 그리고 기타 유용한 명령들에 대한 신호를 보내는데 사용된다. 대부분의 UNIX Shell에서 특정 키 스트로크 조합은 현재 실행 중인 프로세스에 특정 신호를 전달하기 위해서 쓰인다. 예를 들어 control+c는 SIGINT(인터럽트)를 프로세스(일반적으로 종료)로 보내고 control+z는 SIGTSTP(중지) 신호를 전송하여 프로세스의 실행 중간에 일시 중지할 수 있다.(나중에 재개할 수 있다.)

 

The entire signals subsystem(전체 시그널 하위 시스템)은 개별 프로세스 내에서 신호를 수신 및 처리하는 방법, 개별 프로세스 및 전체 프로세스 그룹에 신호를 보내는 방법 등 외부 이벤트를 프로세스에 전달하는 풍부한 인프라를 제공한다. 이러한 형태의 통신을 사용하려면, 프로세스가 signal() 시스템 호출을 사용하여 다양한 신호를 캐치(catch)해야 한다. 이렇게 하면 특정 신호가 프로세스에 전달되었을 때 해당 프로세스가 정상적인 실행을 미루고(suspend) 신호에 응답하여 특정 코드들을 실행하도록 할 수 있다.

 

그렇다면, 누가 프로세스에 신호를 보낼 수 있고, 누가 신호를 보내지 못하도록 해야할까? 일반적으로, 우리가 사용하는 시스템은 동시에 여러 사용자가 사용할 수 있다. 만약 아무나 SIGINT와 같은 신호를 임의로 전송할 수 있다면 시스템의 사용성(usability)과 보안성(security)이 손상될 것이다.

 

따라서, 현대 시스템은 유저에 대한 강력한 개념을 포함한다. 사용자는 자격 증명을 설정하기 위해서 암호를 입력한 후 로그인하여 시스템 리소스에 액세스할 수 있다. 그런 다음에 사용자는 하나 이상의 프로세스를 실행하고 프로세스를 제어할 수 있다.

 

 

 


 

 

출처 : pages.cs.wisc.edu/~remzi/OSTEP/

 

Operating Systems: Three Easy Pieces

Blog: Why Textbooks Should Be Free Quick: Free Book Chapters - Hardcover - Softcover (Lulu) - Softcover (Amazon) - Buy PDF - EU (Lulu) - Buy in India - Buy Stuff - Donate - For Teachers - Homework - Projects - News - Acknowledgements - Other Books Welcome

pages.cs.wisc.edu

 

+ Recent posts