What is the difference between hook_preprocess_page and hook_preprocess_html? I see that both hook_preprocess_page() and hook_preprocess_html() are implementations of hook_preprocess_HOOK(), but I don't understand when to use which.

hook_preprocess_page is called first, but that doesn't really help me understand who is calling it.

Looking at the debug_print_backtrace() output, it's getting called by theme(), but that doesn't really get me to the answer.

Is it simply defined by the array that is passed into drupal_render()?
hook_preprocess_page is the preprocess hook invoked when the page.tpl.php template file is used, and hook_preprocess_html is the preprocess hook invoked when the html.tpl.php template file is used.

Both the preprocess hooks are invoked when a page is rendered with theme('page'), since the page element defined from system_element_info() defines html as theme wrapper. 

  $types['page'] = array(
    '#show_messages' =&gt; TRUE,
    '#theme' =&gt; 'page',
    '#theme_wrappers' =&gt; array('html'),
  );


system_theme() then defines html as follows.

'html' =&gt; array(
  'render element' =&gt; 'page',
  'template' =&gt; 'html',
),


As for when to implement hook_preprocess_html(), you implement it to alter the variables used in the html.tpl.php file, which by default has the following content.

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
  "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="&lt;?php print $language-&gt;language; ?&gt;" version="XHTML+RDFa 1.0" dir="&lt;?php print $language-&gt;dir; ?&gt;"&lt;?php print $rdf_namespaces; ?&gt;&gt;

&lt;head profile="&lt;?php print $grddl_profile; ?&gt;"&gt;
  &lt;?php print $head; ?&gt;
  &lt;title&gt;&lt;?php print $head_title; ?&gt;&lt;/title&gt;
  &lt;?php print $styles; ?&gt;
  &lt;?php print $scripts; ?&gt;
&lt;/head&gt;
&lt;body class="&lt;?php print $classes; ?&gt;" &lt;?php print $attributes;?&gt;&gt;
  &lt;div id="skip-link"&gt;
    &lt;a href="#main-content" class="element-invisible element-focusable"&gt;&lt;?php print t('Skip to main content'); ?&gt;&lt;/a&gt;
  &lt;/div&gt;
  &lt;?php print $page_top; ?&gt;
  &lt;?php print $page; ?&gt;
  &lt;?php print $page_bottom; ?&gt;
&lt;/body&gt;
&lt;/html&gt;


As you can see, it contains just the HTML tags that wrap a page content, available in $page. With that, you can change the content of the &lt;head&gt; tag, the page title (the one that goes in the &lt;title&gt; tag in the &lt;head&gt; tag), the CSS styles and the JavaScript files added to a page, the classes and the attributes for the &lt;body&gt; tag.
With the page.tpl.php template file, you can change more of the page being rendered, including the site name, the site slogan, the page title, and the feeds associated with the page. For most of them, there is a specific Drupal function/hook you should instead use.

hook_preprocess_HOOK is the generic hook name used for all the preprocess hooks, in the same way hook_form_FORM_ID_alter() is the hook name used for a class of alteration hooks.