위치로 진입 점

마지막 업데이트: 2022년 6월 13일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
AI가 추천한 수원 여행 코스. 출처=IT동아

perlreguts

이 문서는 정규식 엔진의 내장과 작동 방식에 대해 간략히 설명하기위한 것입니다. 정규식 엔진은 perl 코드베이스의 상당한 부분을 나타내지 만 비교적 잘 이해되지 않습니다. 이 문서는 이러한 상황을 해결하기위한 빈약 한 시도입니다. 그것은 저자의 경험, 소스 코드의 주석, 정규식 엔진에 대한 다른 논문, perl5-porters 메일 목록에 대한 피드백 및 다른 곳에서도 의심의 여지가 있습니다.

주의! 여기에서 논의 된 동작과 구조는 저자가 글을 쓸 때 이해 한대로 엔진의 상태를 나타냅니다. 그것은 API 정의 가 아니며 , 정규식 엔진을 해킹하거나 정규식 엔진의 작동 방식을 이해하려는 사람들을위한 내부 가이드입니다. 이 문서의 독자는 perl의 정규식 구문과 사용법을 자세히 이해해야합니다. Perl 정규 표현식의 기본 사항에 대해 배우려면 perlre를 참조하십시오 . 그리고 정규식 엔진을 자신의 것으로 바꾸려면 perlreapi를 참조하십시오 .

OVERVIEW

용어에 대한 간단한 메모

"regexp"또는 "regex"를 말할지에 대한 논쟁이 있습니다. 이 문서에서는 특별한 이유가없는 한 "regex"라는 용어를 사용합니다.이 경우 그 이유를 설명합니다.

정규 표현식에 대해 말할 때 소스 코드 형식과 내부 형식을 구별해야합니다. 이 문서에서는 텍스트, 소스 코드 형식, 내부 표현을 말할 때 "프로그램"이라는 용어를 사용할 때 "패턴"이라는 용어를 사용합니다. 이들은 용어에 해당합니다 S-regex and B-regex Mark Jason Dominus가 "Rx"( "REFERENCES" 의 [1])에 대한 그의 논문에서 사용 합니다.

정규식 엔진이란 무엇입니까?

정규 표현식 엔진은 미니 언어로 지정된 일련의 제약 조건을 취한 다음 해당 제약 조건을 대상 문자열에 적용하고 문자열이 제약 조건을 만족하는지 여부를 결정하는 프로그램입니다. 언어의 전체 정의는 perlre 를 참조하십시오 .

덜 장황한 용어로, 작업의 첫 번째 부분은 패턴을 컴퓨터가 문자열에서 일치하는 점을 찾기 위해 효율적으로 사용할 수있는 것으로 바꾸는 것이고, 두 번째 부분은 검색 자체를 수행하는 것입니다.

이렇게하려면 텍스트를 파싱하여 프로그램을 만들어야합니다. 그런 다음 일치하는 문자열에서 포인트를 찾으려면 프로그램을 실행해야합니다. 그리고 우리는 모든 일을 효율적으로해야합니다.

정규식 프로그램의 구조

High Level

약간 혼란스럽고 일부 사람들은 용어에 반대하지만, 그 의견을 살펴볼 가치가 있습니다. regexp.h for years:

이것은 본질적으로 비 결정적 유한 상태 머신 (구문 분석에서 구문 도표 또는 "철도 정규 형식")의 선형 인코딩입니다.

"철도 정규형"이라는 용어는 약간 난해하며 "구문 다이어그램 / 차트"또는 "철도 다이어그램 / 차트"가 더 일반적인 용어입니다. 그럼에도 불구하고 그것은 정규식 프로그램의 유용한 정신적 이미지를 제공합니다 : 각 노드는 단일 엔트리와 대부분의 경우 단일 출구 포인트를 가진 트랙 단위로 생각할 수 있습니다 (포크가 있지만 트랙이 많은 트랙이 있습니다) 전체가 단일 항목과 단일 종료점을 가진 레이아웃을 형성합니다. 매칭 과정은 트랙을 따라 이동하는 차량으로 생각할 수 있으며, 시스템을 통한 특정 경로는 각 가능한 커넥터 지점에서 읽은 문자에 의해 결정됩니다. 자동차는 어느 시점에서나 트랙에서 떨어질 수 있지만 트랙과 일치하는 한 위치로 진입 점 계속 진행할 수 있습니다.

