프로세스는 어떻게 만들어지나? 누가 프로세스를 만드나?
- 부모 프로세스가 자식 프로세스를 생성한다.(트리형태)
- 프로세스는 운영체제로 부터 자원을 받고, 부모와 자원을 공유하거나 아닌 모델도 존재한다.
프로세스 생성
1.부모의 주소공간을 자식 프로세스가 복사를 한다. 복사할 때 프로세스의 문맥을 복사한다는 뜻이다. 또 cpu에서 인스트럭션을 어디까지 수행했는지를 나타내는 pcb, 레지스터등 자원도 다 복제한다. 그 후 2.그 공간에 새로운 프로그램을 덮어씌운다. (위의 그림 참고) (리눅스에서는 부모와 자식의 내용이 같으면 부모프로세스의 주소공간을 공유하고 자식은 프로그램 카운터만 카피해서 똑같은 위치를 가리키고 있을 수도 있다. 만약 내용이 서로 다르면 그제서야 부모의 주소공간을 카피해서 자식이 갖는다. 이걸 카피 온 라이트 기법이라고 한다. 라이트가 발생했을때 그때 주소공간을 카피한다는 뜻. 라이트란 쓰기, 내용이 바뀌는 것, 수정되는것을 의미한다.
*코드(시스템콜. 운영체제가 갖고 있어서 운영체제가 만들어준다)
- 프로세스 생성 : fork()
- 메모리에 올리기(새로운 내용 덮어씌우기): exec() , 완전히 새로운 프로그램으로 만든다.독립적인 주소공간을 가진다.
프로세스의 종료
*코드
- 자발적 종료: 시스템 콜인 exit 호출.
종료료될 때 자식이 부모에게 데이터를 보낸다.(일반적으로 부모보다 자식이 먼저 종료됨) 자식이 종료되면 운영체제가 자식프로세스에게 할당된 자원을 회수함.
- 강제종료: 자식 프로세스가 자원의 할당치를 넘어선 요구를 할때, 부모가 강제로 종료시킬때, 더이상 자식에게 시킬일이 없을때, 부모 프로세스가 먼저 종료 될때 abort 시스템 콜을 호출 한다
부모와 자식이 공존하는 모델
자식과 부모가 같이 cpu를 획득하기 위해 경쟁하는 관계
부모가 자식의 종료를 기다리는 모델
자식 프로세스가 종료될 때까지 부모 프로세스는 아무일도 하지 않고, 봉쇄 상태에 머물러 있다가 자식 프로세스가 종료되면 그때 부모 프로세스가 준비 상태가 되어 다시 cpu를 얻을 권한이 생기게 된다.
예) dos
주소 공간
부모 프로세스가 자식 프로세스를 생성하면 자식 프로세스는 부모 프로세스와 별도의 주소 공간을 가지게 된다.
처음에는 부모 주소 공간을 그대로 복사하고 자식 프로세스가 다른 프로그램을 수행하기 위해서는 생성된 주소 공간 위에 새로운 프로그램의 주소 공간을 덮어 씌워 실행한다.
예) fork() 시스템콜 : 프로세스 id를 제외한 모든 정보(운영체제 커널 내의 정보와 주소 공간의 정보 ) 를그대ㅗㄹ 복사
exec() 시스템콜 : 자식 프로세스는 이 시스템콜을 통해서 새로운 프로그램으로 주소 공간을 덮어 씌울 수 있다.
프로세스 생성
부모 프로세스와 자식 프로세스 코드
좌측 코드인 부모프로세스가 fork()를 하면 우측에 자식 프로세스가 만들어지고, 자식은 fork()문 다음 구문 부터 시작된다. 이유는 자식은 부모 프로세스의 컨텍스트 스위치(문맥) 즉 pc를 복제해서 사용하기 때문이고, (pc가 fork() 그 다음라인을 가리키고 있음)부모 프로세스에서 fork()문까지 실행했기때문이다.
fork()리턴값은 부모 프로세스와 자식프로세스가 다르다.
- 부모 : 자식의 pid
- 자식 : 0
exec()함수
자식은 부모로부터 복제된다음 exec()함수로 인해 완전히 새로운 프로그램으로 덮어씌워진다.(exec 함수 아래 코드는 실행이 안됨) 아래 그림의 오른쪽 코드의 main 이 자식의 프로세스가 된다(덮어씌워짐). 자식 프로세스의 main이 종료되면 자식 프로세스는 종료된다.
exec 시스템콜
execlp 함수의 첫번째, 두번째 인자에 실행시킬 프로그램이름을 적고 그 후에 파라미터 값을 , 로 구분해서 적는다. 그리고 마지막에 (char ..)를 적어준다. 그러면 완전히 새로운 echo 프로세스(자식)이 실행된다.
wait() 시스템콜
wait 시스템콜은 부모가 자식 프로세스를 만들고, 자식프로세스가 종료되길 기다리면서 블락 상태가 된다. 자식 프로세스가 종료되면, 부모 프로세스가 블락에서 레디상태로 변하고, cpu를 얻을 수 있는 상태가 된다.
예) cmd에서 명령어를 실행할때(깜빡깜빡 거리는 커서는 부모 프로세스), 명령어를 입력해서 명령어가 실행되는 부분은 자식프로세스이다. 그때는 부모가 아무 일도 못하고 기다리고 있다가 그 명령어 처리가 끝나면 다시 부모가 레디상태로 변하고 새로운 명령어를 작성해서 실행시킬수 있는 상태가 된다.(cmd 창에서 커서가 깜빡깜빡 하는 상태)
exit() 시스템콜
프로세스를 종료시킬때 호출하는 콜
- 내부에서 종료될때 : 자발적 종료.
- 외부에서 종료시킬때 : 비자발적 종료.
-프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려주는 방식
프로그램이 마쳐지는 부분에 exit()라는 시스템 콜을 넣어 주도록 되어 있음. 이 함수를 명시적으로 호출 하지 않아도 프로그램이 종료되는 지점에 컴파일러가 자동으로 삽입해 프로세스의 종료 직전에 호출 한다.
-비자발적 종료로 부모 프로세스가 자식 프로세스의 수행을 강제로 종료시키는것.
abort()라는 함수를 통해 이루어짐
발생
1자식 프로세스가 할당 자원의 한계치를 넘어서는 많은 양의 자원을 요구할때.
2. 자식 프로세스에게 할당된 작업이 더이상 필요 없을때
3. 부모 프로세스가 종료되는 경우.
프로세스간 협력
원칙적으로 서로 데이터를 주고 받으면서 작동을 하지 않는다.
하지만 경우에 따라서 다를 수 있지만 프로세스간에 서로 정보를 주고 받을 때도 있다.(전문용어로 IPC라고 한다.)
프로세스간에 메시지를 교환하는 방식
1.공유 메모리(쉐어드 메모리) : 프로세스 A 와 프로세스 B는 물리적인 메모리에서 주소공간을 공유한다. 프로세스들이 주소공간의 일부를 공유 .운영체제는 공유 메모리를 사용하는 시스템 콜을 사용해서 다른 프로세스들이 그들의 주소 공간중 일부를 사용할 수 있도록 한다.
2.메시지 패싱 : 프로세스 A가 B에게 (운영체제)커널을 통해서 메시지를 전달하고, B가 받고, A에게 전달한다.
프로세스간에 공유변수가 있는것도 아니고, 프로세스들은 각각 자기 주소공간에 자기 데이터만 보고 있기 때문에..운영체제 커널을 통해서 메시지를 전달한다. 메시지를 메일박스 또는 포트로부터 전달 받는다. 각 메일 박스에는 고유의 id가 있으며 메일 박수를 공유하는 프로세스들만 서로 통신을 하게 된다.
* 메시지 패싱의 종류
2-1. 다이렉트 커뮤니케이션 : 누구에게 메시지를 전달할지 직접 프로세스 이름을 명시해서 전달하는 방식.
2-2. 인다이렉트 커뮤니케이션 : 메시지를 보내는 측에서 메일박스나 PORT에 메시지를 넣어서 간접적으로 메시지를 전달하는 방식. (받는 대상 프로세스를 지정하지 않는다.)
(참고) 스레드 : 스레드는 하나의 프로세스안에 여러개 존재하고, 서로 주소공간이 공유되기 때문에, 서로 협력하기가 용의하다.
메시지 패싱과 공유 메모리
참고: 이화여대 반효경 교수님 운영체제 강의정리
'컴퓨터 기초 > 운영체제 이론' 카테고리의 다른 글
[실습과 그림으로 배우는 리눅스 구조] 1.컴퓨터 시스템의 개요 (0) | 2020.06.04 |
---|---|
[운영체제 정리] 6.CPU 스케쥴링 (0) | 2020.06.02 |
[운영체제 정리] 4.스레드 (0) | 2020.05.30 |
[운영체제 정리] 3.프로세스 (0) | 2020.05.29 |
[운영체제 정리] 2.컴퓨터 시스템 구조 (0) | 2020.05.28 |