CPU 调度甘特图

CPU 调度甘特图

我想要一些东西来创造这样的东西:

在此处输入图片描述

我在这里找到了类似的答案:https://tex.stackexchange.com/a/296389/209014

但在该链接中显示的是非抢占式调度 - 这意味着该过程不能重复,必须立即完成。在上图中,它是抢占式调度,例如 p2 被拆分。我如何才能有一个可以轻松快速地完成这两项工作的宏?类似于:

\begin{scheduling}
\process{2}{2}
\process{4}{2}
\process{2}{3}
\process{3}{7}
\process{1}{8}
\end{scheduling}

以上只是一个例子。如果有其他替代方法或更快捷的方法,我们将不胜感激。

答案1

想出这样的环境非常容易。填充颜色存储在样式中1/.style={fill=red!20},,整体样式存储在目录box中的样式中scheduling。因此,它也非常容易定制。但肯定不如一个好的、成熟的包那么通用。

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{chains}
\tikzset{scheduling/.cd,box/.style={draw=red!70!black,minimum height=1.8em},
1/.style={fill=red!20},
2/.style={fill=green!20},
3/.style={fill=gray!20},
4/.style={fill=cyan!20},
5/.style={fill=blue!20},
}
\newenvironment{scheduling}[1][]{%
\begin{tikzpicture}[start chain=A going right,node distance=0pt]
\edef\tmpx{0}%
\newcommand{\process}[3][]{%
\node[on chain,minimum width=##3*1em,scheduling/box,
style/.expanded={scheduling/##2},##1]{p##2};
\pgfmathsetmacro{\tmpx}{\tmpx+##3}
\node[anchor=north] at (A-\tikzchaincount.south east)
{$\pgfmathprintnumber\tmpx$};
\ifnum\tikzchaincount=1
\node[anchor=north] at (A-1.south west) {$0$};
\fi}}{\end{tikzpicture}}
\begin{document}
\begin{scheduling}
\process{2}{2}
\process{4}{2}
\process{2}{3}
\process{3}{7}
\process{1}{8}
\end{scheduling}
\end{document}

在此处输入图片描述

这是一个略微的变化,它有一个样式循环列表(其长度存储在中n-styles)并允许语法

\processes{2/2,4/2,2/3,3/7,1/8,6/2,7/4}

让这个东西更加人性化

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{chains}
\tikzset{scheduling/.cd,box/.style={draw=red!70!black,minimum height=1.8em},
1/.style={fill=red!20},
2/.style={fill=green!20},
3/.style={fill=gray!20},
4/.style={fill=cyan!20},
5/.style={fill=blue!20},
6/.style={fill=orange!20},
n-styles/.initial=6%<- cycle list reset
}
\makeatletter
\newenvironment{scheduling}[1][]{%
\begin{tikzpicture}[start chain=A going right,node distance=0pt]
\edef\tmpx{0}%
\newcommand{\process}[3][]{%
\pgfmathtruncatemacro{\istyle}{1+Mod(##2-1,\pgfkeysvalueof{/tikz/scheduling/n-styles})}
\node[on chain,minimum width=##3*1em,scheduling/box,
style/.expanded={scheduling/\istyle},##1]{p##2};
\pgfmathsetmacro{\tmpx}{\tmpx+##3}
\node[anchor=north] at (A-\tikzchaincount.south east)
{$\pgfmathprintnumber\tmpx$};
\ifnum\tikzchaincount=1
\node[anchor=north] at (A-1.south west) {$0$};
\fi}%
\def\pft##1/##2;{\edef\X{##1}\edef\Y{##2}}
\newcommand{\processes}[2][]{\@for\next:=##2\do{%
\expandafter\pft\next;
\process[##1]{\X}{\Y}}}%
}{\end{tikzpicture}}
\makeatother
\begin{document}
\begin{scheduling}
\processes{2/2,4/2,2/3,3/7,1/8,6/2,7/4}
\process[dashed]{3}{5} 
\end{scheduling}
\end{document}

在此处输入图片描述

如您所见,7 和 1 具有相同的样式,因为7=1 mod 6并且n-styles设置为6(即所谓的完美数字)。还可以添加更多流程来继续链条。还添加了第一个更基本的版本中已经存在的可选参数的一种可能使用方式。请注意,人们可以想到更多的事情,例如用硬编码距离交换1empgf 密钥等等。

相关内容