따라서 /foo(?:\w+|\d+|\s+)bar/ 은 다음 차트로 생각할 수 있습니다.

문제의 진실은 오늘날 펄의 정규 표현은 이러한 종류의 구조보다 훨씬 복잡하지만, 이런 식으로 위치로 진입 점 시각화하면 베어링을 가져올 때 도움이 될 수 있으며 현재 구현과 매우 일치합니다.

더 정확하게 말하면, 정규식 프로그램은 그래프의 인코딩이라고 말할 것입니다. 그래프의 각 노드는 리터럴 문자열 또는 분기와 같은 원래 정규식 패턴의 일부에 해당하며 일치시킬 다음 구성 요소를 나타내는 노드에 대한 포인터를 갖습니다. "node"와 "opcode"는 이미 perl 소스에서 다른 의미를 갖기 때문에 정규식 프로그램 "regops"에서 노드를 호출합니다.

프로그램은 regnode 구조 의 배열로 표시되며 , 그중 하나 이상은 프로그램의 단일 regop을 나타냅니다. 구조체 regnode 는 필요한 가장 작은 구조체이며 다른 모든 큰 구조체와 공유되는 필드 구조를 가지고 있습니다. (이 문서 외부에서 "regnode"라는 용어는 때때로 "regop"을 의미하는 데 사용되며 혼동 될 수 있습니다.)

BRANCH 를 제외한 모든 regops의 "다음"포인터는 연결을 구현합니다. 양쪽 끝에 BRANCH 가 있는 "다음"포인터 는 두 가지 대안을 연결합니다. [여기서 우리는 미묘한 구문 의존성 중 위치로 진입 점 하나를 가지고 있습니다 : 개별 BRANCH (모음과는 대조적으로)는 연산자 우선 순위 때문에 어떤 것도 연결되지 않습니다.]

일부 유형의 regop 피연산자는 리터럴 문자열입니다. 다른 사람들에게는 하위 프로그램으로 이어지는 레고 프입니다. 특히, BRANCH 노드 의 피연산자 는 분기의 첫 번째 regop입니다.

참고 : 철도의 비유에서 알 수 있듯이, 이것이 없는 세트 다음 일에 분기 커넥트의 꼬리 : 트리 구조 BRANCH 말이지. 그것은 마치 역이나 철도 야드로 갈 때 갈라지고 반대편에서 나오면 다시 합류하는 한 줄의 철도 선로와 같습니다.

Regops

regop의 기본 구조는 regexp.h as follows:

다른 더 큰 regnode 와 유사한 구조는 다음에서 정의됩니다. regcomp.h . regnode 와 동일한 필드를 가지며 구조에 추가 필드가있을 수 있으며 일부 경우 기본 필드의 특정 의미 (및 이름)가 재정의 된다는 점에서 서브 클래스와 거의 비슷 합니다. 다음은보다 완전한 설명입니다.

regnode_1 구조는 동일한 헤더를 가지며 그 뒤에 단일 4 바이트 인수가옵니다. regnode_2 구조체에는 두 개의 2 바이트 인수가 대신 포함됩니다.

regnode_string 리터럴 문자열에 사용되는 regnode_string 구조는 1 바이트 길이의 헤더 다음에 문자열 데이터를 따릅니다. 문자열은 끝 부분이 0 바이트로 채워져 노드의 총 길이가 4 바이트의 배수가됩니다.

regnode_charclass 로 묶인 문자 클래스는 regnode_charclass 로 표시됩니다 . 구조 , 4 바이트 인수와 그에 따라 Latin1 범위의 문자가 클래스에 포함되는 32 바이트 (256 비트) 비트 맵이 있습니다.

이름이 ANYOF_ 로 시작하는 다양한 플래그는 특별한 상황에 사용됩니다. 위의 Latin1 일치와 런타임까지 알려지지 않은 것은 "Perl의 pprivate 구조"에 저장됩니다 .

/l 일치하는 POSIX 문자 클래스를 나타내는 데 사용되는 더 큰 형식의 char 클래스 구조도 있습니다. regnode_charclass_posixl 은 POSIX 문자 클래스가 포함되어 있음을 나타내는 추가 32 비트 비트 맵이 있습니다.

