개발자도 차트 그릴 수 있다구요!
2021년 12월 23일대회나 개인 프로젝트를 소개할 때 서버 구조를 시각적으로 보여주거나 다이어그램을 보여줄 때가 많습니다. 혹은 보고서, 논문을 쓰거나 컴퓨터 관련 책을 쓸 때 그림 제공과 함께 이해를 돕습니다. 이번 시간에 이러한 시각적 자료를 만들 때 유용한 프로그램들을 소개하려 합니다.
-
첫 번째 프로그램으로 draw.io 입니다. draw.io는 플로우 차트를 그려주는 프로그램입니다. 플로우차트 뿐만 아니라 클래스/ERD/시퀀스 다이어그램, UML 등 각 종 차트를 그리는데 도움을 줍니다. 사용법도 직관적이라 별도의 매뉴얼이 필요없을 정도 입니다. 저는 주로 플로우 차트, ERD를 그리는데 사용합니다. 웹 혹은 프로그램 형태로 사용 할 수 있습니다. draw.io로 그린 데이터는 기본 xml 형식으로 저장되고 불러올 수 있으며 png, svg 형태로 export도 할 수 있습니다. 쉽게 플로우 차트를 그릴 수 있는 draw.io 추천합니다.
draw.io 플로우 차트 예시 -
ipe는 draw.io와 흡사한 drawing editor로 제가 정말 애용하는 프로그램입니다. draw.io보다 복잡한 도형을 그릴 수 있으며 latex으로 적용되어 다양한 수식을 지원합니다. 설명탕에 나오는 그림들은 거의 ipe로 만든거라 보시면 됩니다. 처음 ipe를 접할 시, 사용방법을 조금 익히셔야 하지만 적응이 된다면 더할 나위 없는 drawing editor라 생각됩니다. ipe는 프로그램 형태로 제공합니다. 또한 latex을 추가로 설치하면 latex 기능들도 사용할 수 있습니다. 또한 draw.io와 다르게 ipe는 pdf 형태로 저장하고 다시 불러올 수 있는 장점이 있습니다.
ipe 예시 -
ipe를 소개할 때 latex라는 용어를 언급했습니다. latex은 앞의 프로그램과 다르게 문서 작성(typesetter) 프로그램입니다. 참고로 발음할 때 ‘라텍스’가 아닌 ‘레이텍’으로 읽으니 주의하세요! latex은 markdown처럼 문서를 프로그램 작성하듯이 쓸 수 있습니다. 따라서 문서 작성에 있어 자유도가 높고 일관되고 깔끔한 문서를 작성 할 수 있습니다. 북마크는 물론 수식 처리, 문단 나누기, 참고 문헌, 좌우 여백 설정 등등 Micorsoft Word 뺨치는 기능들을 제공합니다. 논문과 책을 쓸 때 latex만한게 있을까 싶을 정도로 충분히 매력적인 프로그램입니다. latex은 프로그램 언어를 배우는 것처럼 기본 문법을 익혀야 하고 컴파일하듯이 pdf 문서를 생성하므로 툴 사용법에 대한 허들이 있습니다. 이러한 고통을 이기고 나온 결과물을 본다면 뿌듯한 문서가 완성된 것을 보실 수 있을겁니다. 추가로 markdown과 latex의 문법은 노션에서도 사용할 수 있으니 한 번 익혀두면 두고두고 쓰일테니 한 번 도전해보세요!
-
LaTeX 코드 예시
LATEX\documentclass[a4paper,footnote, 9pt]{oblivoir} \usepackage[stock]{fapapersize} \usepackage{kotex, graphicx, indentfirst, cite} \usepackage[framemethod=TikZ]{mdframed} \usepackage[font=small,labelfont=bf]{caption} \usepackage[utf8]{inputenc} \usefastocksize{210mm,297mm} \usefapapersize{182mm,257mm,30mm,*,38mm,*} \setlength{\droptitle}{-10em} \title{\HUGE{멀티태스킹 구현}} \author{설명탕} \date{} \mdfdefinestyle{MyFrame} { linecolor=gray, outerlinewidth=1pt, roundcorner=10pt, innertopmargin=\baselineskip, innerbottommargin=\baselineskip, innerrightmargin=20pt, innerleftmargin=20pt, backgroundcolor=gray!5!white } \begin{document} \maketitle \section{Task, Context} \textbf{태스크(Task)}는 프로세서의 관점에서 개별적으로 수행할 수 있는 작업을 의미한다. \textbf{콘텍스트(Context)}는 실행 중인 프로세서의 상태, 즉 모든 레지스터를 저장하고 있다. 따라서 각 태스크마다 개별적인 콘텍스트만 보장한다면 어러 개의 태스크를 동시에 실행해도 서로 간섭 없이 처리 할 수 있다. \\\\ 하지만 태스크를 완전히 독립시키려면 콘텍스트를 개별적으로 할당하는 것만으로 부족하다. 태스크 마다 스택을 부여해줘야 한다. 스택은 임시 데이터, 복귀 어드레스와 같은 데이터를 저장한다. 따라서 스택의 구분이 없으면 다른 태스크로 인해 스택이 내용이 변경되므로 태스크마다 개별적인 스택이 있어야한다. \\\\ 스택이 태스크마다 개별적으로 가져야 하지만 데이터는 쓰임에 따라 공통으로 사용할 수 있다. 태스크가 같은 코드를 수행한다면 새롭게 데이터를 생성할 필요없이 공유하면 된다. \\ 그림 \ref{stack_context}은 앞서 설명한 태스크, 코드, 데이터, 콘텍스트와 스택의 관계를 나타낸 것이다.태스크 2와 3은 같은 코드와 데이터를 공유한다. 코드와 데이터는 태스크 2와 3이 공유하지만, 콘텍스트와 스택은 구분되어 있는 것을 확인 할 수 있다. \begin{figure}[th!] \centering \includegraphics[width=0.65\textwidth]{figures/stack_context.png} \caption{태스크, 코드, 데이터, 콘텍스트 그리고 스택의 관계} \label{stack_context} \end{figure} \section{멀티태스킹과 성능 향상} 멀티태스킹은 싱글 코어 프로세서(Single-core Processor) 시절부터 사용된 기법으로, 여러 개의 태스크를 동시에 실행하는 기능이다. 하나의 코어는 여러 개의 태스크를 동시에 실행 할 수 없다. 특정 시점에서 실행되는 태스크는 코어당 하나지만, 아주 짧은 주기마다 혹은 특정 이벤트가 발생할 때마다 다른 태스크로 전환함으로써 마치 여러 태스크를 동시에 수행하는 것처럼 동작한다. \\ \begin{mdframed}[style=MyFrame] \setstretch{1.3} \textbf{프로세서(Processor)}는 패키지 형태로 출시된 칩을 의미한다. \textbf{코어 (Core)}는 프로세서에 들어있는 CPU(Central Processing Unit)를 의미한다. 싱글 코어 프로세서는 프로세서당 코어나 하나 씩 있는 프로세서이다. 멀티코어 프로세서는 프로세서당 2개 이상의 코어가 존재하는 프로세서이다. \end{mdframed} 대부분의 OS는 \textbf{시분할 멀티태스킹(Time-Sharing Multitasking)}을 사용한다. 이 기법은 PIT 컨트롤러를 아주 짧은 주기로 설정하여, IRQ 0 인터럽트에 맞춰 태스크를 전환하는 기법이다. 시분할 멀티태스킹은 기법은 프로세서 사용 시간을 할당하고 해당 시간이 지나면 강제로 다른 태스크로 전환한다. 따라서 다수의 태스크가 골고루 실행이 되는 장점을 가진다. \\ \begin{mdframed}[style=MyFrame] \setstretch{1.0} 멀티태스킹 기법은 태스크에 할당된 프로세스 시간이 지났거나 특정 이벤트가 발생했을 때 강제로 태스크를 전환할 수 있는가에 따라 선점 방식과 비선점 방식으로 나뉜다. \\\\ \textbf{선점(Preemptive) 방식}은 태스크를 강제로 전환하는 방식이다. 이러한 강제성 때문에 안정적으로 멀티태스킹을 수행할 수 있다. 하지만 어느 시점에서 강제로 태스크가 전환될지 예측할 수 없으므로 구현하기가 까다롭다. \\\\ \textbf{비선점(Non-preemptive) 방식}은 태스크 전환 여부를 태스크 스스로 판단하는 방식이다. 코드가 효율적으로 작성되었다면 선점으로 인한 불필요한 태스크 전환을 피할 수 있다. 하지만 태스크가 프로세서를 독점하는 경우 시스템 전체 성능이 저하되는 문제가 있다. \end{mdframed} 멀티태스킹을 사용하면 응답 시간이 빨라진다. 응답 시간이 짧을수록 사용자의 체감 속도가 빨라진다. 일괄 처리 방식과 멀티태스킹 방식을 비교하면서 실제로 대기 시간이 어떻게 되는지 살펴보자. \\\\ A, B, C 순으로 세 가지 태스크가 입력되고, 작업을 완료하는데 프로세서가 각 4, 2, 1 만큼 필요한 경우를 생각해보자. 그림 \ref{batch}와 같이, 작업을 순차적으로 처리한다면 4, 6, 7 만큼 지나야 작업이 모두 완료된다. 이 때의 응답 시간은 각 0, 4, 6 이다. \\ \begin{figure}[h] \centering \includegraphics[width=0.7\textwidth]{figures/batch.png} \caption{일괄 처리 방식으로 태스크를 처리할 때 태스크의 완료 시점과 대기 시간} \label{batch} \end{figure} \\ 이제 시분할 멀티태스킹 기법으로 공평하게 프로레서를 1씩 할당해보자. 이 때의 경우 그림 \ref{multitasking}과 같이 나타난다. 태스크 A, B, C의 순으로 1씩 실행하므로 A는 0, B는 1, C는 2 만큼 지난 뒤 실행 된다. 그리고 C 태스크는 프로세서를 할당받은 뒤 3 시점에서 수행이 끝난다. \\ \begin{figure}[h] \centering \includegraphics[width=0.7\textwidth]{figures/multitasking.png} \caption{멀티태스킹 방식으로 태스크를 처리할 때 태스크의 완료 시점과 대기 시간} \label{multitasking} \end{figure} \\ 이후에는 A와 B가 교대하면서 실행한다. 결과적으로 B 태스크와 A 태스크 순으로 각 5, 7의 시점에서 실행이 완료된다. 이처럼 응답 시간 관점에서 일괄 처리 방식보다 멀티태스킹 방식이 더 우수하다. 비록 프로세서를 1씩 나누어 사용하기 떄문에 대기 시간이 중간에 포함되지만, 모든 태스크가 동시에 실행되는 효과를 얻을 수 있다. \section{태스크 제어 블록 } \textbf{태스크 제어 블록(TCB, Task Control Block)}은 태스크의 종합적인 정보가 들어 있는 자료구조이다. 이 자료구조는 코드, 데이터, 콘텍스트, 스택, 태스크ID, 기타 속성을 포함한다. 태스크의 정보를 TCB에 모아 관리하면 태스크에 관련된 작업을 편리하게 처리할 수 있다. TCB는 각 태스크의 상태를 그대로 반영하므로 태스크와 TCB가 1:1로 연결돼야 한다. \begin{mdframed} \setstretch{0.7} \begin{verbatim} typedef struct kTaskControlBlockStruct { // 콘텍스트 CONTEXT stContext; // ID와 플래그 QWORD qwID; QWORD qwFlags; // 스택의 어드레스와 크기 void* pvStackAddress; QWORD qwStackSize; } TCB; \end{verbatim} \end{mdframed} 콘텍스트는 레지스터를 저장하는 자료구조이다. 여기에는 인터럽트와 예외 처리에서 저장하는 것과 같은 방식으로 총 24개의 레지스터를 저장한다. 인터럽트나 예외 처리가 발생헀을 때의 콘텍스트 순서랑 같게 한다. 이는 콘텍스트 저장과 복원 코드를 그대로 태스크 전환에 사용하기 위함이다. \\\\ 태스크, 멀티태스킹과 간단한 멀티태스킹의 구현에 대해서 알아보았다. 현대 OS에서 빠질 수 없는 기능으로 스케줄러를 추가하고 다수의 태스크를 생성하는 함수 까지 구현하면 엄청난 결과물을 볼 수 있을 것이다. \bibliographystyle{abbrv} \bibliography{mybib} \end{document}
$\Gamma_v = \frac{1}{k(k-1)}\sum_{j=1}^{k}\frac{n_j}{n}\sum_{l \not= j}^{k}e(p_0^{(j)},p_0^{(l)})$
노션 LaTeX 예시
-
간단하게 draw.io, ipe, latex에 대한 소개를 했습니다. 이 세가지 프로그램을 알고난 뒤 github의 readme를 작성하거나 설명탕 글 쓰는게 더욱 즐거워졌습니다. 제가 생각한 그림/구조를 시각적으로 쉽게 표현할 수 있어 애용합니다. 저와 같이 어떻게 하면 자신이 생각한 내용을 효과적으로 전달할 수 있을까 고민하시는 분들한테 적극 추천드립니다.