아래 그림은 Hyperscan 라이브러리를 컴파일하기 위해 미리 설치되어야할 소프트웨어 목록과 최소 버전 정보입니다. Pcap은 hyperscan에서 제공하는 샘플 코드를 사용하지 않을거라면 굳이 설치할 필요는 없기때문에 제외하도록 하겠습니다. (설치 과정에서 발생하는 오류 댓글로 남겨주시면 피드백드리겠습니다😁)
// 정규표현식 샘플 패턴이 저장된 파일을 Hyperscan Pattern DB를 컴파일하기 위한 형태로 파싱해주는 함수입니다. // // 파싱하는 파일의 구조는 <id>:/<pattern>/<flags> 형태이며, // id/pattern/flags를 각각 멤버 변수인 ids_, patterns_, flags_에 저장합니다. boolparseFile(conststd::string &filename) { std::ifstream inFile(filename, std::ifstream::in); if (!inFile.good()) { std::cout << "ERROR: unable to open file \"" << filename << "\"" << std::endl; returnfalse; }
for (int i = 1; !inFile.eof(); i++) { std::string line; getline(inFile, line);
if (line.empty() || line[0] == '#') { continue; }
size_t colonIdx = line.find_first_of(':'); if (colonIdx == std::string::npos) { std::cout << "ERROR: Could not parse line " << i << std::endl; inFile.close(); returnfalse; }
unsignedint id = std::stoi(line.substr(0, colonIdx).c_str());
// 인자로 전달된 패턴 정보가 Hyperscan Pattern DB에 존재하는지 여부를 반환하는 함수입니다. boolscanPattern(std::string pattern) { unsignedint match_count = 0;
// 매칭되는 패턴이 Hyperscan Pattern DB에 존재한다면 hs_scan 함수의 6번째 인자로 등록되는 // 콜백 함수(해당 코드에서는 람다 함수로 구현)를 통해 결과를 확인할 수 있으며, // 5번째 인자인 ctx를 통해 hs_scan 외부의 변수에 콜백 함수의 결과를 저장할 수도 있습니다. if (hs_scan( db_, pattern.c_str(), pattern.length(), 0, scratch_, [](unsignedint id, unsignedlonglong from, unsignedlonglong to, unsignedint flags, void *ctx) -> int { size_t *matches = (size_t *)ctx; (*matches)++; std::cout << "id: " << id << " from: " << from << " to: " << to << " flags: " << flags << std::endl; return0; }, &match_count) != HS_SUCCESS) { std::cout << "hs_scan failed." << std::endl; returnfalse; }
지금까지 Hyperscan 소스 빌드 과정과 정규표현식 샘플 패턴을 체크하기 위한 테스트 코드 작성에 대해 알아보았습니다. 해당 포스팅에서는 Hyperscan API의 가장 기본적인 동작들만을 살펴보았구요, Hyperscan 공식 문서를 살펴보면 멀티쓰레드 환경(“main” thread에서 pattern db를 compile하고 2개 이상의 “worker” thread에서 scan을 수행)에서도 사용이 가능하다고 하니 어떤식으로 구현해야할지 함께 고민해보면 좋을 것 같습니다. 긴 글 읽어주셔서 감사합니다🙂
In a scenario where a set of expressions are compiled by a single “main” thread and data will be scanned by multiple “worker” threads, the convenience function hs_clone_scratch() allows multiple copies of an existing scratch space to be made for each thread (rather than forcing the caller to pass all the compiled databases through hs_alloc_scratch() multiple times).
오늘은 공룡책🦕에 언급된 Blocking과 Nonblocking, Synchronous와 Asynchronous에 대해서 정리해보고자 합니다. Synchronous와 Asynchronous의 개념은 쓰레드와 I/O에서 등장하게 되는데요, 각각이 어떠한 의미로 사용되는지도 구분해서 살펴보도록 하겠습니다.
이번 포스팅에서는 인텔 Hyperscan의 공식 문서를 통해 컴파일(compile)이나 스캔(scan)과 같은 Hyperscan의 기본적인 개념들에 대해 알아보도록 하겠습니다. 추후에는 Hyperscan API를 직접 사용하여 정규 표현식 패턴 매칭을 수행하는 샘플 코드도 업로드할 예정입니다.
이번 포스팅에서는 The Art of Debugging with GDB, DDD and Eclipse의 Chatper 4 WHEN A PROGRAM CRASHES 내용을 번역해보았습니다. 해당 챕터의 앞부분에서는 가상 주소 공간에서의 페이지(page)에 대한 개념을 소개하고 seg fault가 발생하는 원인을 페이지(page)와 연관지어 잘 설명해주고 있습니다.