regnodes.h regarglen[] 이라는 배열을 정의하여 각 opcode의 size regnode (4 바이트) 단위로 제공합니다 . 매크로는 str_len 필드를 기반으로 EXACT 노드 의 크기를 계산하는 데 사용됩니다 .

레고는 regnodes.h 에서 생성 된 regcomp.sym by regcomp.pl . 현재 최대 가능한 개별 레포 수는 256 개로 제한되며 약 1/4이 이미 사용됩니다.

일련의 매크로를 사용하면 필드에 더 쉽고 일관되게 액세스 할 수 있습니다. 여기에는 regnode 와 유사한 구조 의 유형을 결정하는 데 사용되는 OP() 가 포함됩니다 . NEXT_OFF() , 다음 노드에 대한 오프셋입니다 (나중에 자세히 설명). ARG() , ARG1() , ARG2() , ARG_SET() 및 인수를 읽고 설정하는 등가물; 및 STR_LEN() , STRING() 및 OPERAND() 조작 문자열 및 regop 베어링 위치로 진입 점 타입.

다음은 어떤 레 포프입니까?

정규식 엔진에는 "다음"이라는 세 가지 고유 한 개념이 있으며 명확하게 유지하는 것이 중요합니다.

주어진 regnode의 "다음 regnode"가 있습니다. 때로는 값이 다른 것 중 하나와 일치한다는 점을 제외하고는 거의 유용하지 않으며 때로는 코드가 항상 그런 것으로 가정합니다.

주어진 regop / regnode의 "다음 regop"이 있습니다. 이것은 현재 regop의 크기에 의해 결정된대로 현재 regop 뒤에 물리적으로 위치한 regop입니다. 구조를 덤프 할 때와 같이이 순서를 사용하여 트래버스하는 경우와 같이 종종 유용합니다. 때때로 코드는 "다음 regnode"가 "다음 regop"과 동일하다고 가정하거나, 즉 주어진 regop 유형의 크기가 항상 하나의 regnode 크기라고 가정합니다.

주어진 regop에서 "regnext"가 있습니다. 이것은 NEXT_OFF() 값으로 앞으로 점프 하거나, 위치로 진입 점 몇 가지 경우 regnode_1 구조 의 arg1 필드에 의해 더 긴 점프 를 통해 도달 하는 regop 입니다. 서브 루틴 regnext() 는 이것을 투명하게 처리합니다. 이것은 BRANCH regop 과 같은 경우에 특별한 의미를 갖는 노드의 논리적 후속 작업입니다 .

AI가 짜 주는 여행일정. 관광 앱 '터치수원' 써 보니

[IT동아 김동진 기자] 경기도 수원시가 관광 요소와 ICT 기술을 융합한 스마트 관광 앱 '터치수원'을 선보였다. 터치 한 번으로 수원시의 관광 정보를 제공하는 덕분에 관광객에게 차별화된 경험을 준다는 평가가 나온다. 개인 성향에 맞춰 인공지능이 여행 일정을 제시하는 기능까지 담았다는 터치수원 앱을 내려받아 어떤 서비스를 제공하고 있는지 살펴봤다.

터치수원 설치 화면 안내. 출처=수원시 관광정책팀

터치수원 설치 화면 안내. 출처=수원시 관광정책팀

위 이미지에 나타난 조선 제22대 왕 정조(1796년 수원 화성 건축)와 그의 어머니 혜경궁 홍씨 사이 QR 코드를 스캔하면 터치 수원 앱을 내려받을 수 있다.

터치수원 앱에 최초 진입한 모습. 출처=IT동아

터치수원 앱에 최초 진입한 모습. 출처=IT동아

내려받기를 완료한 후 앱을 실행하면 한국어와 영어, 일어, 중국어 중 원하는 서비스 언어를 선택할 수 있고, 이후 메인화면이 나온다.

명소와 맛집, 카페 안내. 실시간 주문, 예약도 가능

상단 탭을 눌러 진입하면 오른쪽 이미지와 같이 전체 기능을 담은 페이지를 만날 수 있다. 출처=IT동아

