2021. 3. 8. 17:34ㆍComputer(인강)/시스템 프로그래밍
안녕하세요 bannavi입니다^ㅅ^
오늘은 프로세스 생성(fork)에 대해서 알아볼거에요
바로 시작하겠습니다.
프로세스 기본구조
: TEXT, DATA, BSS, HEAP, STACK
BSS, DATA, TEXT는 컴파일 시 실행되고
stack, heap부분은 코드가 실행되면서 줄어들거나 커지거나..
프로세스 생성
* 기본 프로세스 생성 과정
1) TEXT, DATA, BSS, HEAP, STACK의 공간을 생성
2) 프로세스 이미지를 해당 공간에 업로드하고, 실행 시작
* 프로세스 계층 : 다른 프로세스는 또다른 프로세스로부터 생성
: 부모프로세스, 자식프로세스
-> 모든 프로세스에는 부모프로세스가 있다는 말입니다.
프로세스를 실행하는 시스템콜은 리눅스 계열에서 두가지가 있습니다.
1. fork() 시스템콜 :
새로운 프로세스 공간을 별도로 만들고, fork() 시스템콜을 호출한 프로세스(부모 프로세스)공간을 모두 복사
-> 별도의 프로세스 공간을 만들고, 부모 프로세스 공간의 데이터를 그대로 복사
2. exec() 시스템콜 :
exec() 시스템콜을 호출한 현재 프로세스 공간의 TEXT, DATA, BSS 영역을 새로운 프로세스의 이미지로 덮어씌움
-> 별도의 프로세스 공간을 만들지 않음(부모 프로세스 공간은 사실상 사라짐)
fork() 시스템콜
: fork되는 시점에 부모프로세스와 자식프로세스로 나뉘어지면서 각각의 pid가 생기게됨.
이 서로 다른 pid를 보고 부모프로세스와 자식 프로세스를 구분할 수 있음.
자식 프로세스는 pid가 0으로 리턴이 되고
부모 프로세스는 pid가 실제 부모 프로세스의 pid값으로 리턴됩니다.
그래서 자식 프로세스가 실행할 코드, 부모 프로세스가 실행할 코드를 구분해서 프로그램을 작성할 수 있습니다.
프로세스 안에있는 fork()가 실행되는 순간 실행코드는 똑같은데, 프로세스가 두개가 되는 거에요
그리고 실행코드가 똑같기때문에, 부모 프로세스와 자식프로세스가 할 일을 구분하고 싶다면,
이 pid를 기반으로 해서 조건문으로 구분하는 방법이 가장 일반적입니다.
만약에 fork()가 실패할 경우, pid값은 -1이 되어서 fork가 fail되었다는 문구가 출력이 될 것입니다.(else문)
실습해보겠습니다.
코드를 입력한뒤
:wq로 나가줄거고요
정리
1. pid = fork()가 실행되면 부모 프로세스와 동일한 자식 프로세스가 별도 메모리 공간에 생성
2. 자식 프로세스는 pid가 0으로 리턴, 부모 프로세스는 실제 pid 리턴
3. 두 프로세스의 변수 및 PC(Program Count)값은 동일
4. 새로운 프로세스 공간을 별도로 만들고, fork() 시스템 콜을 호출한 프로세스(부모 프로세스) 공간을 모두 복사한 후,
fork()시스템 콜 이후 코드부터 실행
'Computer(인강) > 시스템 프로그래밍' 카테고리의 다른 글
프로세스 생성(wait)과 나만의 쉘만들기 (0) | 2021.03.08 |
---|---|
프로세스 생성(exec) (0) | 2021.03.08 |
프로세스ID 시스템콜 (0) | 2021.03.08 |
프로세스ID (0) | 2021.03.08 |
ABI와 표준 (0) | 2021.03.07 |