일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- HTTP프로토콜
- fcm데이터구조
- 동기비동기블로킹논블로킹
- 프로세스 생성
- DispatcherServlet
- rest api 검증
- 공유기작동방식
- multiparfile데이터
- fcm성능비교
- 옵티마이저
- Wrapper class
- 옵티마저
- 중첩클래스
- HttpServlet
- 래퍼클래스
- 디스패처서블릿
- multipart바인딩
- rest api
- 데이터베이스파서
- fcmv1
- 동등성동일성
- 클라이언트요청반응
- 왜불변객체인가
- biblecash
- httpservlet기술
- equals
- java enum
- 검증 실패 예외처리
- 불변객체
- 스프링요청반응
- Today
- Total
개발은 아름다워
[ 리눅스 구조 ] 3. 프로세스의 생성 및 삭제 본문
배우는 것 : 커널의 프로세스 생성 및 삭제 기능 설명
리눅스의 실제 프로세스 생성 및 삭제의 동작 방식을 제대로 이해하려면 가상 기억 장치의 이해가 필요함.
따라서 이번에는 가상 기억장치가 없는 단순한 경우만 설명
리눅스에서 두 가지 목적으로 프로세스를 생성하며 생성 목적에 따라 다른 함수를 사용한다.
1. 같은 프로그램 처리를 여러 개의 프로세스가 나눠서 처리하기 위해 생성 -> fork() 사용하며 커널모드에서는 clone() 시스템 콜함
2. 전혀 다른 프로그램을 생성 -> execve() 사용하며 , 커널 모드에서는 execve() 시스템 콜을 함
fork() 함수
같은 프로그램의 처리를 여러 개의 프로세스가 나눠서 처리한다는 목적을 위해 사용됨.
fork() 함수를 실행하면 실행한 프로세스와 함께 새로운 프로세스가 1개 생성됨.
생성 전 프로세스를 부모 프로세스, 새롭게 생성된 프로세스를 자식 프로세스라고 부름.
프로세스를 생성하는 순서는 다음과 같다.
1. 자식 프로세스용 메모리 영역을 작성하고 그곳에 부모 프로세스의 메모리를 복사
2. fork() 함수의 리턴값이 각기 다른 것을 이용하여 부모 프로세스와 자식 프로세스가 서로 다른 코드를 실행하도록 분기함
execve() 함수
전혀 다른 프로그램을 생성할 때에는 execver() 함수를 사용한다.
1.실행 파일을 읽은 다음 프로세스의 메모리 맵에 필요한 정보를 읽어 들인다.
2. 현재 프로세스의 메모리를 새로운 프로세스의 데이터로 덮어쓴다.
3. 새로운 프로세스의 첫 번째 명령부터 실행한다.
코드 영역과 데이터 영역의 메모리 맵 시작 주소가 필요한 이유는 CPU에서 실행되는 기계언어 명령은 고급언어로 쓰인 소스코드와 다르게 특정 메모리 주소를 지정할 필요가 있기 때문이다.
전혀 다른 프로세스를 새로 생성할 때는 부모가 될 프로세스로부터 fork() 함수를 호출한 다음 돌아온 자식 프로세스가 exec() 함수를 호출하는 방식, 즉 'fork and exec' 이라는 방식을 주로 사용함.
fork and exec 방식
fork()는 새로운 프로세스를 생성하여 기존 프로세스를 복제,
execve()는 현재 프로세스를 새로운 프로그램으로 교체
병렬 작업이나 새로운 프로그램 실행이 필요할 경우, fork()로 프로세스를 생성한 후 자식 프로세스에서 execve()를 호출하는 것이 일반적이다.
종료 처리
프로그램 종료는 '_exit()' 함수를 사용하며 내부에서는 exit_group() 시스템 콜을 호출
이것을 사용하면 프로세스에 할당된 메모리를 전부 회수한다.
그러나 직접 _exit()를 호출하는 일은 매우 드물고, 보통 표준 C 라이브러리의 exit() 함수를 호출해서 종료한다. 왜냐하면 표준 C 라이브러리는 자신의 종료 처리를 전부 수행한 뒤에 _exit() 함수를 호출하기 때문이다.
main() 함수로부터 리턴된 경우도 같은 동작을 한다.
참고
실습과 그림으로 배우는 리눅스 구조
'리눅스' 카테고리의 다른 글
[ 리눅스 ] 4. 프로세스와 스케쥴러 (0) | 2024.12.10 |
---|