상단 탭을 눌러 진입하면 오른쪽 이미지와 같이 전체 기능을 담은 페이지를 만날 수 있다. 출처=IT동아

주요 기능을 살펴보려면 오른쪽 상단의 가로 두 줄 모양의 탭을 눌러보자. 터치수원이 담은 모든 기능을 주요 장소, 예약·구매, 이벤트, 실감 가이드, 기타 총 다섯 가지 카테고리로 구분해 나열한 것을 확인할 수 있다.

먼저 주요 장소 기능을 살펴보기 전, 메인 화면 가운데 '위치기반' 버튼을 누르면 주요 장소 서비스로 진입할 수 있다는 점을 알아두자. 수원에 도착해 터치수원 앱을 켜고 위치기반 버튼을 누르면, 내 위치와 가까운 유적지와 체험·어트랙션, 맛집, 카페 등을 안내한다. 오른쪽 상단 탭을 눌러 주요 장소 서비스로 진입해도 동일한 화면을 만날 수 있다.

주요장소, 위치기반 서비스에 진입한 모습. 출처=IT동아

주요장소, 위치기반 서비스에 진입한 모습. 출처=IT동아

주요 장소 탭 또는 위치기반 위치로 진입 점 서비스로 진입하면 화면 위쪽 상단 탭이 활성화된다. 관광 또는 카페 등 원하는 서비스를 선택하면, 자신의 위치와 가까운 유적지, 카페 등의 목록을 제시해준다. 가까운 숙박지나 주차장소, 화장실, 전통시장, 안내소, 짐 보관 장소까지 안내해 유용하다.

주요장소에 제시된 관광지 목록 중 하나를 선택하면 오디오가이드로 유적지 설명을 들을 수 있다. 카페 주문도 앱으로 가능하다. 출처=IT동아

주요장소에 제시된 관광지 목록 중 하나를 선택하면 오디오가이드로 유적지 설명을 들을 수 있다. 카페 주문도 앱으로 가능하다. 출처=IT동아

주요 장소 기능이 제시한 유적지 중 하나를 선택해봤다. 오디오가이드 기능 탭이 눈에 띄었는데, 이 탭을 누르면 유적지와 관련된 설명을 역사 강사 최태성 씨의 목소리로 들을 수 있다. 이 밖에도 유적지 입장료와 관람 시간, 길 안내, 주차 가능 여부에 관한 정보도 제공한다. 탭을 카페로 바꾸면 직접 현장에 가지 않고도, 가까운 카페를 선택해 미리 음료를 주문할 수 있다. 이 밖에도 무드등 만들기와 같은 체험이나 어트랙션, 맛집, 숙박 등도 앱을 통해 예약 가능하다.

AI가 제시하는 수원 여행 플랜

AI가 여행 일정을 추천하기 위해 다섯 가지 질문을 하는 모습. 출처=IT동아

AI가 여행 일정을 추천하기 위해 다섯 가지 질문을 하는 모습. 출처=IT동아

터치수원의 흥미 요소 중 하나는 AI가 추천 여행코스를 제시한다는 점이다. AI가 던지는 질문이 꽤 상세한데, 먼저 방문 시간대가 오전인지 오후인지 혹은 야간인지 묻는다. 이후 연령대와 함께 동반 여행객 정보에 관한 질문이 이어진다. 예컨대 가족, 연인과 오는지, 비즈니스 목적의 방문인지 등을 체크하는 것이다. 이후 여유로운 여행이 좋은지, 셀카를 선호하는지, 북적이는 곳이 좋은지를 파악하고, 마지막으로 관광지 순위와 함께 수원의 어느 지역을 선호하는지를 묻는다.

AI가 추천한 수원 여행 코스. 출처=IT동아

AI가 추천한 수원 여행 코스. 출처=IT동아

모든 질문에 답하면 AI가 추천 여행코스를 제시한다. 성격유형 검사인 MBTI의 인기를 반영하듯 여행 스타일에 대한 분석까지 덧붙인다.

첨단기술 활용 유적지 안내

