안녕하세요, 환영합니다
이번 영상에서는 체중과 탈출에 대해 이야기해 보겠습니다
weight는 부모 자식 과정을 동기화하기 위해 사용되는 시스템 호출입니다
그리고 또한 자녀 과정이 종료될 때까지 부모가 자식 과정을
생성하고 출구 정보와 출구 시스템 호출을 모아야 하는 유스 케이스가
있을 겁니다
대기 및 퇴장을 어떻게 사용하는지 보죠
함께요
네
프로세스 실행 시 프로세스 테이블에 항목이 생깁니다
절차 테이블에서 의논할 겁니다
하지만 모든 프로세스에 대한 엔트리가 있는 데이터 구조를 생각해보죠
분리되거나 종료될 때
각 프로세스는 출구 상태가 있습니다 그래서 프로세스 테이블은 모든 정보를 갖고 있죠
하지만 프로세스가 종료되면 모든 메모리를 할당하고 프로세스가 갖고 있는 모든 리소스를 릴리스합니다
부모가 아이가 낙태할 때까지 기다릴 수 있는데 그렇게 함으로써 낙태할 수 있죠
부모가 아이의 퇴장 시점을 알 수 있어요
아이가 나가길 기다리는 부모요
아픈 아이라고 부르는 신호가 부모에게 전달됩니다
네 네 안 그러면 어떻게 처리하는지 몰라요
대기 시스템 호출 구문을 보죠
슬래시 대기.h.를 포함해야죠 대기란 시스템 호출로 반환됩니다
자식 프로세스는 포인터가 필요해요
정수로요
나중에 얘기하죠
예시가 핵심이에요
유사 시스템 콜이 있어요 as waitpid요 대기와 비슷하죠
이 경우 기다리려는 자식의 프로세스 id를 지정할 수 있어요
또한 하위 프로세스가 종료된 상태를 알려줍니다 사용 가능한 옵션은 몇 개 안 되죠
네 대기와 대기료의 가장 큰 차이점은 어떤 아이든 대기 시스템이 전화를 기다린다는 거죠 반면
대기 시스템은 부모로부터 특정 아이를 기다려요
더 잘 이해하려면 예를 들어 볼게요
여기 샘플 프로그램이 있어요 무게와 출구를 보여 줄 거예요
부모와 자식 프로세스를 생성하고 있어요 이 경우엔 포크죠
그리고 fork의 반환값에 기반합니다. fork에서 1이 반환되면 우리는 그것을 종료합니다.
if는 0과 같습니다
그럼 이게∙∙∙
성장 과정이죠
우리는 자녀 과정을 만들었고 그 과정은 0이 될 겁니다
Else, else의 경우 부모 프로세스 코드란 뜻이죠
이건 코드의 일부로 부모 프로세스에 의해 실행되죠
이건 코드의 일부로 하위 프로세스 실행이죠
당장
그렇다고 치죠
이 예제에서는 웨이트 상태를 이용합니다
잠깐만요
시스템 호출이 오면 통과해야 해요
신분이 확인됐습니다
상황은?
여기 정수가 있고 프로그램이 어떻게 작동하는지 보죠
네 이 프로그램의 주요 목적은 자녀 프로세스가 실행될 때마다 대기 시스템이 호출할 때
부모 프로세스가 있나요? 안 그래요? 아이가 나올 때까지 여기서 기다려
절차에서 제외됩니다
코드를 컴파일함으로써 결과를 보겠습니다
잠깐만요
한 점은 png 파일의 이름입니다
잠깐만요
1점.c-aject 파일입니다
1단계
프로그램을 정리했습니다
프로그램을 실행하죠
여기서 실행하면 메모리에 두 개의 프로세스가 생겨요 하나는∙∙∙
아이를 낳는 과정도 있을 거예요
판매 과정
왕자님
맞아요
그리고요
출력을 보겠습니다
네
부모는 이미 실행했습니다
잠깐, 스케줄에 근거해 이 경우엔 부모가 먼저 실행했어요
잠깐, 그럼 이건...
부모 프로세스를 실행하는 거죠 기다리기를 하니까요
이 선들은 이것 때문에 실행되지 않아요 wait는 대기 신호 같은
거예요 신호가 올 때까지 기다리는 거죠
판매 과정
이 다음에는 child를 먼저 실행합니다 3, 6, 6, 2죠
아이는 사형당했고 골반 확진자는 362예요
20대 동안 자다가 3번 출구로 나갔어요
exit은 시스템 호출이고요
프로세스를 종료하면 출구에 값을 전달할 수 있습니다
아이가 어떤 상황에서 벗어났는지 부모에게 알려주는 거죠
이걸 보죠
자녀 과정을 거치면 부모가 되는 거죠
실행하겠습니다
아이가 나온 다음에요
이 선은 부모에게서 실행되기 시작해요
부모를 기다리는 건 끝났어요
부모는 완료됐고 부모 id는 3661이죠
부모 프로세스 ID는 363661 자녀 프로세스 id는 3662 반환은 3662입니다
기다리면 돼요
하위 프로세스 id를 반환하는데 대기 시스템 호출이 대기였던 거죠
이제 나옵니다
측면 작업요
상태를 살펴보면 7, 6, 8이에요
이 지위를 통과하면
반환합니다
무게는 이 상태를 채울 값입니다
아이가 나왔어요
분석해보죠 이 가치는 뭘까요?
일곱, 여섯, 여덟
네 자, 전에 상태에 대해 말하기 전에 상태가 뭔지 보고 분석하는 방법을 알아보죠
변수가 많죠
상태는 16비트 정수라고 생각하세요
비트 0부터 7, 8, 15가 있어요
0에서 15까지 있어요
조금
그리고 이걸 표현해보죠
자식 과정이 정상적으로 끝나거나 정상적으로 끝나면 첫 번째가 끝나요
8달러 0센트요
위쪽 바이트가 출구예요
이 경우 하위 과정은 아무 문제 없이 정상적으로 종료됐고 상위권도 마찬가지예요
꽉 물어야 해요
현재 상황, 탈출 상황
이제 수집된 값은 768입니다
이걸 분석해보죠
계산기를 열어 이걸 보죠
768
1068은 768은 이진 모드로
아래쪽에 있는 걸 보세요
8비트는 0달러예요
바로 이거예요
하단의 8비트는 0이고 상단의 8비트는 출구 상태입니다
여기 0011이 있네요
하나는 세 개밖에 안 돼요
출구 상태 3번으로 아이가 나오고 같은 것이 여기에 모입니다
값을 변경하고 프로그램을 다시 실행하겠습니다
여기에 새 값을 입력해보죠
여기서 하나 주죠
여기에 one을 주면 여기서 나가는 게 바뀌겠죠
이 코드를 컴파일해서 보죠
코드를 컴파일했고 코드를 실행 중입니다
네 코드를 실행하면 첫 번째 부모가 스케줄을 가지고 있고 다음 아이가 기다리고 있기 때문에 부모가
기다리고 있고 자녀 프로세스가 스케줄을 가지고 있습니다 22일 잠자리가
있습니다 ,
22일 자잖아요
일단 아이가 나오면 출구 값이 1이 됩니다
그리고 출구가 반환됐으니 이 호출은 대기 시스템 호출에서 나왔는데 이렇게 인쇄됐어요
부모 대기 작업이 완료됐으니 부모는 부모를 기다려야 합니다
이 라인은 자식 프로세스가 끝난 후에만 옵니다
네
지위를 확보하는 거죠
Kpd를 인쇄하죠
Kpd는 아동 보호국 신분증일 뿐이에요
대기 시스템 호출이 반환된 이유입니다
이제 출구 상태예요
이 경우에는요
256 여기서 값을 분석해보죠
256
소수점으로요
바이너리 값을 보죠
여기 있어요
이 값을 보면 아래 8비트는 0이에요
위쪽은 출구 상태일 뿐이에요
이 출구 상태로는
일반적인 종료라면 이 사건을 참조해야 합니다
네 그럼 이제 그 과정이 어린이 과정이 신호에 의해 죽었다고 해보죠
신호에 대해서는 나중에 얘기하죠
하지만 절차를 없애는 다른 방법이 있다고 가정해 보죠
이 경우 신호에 의해 죽었다면 어떻게 작동하는지 분석해보죠
여기에도 같은 16비트가 있어요
그리고 이 16비트에는 상부 16비트가 있습니다 상부 8비트는 사용하지 않고 하부 8비트는 우리에게 중요한 용도로 씁니다
신호에 의해 꺼질 때를 대비해서요
네 같은 프로그램을 다시 실행해 프로세스를 죽이죠 자녀 프로세스를 죽이고 상태를
분석해요
그럼 실행해보죠
킬 마이너스 9
절차가 절차를 망칠 거예요
다시 실행을 해봅시다. 하위 프로세스 id를 얻고요. 프로세스를 종료하기 위해 전달해야 합니다.
판매 프로세스.
다시 해 보죠
그래서
이게 자식 과정이에요
과정을 없애죠
그 과정을 끝내자마자 20초 동안 잠들지 않았어요
네 아동 과정은 20대까지 잠들지 않았어요 이 아동 과정이 실행되는 동안 외부 촉발 요인이 부모를
죽이고 아동 과정을 죽여서 , 그 결과
그
판매 프로세스 종료
판매 과정이 끝나면 부모의 과정은 자녀의 출소를 기다리는 거죠
이제 상태를 보죠
상태는 9입니다
분석해 보죠 9는 뭐죠?
이 경우에는
9
계산기로 돌아가죠
9개요
이진법 형식으로 보시면 1001이고요
이 경우, 지금 봐야 하는 건 이거예요
이 경우에는
아래쪽 바이트는 0과 같지 않아요
평범한 출구가 아니에요
비정상적인 출구인 거죠
이 경우에는 신호 때문에 작동이 중단됐어요
이 경우에는 0에서 6개 정도만 분석해야 해요
7번 비트가 코어 덤프 깃발을 주죠
이 경우, 이건
0분의 1 비트
첫 번째 부분
두 번째 부분
세 번째
여기 값이 보이죠?
8421
이건 9예요
그래서 시그널 9를 써서 과정을 죽였죠
바이너리, 즉 하위 프로세스가 종료된다고 합니다
신호
킬 시그널 나인이 종료 신호를 보냈습니다
그렇다는 건
어린 시절이 그랬죠
신호에 사망했습니다
어느 쪽이죠?
누가 9번인지 헷갈리죠
이제 프로세스를 죽이죠
다른 신호로 후손 과정을 거쳐 출력을 분석할 겁니다
그럼 우리가 차단 신호를 보내서 프로세스를 차단한다고 해보죠
8을 이용해서 죽인다고 해보죠
그리고 이걸 실행하죠
3856이 그 번호군요
판매 과정
이제 신호를 이용해 어린이 과정을 죽였습니다
마이너스 8
이제 상태는 136이고 여기서 출력을 분석해보죠
136이라는 기호를 보면
13136
2진법으로요
이렇게 말하죠
이 음이 아니에요
바이너리 데시멀로 돌아가 보죠 데시멀로는 136에 136
이진법으로요
다시 여기로 돌아가죠
이 경우, 일반적인 출구라면 아래 8비트는 0이 되겠죠
하지만 이 경우엔 하위 8비트는 0과 같지 않아요
두 번째 사용 사례로 가보죠
신호가 와서 꺼졌을 거예요
아래 8개는 있어요
가치가 있어요
아래 8조각을 분석해보죠
이건 코어 덤프 깃발이에요
활성화됐다는 건 코어 덤프 플래그가 활성화됐다는 거죠
가격을 보죠
1,000달러예요
8개밖에 안 돼요
그래서 8번 신호에 의해 아이가 죽었다고 결론지을 수 있죠
그래서
이게 8번 신호로 파괴됐어요
판매 과정
좋아요,
예제를 하나 더 보죠
이제 상태를 원치 않는다고 하죠
이것도 쓸 수 있어요
네 상태를 무시하면 null을 패스할 수 있죠 자식 프로세스가 어떤
상태인지 알고 싶지 않을 경우에요 그럼 null을 패스할 수 있죠
이제 프로그램을 다시 컴파일해보죠
네
프로그램을 컴파일해서 실행해보죠
좋아요, 그럼 재방송하죠
이제 부모의 절차가 끝나길 기다리는 거예요
아이는 20대의 수면이 끝나면 바로 실행에 옮깁니다
아이가 나오면 상태가 0인 걸 알 수 있죠
여기서 두 가지 유형의 대기 사용이 보이죠
하나는 null을 패스하는 겁니다
이 경우에는 출구 상태를 알고 싶지 않아요 출구가 필요한지도요
기본적으로 포인터를 넘겨야 합니다 정수 포인터요
그 가치는요?
정수 포인터를 보면
출산 과정은 중단됐어요
이제 다음 예제를 보죠
네
이 예제에서도 대기 시스템 호출을 사용합니다
네 여기서 생성한 건 부모 프로세스와 자식 프로세스와 이전 예와 유사합니다
이건 자녀 과정이고 이건 부모 과정이에요
부모 안에 프로세스를 하나 더 만들었어요
포크링을 통해 한 가지 프로세스를 더 만들었습니다
한 부모가 아이를 만든 거죠
이게 첫 부모예요
스판돈, 새 공정이에요
그게 둘째 과정이에요
코드의 이 부분이 첫 자식 프로세스입니다
이 코드의 두 번째 자식 과정에서요
그래서 이 경우 fork는 아까 얘기했던 포크들이 언제 돌아오는지에 대한 것입니다.
0
포크 씨가 돌아와서 가치를 매기면 자식 같은 과정이 될 거예요
더 심해질 거예요
부모의 절차죠
그래서 이 프로그램이 실행되면 하나가 됩니다
부모가 하는 과정과 두 아이가 하는 과정이죠
이 경우에는 이 시점이죠
이 지점에서 줄 번호를 넣어줄게요
이 시점에서 부모가 실행하고 기다릴 때∙∙∙
대기 시스템 호출을 이용해서요
여기 부모는
네
아이가 뛰어가죠
그래서
무게는 나중에 정합니다
출구까지 매각 절차입니다
그래서
컨트롤이 안 되는군요
부모가 어떤 과정을 자식에게 진행하는지 컨트롤할 수 없습니다 기다리고
있어요
하위 과정은 모두 끝났습니다
이렇게 될 거예요
잠깐만요
시스템 호출
여기로 돌아오려면 이걸 반환해야죠
자녀 프로세스 id요
대기 시스템 전화를 거기서 내렸어요
이제 대기 시스템에 전화합니다 여기서도 대기 시스템에 전화하죠
프로그램을 실행해서 결과를 보죠
코드를 컴파일하죠
잠깐만요
둘
코드를 다 모았습니다
이제 실행해보죠
잠깐만요
2번 밑줄
여기 보시면
02에 대한 부모 프로세스가 있습니다
7은 id, 1은 028 2는 4029
당장
아이가 나왔어요
하지만 4028은 프로세스 id예요
네 아이가 부모 안에서 나오면 차단 시스템을 만들어서 무게를 이용해 첫 아이가
여기서 나오게 해요
네
아이의 출구와 체중이 다시 들어오는 거죠
판매 과정
그래서 이 반환을 인쇄했어요
이거요
이게 제공하죠
그
대기 시스템 호출이 언제 돌아왔는지 상태를 보면 알 수 있습니다
자녀 과정이 끝난 상태죠
이 경우에도 볼 수 있죠
첫 아이가 나오면 출구 상태가 0이 되죠
두 번째 단계는 26입니다
여길 보시면 출구 0이 있어요
이게 첫 자식 상태예요
두 번째 출구입니다
그럼 부합하죠
여기 보이는 값으로요
다 써놨어요
첫 번째는
첫째와 둘째
체중이 돌아온 건 둘째 때문이었죠
이제 여기 수면 세트를 바꿔보죠
자, 첫 번째 아이는 10초를 잤고 두 번째 아이는 5초를 잤습니다
이 경우, 출력이 어떻게 될지 기대할 수 있습니다
주요 과정은
부모의 과정은 두 자녀의 과정을 만들었어요
둘째
5초 정도 자고 왔다 갔다 해요
자식 과정을 기다리는 거죠
두 번째 자식의 프로세스 id를 반환합니다
컴파일해서 출력을 확인하죠
첫 아이는 4087번이에요
두 번째 아이는 4086번입니다
이제 여길 보시면 첫 번째 것은 두 번째 자식 프로세스 id인 네 개를 반환합니다
두 번째 자녀 과정은 4087번입니다
두 번째 자식 프로세스를 먼저 반환합니다
첫 하위 프로세스 id인 4086을 반환합니다
네 결론은 이겁니다 대기 시스템 호출은 특정 자녀 프로세스를 기다리는 컨트롤이
없어요 하지만 기다리죠
판매 과정
이 경우에는 한 부모 절차에 두 자녀 절차가 있었어요
여기서 기다리는 동안
그거요
나중에 해도 돼요
출구까지 어린이 절차
그래서
어떤 판매 프로세스든 먼저 나가면 프로세스 id를 반환합니다
두 번째 대기를 호출하면 다음 프로세스가 여기로 돌아와요
Waitpid로 구체적인 걸 기다리는 방법을 보죠
성장 과정이죠
다음 예제로 가보죠
다음 예시는 3번입니다
보지 마세요
미안해요
이제 대기 시스템 호출 사용법을 보여드리죠
이번 프로그램은 이전 프로그램과 비슷해요
첫 번째 아이와 두 번째 아이가 있었는데 부모의 절차에 따라 두 아이가 갈렸습니다
부모 프로세스가 첫 번째를 포크했어요
자녀와 부모가 두 번째 자녀를 위한 과정을 거치죠
부모 프로세스는 특정 값을 기다리고 있어요
패드는 웨이트 패드를 사용합니다
기다리고 있던 패드를 지나갔어요
웨이트 패드 구문을 보면 첫 번째 매개 변수가 지정될 거예요
판매 과정
부모의 절차가 기다립니다
여론도 마찬가지고요
이것은 두 번째 자식으로 먼저 기다리면서 상태를 수집합니다
그리고∙∙∙
부모는 경찰 조사 결과를 기다리겠대요
Kpd는 그저
첫 번째 면의 과정이죠
캔자스 경찰이 돌아왔군요
Kpd에는 첫 번째 아이의 신원 정보가 있고 두 번째 아이 신원 정보도 있어요
그래서 이렇게 됐죠
둘째를 기다리는 거죠
이제 첫 번째 아이를 기다리고 있어요
이 프로그램을 컴파일해서 결과를 보죠
프로그램을 정리했습니다
실행해보죠
점수를 매겨 주세요
셋
네 이제 주요 과정이 있어요 부모 과정요 네 가지예요 두 가지 두 자녀 과정 네 가지와 일곱 가지 세 가지와 네 가지와
일곱 가지 네 가지요
여기 보시면 첫째는 둘째 때문에 돌아왔어요
웨이트피드는 첫째 때문에 돌아왔죠
그래서 이렇게 할 수 있죠
특정 자녀 처리 id를 기다려요
이걸로요
부모가 자식에게 미룰 수 있는 걸 조절할 수 있어요
그래서
이 무게와 저 무게죠
대기 후 대기란 부모와 자식 간의 프로세스를 동기화합니다
그래서
절차요
동기화는 프로세스를 제어하는 방법입니다
그렇게 해서 옳지 않은 결과를 못 내게 하는 거죠 예를 들어 예를 들어 처리한다거나 혹은
공유하는 거죠 공유하는 겁니다 프로세스 동기화가 있다면 좀 더 수용 가능한
출력을 제공합니다 동기화 프로세스의 결과나요
더 정확하죠
비동기화된 프로세스가 비동기화된 출력으로 이어집니다
출력이 손상됐을 수도 있어요
이 경우엔 웨이트 패드를 사용하는 데모를 보여드리겠습니다
이제 다음 예제를 보죠
이제 Waitpid를 사용할 예제를 보죠
그 전이죠
프로그램을 실행합니다
차단 시스템 통화와 비차단 통화에 대해 짧게 써보죠
블로킹 콜은 다음 지시까지 실행되지 않는 겁니다
발신 차단이에요
함수를 반환하거나 다른 방식으로요
아까 예제에서 웨이트를 사용할 때 봤죠
부모의 과정이 막혀서 아이에게 필요한 과정이 중단됐어요
그럼 이제∙∙∙
이제 차단되지 않은 통화도 할 수 있어요
함수나 시스템 호출이 안 막혔다는 건
함수는 즉시 반환됩니다 외부 io를 기다리지 않고요
시스템이 출력을 멈추게 하지 않고도 즉시 돌아옵니다
출력
이제 얘기를 해보죠
무게를 가리지 않고 사용할 방법을 알아요
이 프로그램은 이전 프로그램과 비슷하지만 문제가 있어요
부모 프로세스가 여기서 자녀 프로세스를 생성했고 부모 프로세스가 다시 a 프로세스를 생성했어요
부모 프로세스는 대기자를 기다리고 있어요
여기도요
명시하고 있어요
아뇨, 기다려요
그럼 시작하죠
어디 보죠
좋아요
이 코드를 여기에 컴파일하세요
여기요
대기 중이십니다
아이가 배우는 과정이죠
네 손을 쓰지 않으면 하위 과정이 종료되지 않더라도 하위 과정이 종료될 때까지 기다리거나
막히지 않습니다 다음 지시 사항과 함께 진행될 겁니다
어디 보죠
프로그램 무게예요
Dk 체중
C-의 밑줄
잠깐만요
패드 밑줄
네
프로그램을 실행하죠
여기 보시면 부모의 과정은 자녀의 과정이 끝날 때까지 기다리지 않았어요
개념 때문에요
부모는 이제 서로 막지 않아요
시스템 호출입니다
아이가 나올 때까지 기다리지 않았어요
이번에도 같은 거예요
컴파일
이 개념을 제거하고 0을 넘기면 이제 결과물이 뭐가 될지 알 수 있다는 의미죠
네 이제 이 경우에는 통화가 차단되고 부모가 아이가 종료하기를 기다리는
거예요
이것을 이용하지 않으면 호출을 막는 것입니다
네 부모 과정이 자녀 과정으로부터 출구 상태를 받으면 다음 지시 사항을 실행하기 시작합니다
,
이제 웨이티드예요
없는 p 값을 넘기면
여기 기존 자식 패드의 자식 패드를 지나가죠
원하는 출력이 나왔어요
이제 값을 전달하고 하위 프로세스를 기다린다고 해보죠
그런데 이 경우 이 부모 프로세스는 a ID 80인 자녀 프로세스를 갖고 있지 않다고
하죠
이 경우엔 결과가 어떤지 보죠
프로그램을 재편집하죠
이제 실행해보죠
여기 있는 건
반환된 값은 1입니다
여기 보시면∙∙∙ 예를 들면요
1에서 웨이트 패드를 다시 넣을게요
이 오류가 있어요 출력을 보죠
오류가 있네요 자식 프로세스가 아니에요
잠깐만요
반환 오류는 10입니다
이 경우 반환 값은 1이 됩니다
그렇다는 건
어디 보죠
뭐가 잘못됐나요?
에러요
오류를 이용해 여기서 오류를 프린트할 수 있습니다
문제는 아이들이 아니라는 거죠
즉, 80으로 명시된 것을 의미합니다
부모 프로세스는 id 80으로 자식 프로세스를 갖지 않아요
그래서 1을 반환했습니다
1이 반환되면 대기료가 실패했다는 뜻이죠
그리고 대기 임금을 출력했는데 이 경우에는 오류가 나왔어요