Index: modules/system/system.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.install,v
retrieving revision 1.521
diff -u -p -r1.521 system.install
--- modules/system/system.install	31 Oct 2010 03:44:09 -0000	1.521
+++ modules/system/system.install	5 Nov 2010 03:37:17 -0000
@@ -280,6 +280,13 @@ function system_requirements($phase) {
     $description .= ' ' . $t('You can <a href="@cron">run cron manually</a>.', array('@cron' => url('admin/reports/status/run-cron')));
     $description .= '<br />' . $t('To run cron from outside the site, go to <a href="!cron">!cron</a>', array('!cron' => url($base_url . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => variable_get('cron_key', 'drupal'))))));
 
+    if (variable_get('cron_safe_threshold', DRUPAL_CRON_DEFAULT_THRESHOLD) > 0 && !function_exists('pcntl_fork')) {
+      // The site is configured to use automated cron and fork is not
+      // available, meaning cron will run in the same process as that
+      // servicing the request.
+      $description .= '<br />' . $t('To enable a more responsive page view for requests that invoke cron, install the <a href="!pcntl">Process Control</a> extension.', array('!pcntl' => 'http://www.php.net/manual/en/book.pcntl.php'));
+    }
+
     $requirements['cron'] = array(
       'title' => $t('Cron maintenance tasks'),
       'severity' => $severity,
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.986
diff -u -p -r1.986 system.module
--- modules/system/system.module	31 Oct 2010 22:02:20 -0000	1.986
+++ modules/system/system.module	5 Nov 2010 03:37:18 -0000
@@ -3407,12 +3407,53 @@ function system_run_automated_cron() {
   if (($threshold = variable_get('cron_safe_threshold', DRUPAL_CRON_DEFAULT_THRESHOLD)) > 0 && variable_get('install_task') == 'done') {
     $cron_last = variable_get('cron_last', NULL);
     if (!isset($cron_last) || (REQUEST_TIME - $cron_last > $threshold)) {
-      drupal_cron_run();
+      if (!_system_run_cron_in_child_proc()) {
+        // Could not run cron in a separate process so run it within
+        // the request process instead.
+        drupal_cron_run();
+      }
     }
   }
 }
 
 /**
+ * Attempts to run cron in a child process.
+ *
+ * This will only work if the process control extension is installed.
+ * See http://www.php.net/manual/en/book.pcntl.php for more
+ * information.
+ *
+ * @return
+ *   TRUE if cron was executed in a separate process, FALSE otherwise.
+ */
+function _system_run_cron_in_child_proc() {
+  if (!function_exists('pcntl_fork')) {
+    return FALSE;
+  }
+
+  $pid = pcntl_fork();
+  if ($pid) {
+    // This is the parent process; return and continue processing the
+    // request.
+    return TRUE;
+  }
+
+  // This is the child process.  The parent process will close the
+  // database connection, making it invalid for the child to
+  // use. Close the connection here so the next call to use the
+  // database will automatically establish a new connection rather
+  // than using an expired connection.
+  Database::closeConnection();
+
+  drupal_cron_run();
+
+  // The parent process will exit cleanly.  Do not return to the
+  // caller or invoke any of the standard drupal exit processing to
+  // avoid duplicating the same processing that the parent does.
+  exit(0);
+}
+
+/**
  * Get the list of available date types and attributes.
  *
  * @param $type
Index: modules/system/system.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.test,v
retrieving revision 1.150
diff -u -p -r1.150 system.test
--- modules/system/system.test	28 Oct 2010 01:33:41 -0000	1.150
+++ modules/system/system.test	5 Nov 2010 03:37:18 -0000
@@ -539,6 +539,24 @@ class CronRunTestCase extends DrupalWebT
   }
 
   /**
+   * Retrieves the 'cron_last' value directly from the database.
+   *
+   * Depending on the runtime environment it is possible that cron
+   * will run in a separate process.  A call to variable_get is
+   * unhelpful because it returns the cached value.  The most current
+   * value must be retrieved directly from the database instead.
+   *
+   * @return
+   *   The current value of the 'cron_last' variable, even if it was
+   *   updated in a separate process.
+   */
+  function getCronLastFromDB() {
+    $cron_last = db_query('SELECT value FROM {variable} WHERE name = :cron_last', array(':cron_last' => 'cron_last'))->fetchField();
+    $cron_last = isset($cron_last) ? unserialize($cron_last) : NULL;
+    return $cron_last;
+  }
+
+  /**
    * Test cron runs.
    */
   function testCronRun() {
@@ -573,14 +591,14 @@ class CronRunTestCase extends DrupalWebT
     variable_set('cron_last', $cron_last);
     variable_set('cron_safe_threshold', $cron_safe_threshold);
     $this->drupalGet('');
-    $this->assertTrue($cron_last == variable_get('cron_last', NULL), t('Cron does not run when the cron threshold is not passed.'));
+    $this->assertTrue($cron_last == $this->getCronLastFromDB(), t('Cron does not run when the cron threshold is not passed.'));
 
     // Test if cron runs when the cron threshold was passed.
     $cron_last = time() - 200;
     variable_set('cron_last', $cron_last);
     $this->drupalGet('');
     sleep(1);
-    $this->assertTrue($cron_last < variable_get('cron_last', NULL), t('Cron runs when the cron threshold is passed.'));
+    $this->assertTrue($cron_last < $this->getCronLastFromDB(), t('Cron runs when the cron threshold is passed.'));
 
     // Disable the cron threshold through the interface.
     $admin_user = $this->drupalCreateUser(array('administer site configuration'));
@@ -593,7 +611,7 @@ class CronRunTestCase extends DrupalWebT
     $cron_last = time() - 200;
     variable_set('cron_last', $cron_last);
     $this->drupalGet('');
-    $this->assertTrue($cron_last == variable_get('cron_last', NULL), t('Cron does not run when the cron threshold is disabled.'));
+    $this->assertTrue($cron_last == $this->getCronLastFromDB(), t('Cron does not run when the cron threshold is disabled.'));
   }
 
   /**