터치수원을 통해 첨단 기술로 유적지를 미리 살펴볼 수도 있다. 확장현실(eXtended Reality)을 활용한 'XR 버스 1795행(오는 28일부터 운행)'이 대표적인 예다. 수원시 관광정책팀에 따르면, 평소에는 투명하고 필요한 때 영상을 재생하는 투명 디스플레이 T-OLED(Transparent-OLED)를 창문에 장착한 특수 버스를 타고 정조의 을묘원행을 체험할 수 있는 프로그램이라고 한다. 기존에 경험해보지 못했던 새로운 방식으로 조선시대 여행을 떠나는 서비스라고 강조했다.

XR 버스 내부의 모습. 출처=수원시

XR 버스 내부의 모습. 출처=수원시

XR 버스 1795행 버스는 'Memory of 1795-기록에서 기억으로'라는 부제로 운영되는데, 수원화성 주변을 3개 파트로 나눠 역사를 되짚는 길로 운행한다. 첫 번째 파트는 연무대~화성행궁~팔달문~화서문 구간(정조대왕 능 행차), 두 번째 파트는 장안문~용연~창룡문 구간(수원화성 축성에 숨겨진 조선후기 과학과 건축기술), 세 번째 파트는 화홍문~수원 화성박물관~연무대(야간 군사훈련 '야조(夜操)') 등이다.

AR, VR로 수원의 유적지를 안내하는 모습. 출처=IT동아

AR, VR로 수원의 유적지를 안내하는 모습. 출처=IT동아

관광앱 터치수원에 아쉬운 점도 있었다. 실감가이드 중 주요 유적지를 증강현실(AR)‧가상현실(VR)로 만나볼 수 있는 기능은 진입 시간만 아이폰11 프로 기준, 1분 가까이 걸릴 정도로 느렸다. 물론 기능에 진입하면 실감형 콘텐츠와 함께 음성으로 유적지에 대한 설명이 나와 유용했다. 아직 시범 서비스 기간이고 최적화 중인 앱이니만큼, 개선을 기대해본다.

수원시 관광정책팀 관계자는 “지난해 문화체육관광부의 스마트관광도시 조성사업에 유일하게 수원시가 선정돼 1년간 앱 출시를 준비해왔다”며 “더 나은 서비스를 제공하기 위해 오류를 제보해주는 사용자에게 커피쿠폰도 제공하고 있다. 앱 활성화를 위해 회원가입 시 터치수원 제휴점에서 쓸 수 있는 쿠폰도 제공하고 있으니 많은 관심 바란다”고 말했다.

[태그:] main 함수 매개 변수

이번에는 main 함수 매개 변수를 사용하는 방법을 살펴보아요.
main 함수는 프로그램 진입점 함수로 프로그램의 개발자가 작성한 코드 중에서 제일 먼저 수행하죠.
main 함수는 시작하면서 인자와 환경 변수를 받아 사용할 수 있고 종료 결과를 반환할 수 위치로 진입 점 있어요.

main 함수는 전달한 인자와 환경변수를 선택적으로 사용할 수 있어서 개발자는 다양한 형태의 원형을 갖는 main 함수 중에 한 가지 형태로 정의하여 사용할 수 있어요.

main 함수의 첫번째 인자는 시작한 곳에서 전달한 인자의 개수예요.
두번째 인자는 전달한 인자 요소 컬렉션의 주소이며 세번째 인자는 환경 변수 컬렉션의 주소예요.
인자 요소는 문자열로 되어 있어서 인자 요소 컬렉션을 받기 위해 char ** 형식으로 받을 수 있어요.
그리고 환경 변수는 “key=value”처럼 키와 값의 쌍을 = 문자로 구분한 문자열로 되어 있어요.
환경 변수 컬렉션의 주소도 ,char **형태로 받을 수 있어요.

프로그램 진입점으로 전달한 인자를 아규먼트(argument)라 불러요.
main 함수의 첫번째 인자인 argc는 argument count의 약자이며 argv는 argument vector의 약자예요.

다음 코드는 argument로 전달받은 모든 인자를 출력하는 간단한 예제 코드예요.
◈ Program.c

테스트는 콘솔 창을 열어 프로그램 실행 파일이 있는 위치로 이동하여 실행 파일명과 여러 인자를 입력하세요.
환경 변수를 사용하는 방법에 대해서는 다루지 않을게요.
관심있으신 분은 getenv 함수와 putenv 함수 사용법을 살펴보세요.

F.R.I.D.A.Y.

이전 프로그램과 달리 메모리주소가 [ 401000 ]에서 시작하지 않고 [ 40116B ]에서 시작한다. 이는 사전 작업으로 프로그램을 시작하기 전 사전 작업을 위한 코드로 보인다. 쭉 실행하다보면 메모리주소[ 401233 ]에서 아래와 같은 코드를 볼 수 있다. call crackme1.00401000 프로그램 진입점이다. 밑줄 친 부분이 실제 메시지박스를 띄우는 함수를 콜하는 부분 [ 401003 ]위치에서 [F7]을 눌러 메시지콜 함수로 진입한다.메시지 박스 콜 함수에 진입한 모습 그러면 위 이미지와 같은 메모리 주소로 이동한다. [ 40102E ]에서 local.1과 5를 비교해 ZF에 저장한다. 그러면 jnz에 의해 다음 메모리 주소로 이동할지, jnz가 지정한 메모리 주소로 갈지 분기를 정한다..

abexcm1(실습).exe를 실행하면 위와같은 메시지가 출력된다. 그리고 [확인]을 누르면 Error라는 제목의 메시지가 발생하는데, 이를 아래와같은 메시지로 출력할 수 있도록 코드를 수정해야한다. " Ok, I really think that you HD is a CD-ROM! :p " 처음 olly를 실행해서 abexcm1을 열게되면 아래와 같은 어셈 코드가 나온다.ASM 코드 (x64라서 그런지 모듈명이 ntdll이다 ) 이 상황에서 [F9]를 누르면 프로그램의 진입점, 즉 프로그램이 시작하는 첫 코드로 이동하게 된다. 아래 이미지와 같은 화면이 나오면 된다. 메모리의 주소는 [ 401000 ]으로, 이 주소가 프로그램의 시작이다. 그외에는 오류. [F8]을 이용해 메모리 주소가 [ 401024 ..

단축키 설명 Ctrl + F2 다시 디버깅 ( 프로그램을 종료하고 다시 디버깅) F7 현재 코드 실행 (함수 호출시 함수 내부로 진입) F8 현재 코드 실행 (함수 호출시 함수 실행 후 다음 코드 이동) Ctrl + F9 함수코드 내에서 탈출 ( caller로 이동) Ctrl + G 원하는 코드 줄로 이동 ' ; ' comment 추가 (주석기능) ' : ' Label 추가 ( 메모리 주소에 이름 부여) F2 Break Point 설정/해제 Alt + B Break Point 목록 F9 실행, BP가 걸린 곳까지 실행 ' * ' 현재 BP의 위치를 보여줌 ' - ' 직전 커서 위치를 보여줌 Ctrl + F8 F8 작업 지속 실행

[Kotlin] coroutine, suspend 함수 정리 및 예제

코루틴이란. 실행의 지연과 재개를 허용함으로서, 비선점 멀티테스킹을 위한 서브루틴을 일반화한 구성요소입니다.
자세히 이해하기 위해 서브루틴비선점 멀티테스킹 두가지 개념을 알아야 합니다.

루틴과 서브루틴

루틴은 컴퓨터 프로그램에서 위치로 진입 점 하나의 정리된 일(job)입니다.
프로그램은 보통 크고 작은 여러가지 루틴을 조합시킴으로써 만들어집니다.

루틴은 다시 메인루틴서브루틴으로 나뉩니다.
메인루틴은 프로그램 전체의 개괄적인 동작 절차를 표시하도록 만들어 집니다.
서브루틴은 반복되는 특정 기능을 모아 별도로 묶어 이름을 붙여 놓은 것입니다.
그리고 별도의 메모리에 해당 기능을 모아놓고 서브루틴이 호출될 때마다 저장된 메모리로 이동했다가 return 을 통해 원래 호출자의 위치로 돌아오게 됩니다. (function과 비슷한 개념)

서브루틴과 코루틴 (subroutine and coroutine)

코루틴도 루틴의 일종입니다. 다만 세가지의 차이점이 있습니다.

  • 코루틴에서는 메인-서브 개념이 없습니다. 모든 루틴들이 서로를 호출할 수 있습니다.
  • 서브루틴의 경우 메인루틴에서 특정 공간으로 이동한 후 return에 의해 돌아와 다시 프로세스를 진행하는데 반해,
    코루틴의 경우 루틴을 진행하는 중간에 멈추어서 특정 위치로 갔다가 다시 원래 위치로 돌아와 나머지 루틴을 실행할 수 있습니다.
  • 서브루틴은 진입점과 반환점이 단 하나밖에 없어 메인루틴에 종속적입니다.
    하지만 코루틴은 진입지점이 여러개이기 때문에 메인루틴에 종속적이지 않고 대등하게 데이터를 주고 받을 수 있습니다.

비선점형 멀티태스킹과 선점형 멀티태스킹

하나의 Task가 Scheduler로 부터 자원을 할당 받았을 때,
Scheduler가 자원을 강제로 뺐을 수 있으면 선점형 멀티테스킹입니다.
반대로 뺐을 수 없으면 비선점형 멀티테스킹입니다.

스레드는 선점형 멀티테크킹이지만, 코루틴은 비선점형 멀티테스킹입니다.
즉, 코루팅은 병행성(Concurrency)을 제공하지만 병렬성(Parallelism)을 제공하지 않습니다.

이어서 병행성과 병렬성의 차이점을 알아보겠습니다.

병행성 (Concurrency)

  • 동시에 실행되는 것처럼 보입니다.
  • Logical Level에 속합니다.
  • Single Core를 사용합니다.
  • 물리적으로 병렬이 아닌 순차적으로 동작할 수 있습니다.
  • 실제로는 Time-sharing으로 CPU 자원을 나눠 사용함으로써 사용자가 Concurrency를 느낄 수 있도록합니다.

병렬성 (Parallelism)

  • 실제로 동시에 작업이 처리됩니다.
  • Physical(Machine) Level에 속합니다.
  • 오직 Multi Core에서만 가능합니다.

다시 돌아와서 선점형 멀티테스킹인 스레드에 비해 비선점형 멀티테스킹인 코루틴의 장점은 아래와 같습니다.

  • 스레드간 작업 교환은 system call 또는 blocking call 콜 등의 비용이 발생하지만 코루틴간 작업 교환 비용이 적습니다.
  • 동기화 작업을 위한 mutexes, semaphores 등의 장치가 필요없습니다.
  • Single Core이기 때문에 OS의 지원이 필요 없습니다.

결론적으로 코루틴은 스레드에 비해 비용이 위치로 진입 점 적은 멀티테스킹 방식입니다.

코틀린 코루틴

2018년 10월 29일 Kotlin 1.3에 코틀린 코루틴이 추가되어 코루틴을 사용할 수 있게 되었습니다.

위 예제에서 GlobalScope는 전체 어플리케이션의 라이프타임입니다.
launch는 해당 코드 블럭에서 현재 스레드를 blocking 하지 않고 코르틴으로 실행한다는 의미입니다.

위의 예제에서 delay 함수는 스레드를 blocking 할 수 없는 suspending 함수입니다.
실제 스레드를 blocking 하기 위해서는 runBlocking을 사용하여 아래와 같이 작성하면 되겠습니다.

coroutineScoperunBlocking 과 다르게, 모든 자식들이 완료될 때까지 현재 스레드를 블락시키지 않습니다.
해당 coroutineScope를 함수로 만들 수 있는 키워드가 suspend 입니다.

Suspend

Suspend는 '중지하다' 라는 뜻입니다.
코루틴에서 suspend 키워드는 아래와 같이 정의되어 있습니다.

동시 처리를 원한다면 아래와 같이 async 를 사용하면 됩니다.

async scope 함수는 아래와 같은 특징을 위치로 진입 점 가지고 있습니다.

  • 동시에 수행할 수 있습니다.
  • Deferred Type을 리턴합니다. (js에서 Promise와 같은 형식)
  • 같은 scope 내에 하나라도 처리가 실패하면 모든 자식들이 다 처리 실패됩니다. (throw exception)

job.join()

job.cancel()

Dispatchers

코루틴 실행에 사용하는 스레드를 결정합니다.
모든 코루핀 빌더 (ex. launch, async 등)는 디스패처를 지정할 수 있습니다.
다음은 대표적인 Dispathers 입니다.


0 개 댓글

답장을 남겨주세요