pintos (4) --Mesa vs. Hoare style

在阅读pintos/src/threads/synch.c的时候,发现了一个令人疑惑的地方:
/* Down or "P" operation on a semaphore. Waits for SEMA's value
to become positive and then atomically decrements it.
This function may sleep, so it must not be called within an
interrupt handler. This function may be called with
interrupts disabled, but if it sleeps then the next scheduled
thread will probably turn interrupts back on. */
void
sema_down (struct semaphore *sema)
{
    enum intr_level old_level;

    ASSERT (sema != NULL);
    ASSERT (!intr_context ());

    old_level = intr_disable ();
    while (sema->value == 0)
    {
        list_push_back (&sema->waiters, &thread_current ()->elem);
        thread_block ();
    }
    sema->value--;
    intr_set_level (old_level);
}
这个函数是信号量的P操作,完成的功能就是
  1. 关中断
  2. 判断信号量是否为0
    • 如果为0,当前进程加入该sema等待队列
    • 不为0,sema–,继续执行
  3. 还原中断

第16行使用了while而不是if,为什么要在这里循环呢?
sema为0陷入阻塞之后,一定是被V操作唤醒的,既然是V操作,那么sema一定不为0,while的意义在哪里呢?


先来看一下V操作:

/* Up or "V" operation on a semaphore.  Increments SEMA's value
   and wakes up one thread of those waiting for SEMA, if any.
   This function may be called from an interrupt handler. */
void
sema_up (struct semaphore *sema) 
{
  enum intr_level old_level;

  ASSERT (sema != NULL);

  old_level = intr_disable ();
  if (!list_empty (&sema->waiters)) 
    thread_unblock (list_entry (list_pop_front (&sema->waiters),
                                struct thread, elem));
  sema->value++;
  intr_set_level (old_level);
}
V操作做了如下的事情
  1. 关中断
  2. 如果waiters队列有进程,执行thread_unblock()
  3. sema++
  4. 还原中断

好像没什么不对的

再来看一下thread_unblock()的实现:
/* Transitions a blocked thread T to the ready-to-run state.
   This is an error if T is not blocked.  (Use thread_yield() to
   make the running thread ready.)
   This function does not preempt the running thread.  This can
   be important: if the caller had disabled interrupts itself,
   it may expect that it can atomically unblock a thread and
   update other data. */
void
thread_unblock (struct thread *t) 
{
  enum intr_level old_level;

  ASSERT (is_thread (t));

  old_level = intr_disable ();
  ASSERT (t->status == THREAD_BLOCKED);
  list_push_back (&ready_list, &t->elem);
  t->status = THREAD_READY;
  intr_set_level (old_level);
}
thread_unblock()做了如下的事情
  1. 关中断
  2. 将进程添加到ready_list,设置状态为READY
  3. 还原中断

竟然没有进行调度!


OK进入正题:

Mesa vs. Hoare style
  • Hoare style:V操作后立即进行调度。
  • Mesa style:V操作后只将进程unblock,然后继续运行等待系统进行调度。

显然PintOs采用的是Mesa style,所以,被unblock的进程在被调度的时候,sema并不一定可用,比如其他进程又进行了P操作,所以必须再次检查sema,如果不可用则继续block,这就是使用while而不是if的理由。

为什么不立即调度呢?这就是他的优点,不立即调度而是等待系统调度,就减少了调度次数,而每次切换上下文都是繁重的工作,进而降低了系统开销。


相关链接:

http://blog.youkuaiyun.com/xiaoguobaf/article/details/52174285
http://blog.chinaunix.net/uid-20545494-id-1929545.html
https://github.com/windr0id/pintos/issues/1

正在选中未选择的软件包 cuda-cccl-12-1。 准备解压 .../058-cuda-cccl-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-cccl-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-driver-dev-12-1。 准备解压 .../059-cuda-driver-dev-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-driver-dev-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-cudart-dev-12-1。 准备解压 .../060-cuda-cudart-dev-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-cudart-dev-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-nvcc-12-1。 准备解压 .../061-cuda-nvcc-12-1_12.1.66-1_amd64.deb ... 正在解压 cuda-nvcc-12-1 (12.1.66-1) ... 正在选中未选择的软件包 cuda-nvprune-12-1。 准备解压 .../062-cuda-nvprune-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-nvprune-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-compiler-12-1。 准备解压 .../063-cuda-compiler-12-1_12.1.0-1_amd64.deb ... 正在解压 cuda-compiler-12-1 (12.1.0-1) ... 正在选中未选择的软件包 cuda-profiler-api-12-1。 准备解压 .../064-cuda-profiler-api-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-profiler-api-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-nvrtc-dev-12-1。 准备解压 .../065-cuda-nvrtc-dev-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-nvrtc-dev-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-opencl-dev-12-1。 准备解压 .../066-cuda-opencl-dev-12-1_12.1.56-1_amd64.deb ... 正在解压 cuda-opencl-dev-12-1 (12.1.56-1) ... 正在选中未选择的软件包 libcublas-dev-12-1。 准备解压 .../067-libcublas-dev-12-1_12.1.0.26-1_amd64.deb ... 正在解压 libcublas-dev-12-1 (12.1.0.26-1) ... 正在选中未选择的软件包 libcufft-dev-12-1。 准备解压 .../068-libcufft-dev-12-1_11.0.2.4-1_amd64.deb ... 正在解压 libcufft-dev-12-1 (11.0.2.4-1) ... 正在选中未选择的软件包 libcufile-dev-12-1。 准备解压 .../069-libcufile-dev-12-1_1.6.0.25-1_amd64.deb ... 正在解压 libcufile-dev-12-1 (1.6.0.25-1) ... 正在选中未选择的软件包 libcurand-dev-12-1。 准备解压 .../070-libcurand-dev-12-1_10.3.2.56-1_amd64.deb ... 正在解压 libcurand-dev-12-1 (10.3.2.56-1) ... 正在选中未选择的软件包 libcusolver-dev-12-1。 准备解压 .../071-libcusolver-dev-12-1_11.4.4.55-1_amd64.deb ... 正在解压 libcusolver-dev-12-1 (11.4.4.55-1) ... 正在选中未选择的软件包 libcusparse-dev-12-1。 准备解压 .../072-libcusparse-dev-12-1_12.0.2.55-1_amd64.deb ... 正在解压 libcusparse-dev-12-1 (12.0.2.55-1) ... 正在选中未选择的软件包 libnpp-dev-12-1。 准备解压 .../073-libnpp-dev-12-1_12.0.2.50-1_amd64.deb ... 正在解压 libnpp-dev-12-1 (12.0.2.50-1) ... 正在选中未选择的软件包 libnvjitlink-dev-12-1。 准备解压 .../074-libnvjitlink-dev-12-1_12.1.55-1_amd64.deb ... 正在解压 libnvjitlink-dev-12-1 (12.1.55-1) ... 正在选中未选择的软件包 libnvjpeg-dev-12-1。 准备解压 .../075-libnvjpeg-dev-12-1_12.1.0.39-1_amd64.deb ... 正在解压 libnvjpeg-dev-12-1 (12.1.0.39-1) ... 正在选中未选择的软件包 cuda-libraries-dev-12-1。 准备解压 .../076-cuda-libraries-dev-12-1_12.1.0-1_amd64.deb ... 正在解压 cuda-libraries-dev-12-1 (12.1.0-1) ... 正在选中未选择的软件包 cuda-cupti-12-1。 准备解压 .../077-cuda-cupti-12-1_12.1.62-1_amd64.deb ... 正在解压 cuda-cupti-12-1 (12.1.62-1) ... 正在选中未选择的软件包 cuda-cupti-dev-12-1。 准备解压 .../078-cuda-cupti-dev-12-1_12.1.62-1_amd64.deb ... 正在解压 cuda-cupti-dev-12-1 (12.1.62-1) ... 正在选中未选择的软件包 cuda-nvdisasm-12-1。 准备解压 .../079-cuda-nvdisasm-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-nvdisasm-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-gdb-12-1。 准备解压 .../080-cuda-gdb-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-gdb-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-nvprof-12-1。 准备解压 .../081-cuda-nvprof-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-nvprof-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-nvtx-12-1。 准备解压 .../082-cuda-nvtx-12-1_12.1.66-1_amd64.deb ... 正在解压 cuda-nvtx-12-1 (12.1.66-1) ... 正在选中未选择的软件包 cuda-sanitizer-12-1。 准备解压 .../083-cuda-sanitizer-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-sanitizer-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-command-line-tools-12-1。 准备解压 .../084-cuda-command-line-tools-12-1_12.1.0-1_amd64.deb ... 正在解压 cuda-command-line-tools-12-1 (12.1.0-1) ... 正在选中未选择的软件包 nsight-compute-2023.1.0。 准备解压 .../085-nsight-compute-2023.1.0_2023.1.0.15-1_amd64.deb ... 正在解压 nsight-compute-2023.1.0 (2023.1.0.15-1) ... 正在选中未选择的软件包 cuda-nsight-compute-12-1。 准备解压 .../086-cuda-nsight-compute-12-1_12.1.0-1_amd64.deb ... 正在解压 cuda-nsight-compute-12-1 (12.1.0-1) ... 正在选中未选择的软件包 libtinfo5:amd64。 准备解压 .../087-libtinfo5_6.3-2ubuntu0.1_amd64.deb ... 正在解压 libtinfo5:amd64 (6.3-2ubuntu0.1) ... 正在选中未选择的软件包 nsight-systems-2023.1.2。 准备解压 .../088-nsight-systems-2023.1.2_2023.1.2.43-1_amd64.deb ... 正在解压 nsight-systems-2023.1.2 (2023.1.2.43-32377213v0) ... 正在选中未选择的软件包 cuda-nsight-systems-12-1。 准备解压 .../089-cuda-nsight-systems-12-1_12.1.0-1_amd64.deb ... 正在解压 cuda-nsight-systems-12-1 (12.1.0-1) ... 正在选中未选择的软件包 cuda-nsight-12-1。 准备解压 .../090-cuda-nsight-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-nsight-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-nvml-dev-12-1。 准备解压 .../091-cuda-nvml-dev-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-nvml-dev-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-nvvp-12-1。 准备解压 .../092-cuda-nvvp-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-nvvp-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-visual-tools-12-1。 准备解压 .../093-cuda-visual-tools-12-1_12.1.0-1_amd64.deb ... 正在解压 cuda-visual-tools-12-1 (12.1.0-1) ... 正在选中未选择的软件包 gds-tools-12-1。 准备解压 .../094-gds-tools-12-1_1.6.0.25-1_amd64.deb ... 正在解压 gds-tools-12-1 (1.6.0.25-1) ... 正在选中未选择的软件包 cuda-tools-12-1。 准备解压 .../095-cuda-tools-12-1_12.1.0-1_amd64.deb ... 正在解压 cuda-tools-12-1 (12.1.0-1) ... 正在选中未选择的软件包 cuda-documentation-12-1。 准备解压 .../096-cuda-documentation-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-documentation-12-1 (12.1.55-1) ... 正在选中未选择的软件包 libnvvm-samples-12-1。 准备解压 .../097-libnvvm-samples-12-1_12.1.55-1_amd64.deb ... 正在解压 libnvvm-samples-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-toolkit-12-1。 准备解压 .../098-cuda-toolkit-12-1_12.1.0-1_amd64.deb ... 正在解压 cuda-toolkit-12-1 (12.1.0-1) ... 正在选中未选择的软件包 cuda-demo-suite-12-1。 准备解压 .../099-cuda-demo-suite-12-1_12.1.55-1_amd64.deb ... 正在解压 cuda-demo-suite-12-1 (12.1.55-1) ... 正在选中未选择的软件包 cuda-12-1。 准备解压 .../100-cuda-12-1_12.1.0-1_amd64.deb ... 正在解压 cuda-12-1 (12.1.0-1) ... 正在选中未选择的软件包 cuda。 准备解压 .../101-cuda_12.1.0-1_amd64.deb ... 正在解压 cuda (12.1.0-1) ... 正在选中未选择的软件包 libatomic1:i386。 准备解压 .../102-libatomic1_12.3.0-1ubuntu1~22.04.2_i386.deb ... 正在解压 libatomic1:i386 (12.3.0-1ubuntu1~22.04.2) ... 正在选中未选择的软件包 libdrm-amdgpu1:i386。 准备解压 .../103-libdrm-amdgpu1_2.4.113-2~ubuntu0.22.04.1_i386.deb ... 正在解压 libdrm-amdgpu1:i386 (2.4.113-2~ubuntu0.22.04.1) ... 正在选中未选择的软件包 libpciaccess0:i386。 准备解压 .../104-libpciaccess0_0.16-3_i386.deb ... 正在解压 libpciaccess0:i386 (0.16-3) ... 正在选中未选择的软件包 libdrm-intel1:i386。 准备解压 .../105-libdrm-intel1_2.4.113-2~ubuntu0.22.04.1_i386.deb ... 正在解压 libdrm-intel1:i386 (2.4.113-2~ubuntu0.22.04.1) ... 正在选中未选择的软件包 libdrm-nouveau2:i386。 准备解压 .../106-libdrm-nouveau2_2.4.113-2~ubuntu0.22.04.1_i386.deb ... 正在解压 libdrm-nouveau2:i386 (2.4.113-2~ubuntu0.22.04.1) ... 正在选中未选择的软件包 libdrm-radeon1:i386。 准备解压 .../107-libdrm-radeon1_2.4.113-2~ubuntu0.22.04.1_i386.deb ... 正在解压 libdrm-radeon1:i386 (2.4.113-2~ubuntu0.22.04.1) ... 正在选中未选择的软件包 libglapi-mesa:i386。 准备解压 .../108-libglapi-mesa_23.2.1-1ubuntu3.1~22.04.3_i386.deb ... 正在解压 libglapi-mesa:i386 (23.2.1-1ubuntu3.1~22.04.3) ... 正在选中未选择的软件包 libxcb-dri2-0:i386。 准备解压 .../109-libxcb-dri2-0_1.14-3ubuntu3_i386.deb ... 正在解压 libxcb-dri2-0:i386 (1.14-3ubuntu3) ... 正在选中未选择的软件包 libxcb-sync1:i386。 准备解压 .../110-libxcb-sync1_1.14-3ubuntu3_i386.deb ... 正在解压 libxcb-sync1:i386 (1.14-3ubuntu3) ... 正在选中未选择的软件包 libxcb-xfixes0:i386。 准备解压 .../111-libxcb-xfixes0_1.14-3ubuntu3_i386.deb ... 正在解压 libxcb-xfixes0:i386 (1.14-3ubuntu3) ... 正在选中未选择的软件包 libxshmfence1:i386。 准备解压 .../112-libxshmfence1_1.3-1build4_i386.deb ... 正在解压 libxshmfence1:i386 (1.3-1build4) ... 正在选中未选择的软件包 libegl-mesa0:i386。 准备解压 .../113-libegl-mesa0_23.2.1-1ubuntu3.1~22.04.3_i386.deb ... 正在解压 libegl-mesa0:i386 (23.2.1-1ubuntu3.1~22.04.3) ... 正在选中未选择的软件包 libllvm15:i386。 准备解压 .../114-libllvm15_1%3a15.0.7-0ubuntu0.22.04.3_i386.deb ... 正在解压 libllvm15:i386 (1:15.0.7-0ubuntu0.22.04.3) ... 正在选中未选择的软件包 libsensors5:i386。 准备解压 .../115-libsensors5_1%3a3.6.0-7ubuntu1_i386.deb ... 正在解压 libsensors5:i386 (1:3.6.0-7ubuntu1) ... 正在选中未选择的软件包 libgl1-mesa-dri:i386。 准备解压 .../116-libgl1-mesa-dri_23.2.1-1ubuntu3.1~22.04.3_i386.deb ... 正在解压 libgl1-mesa-dri:i386 (23.2.1-1ubuntu3.1~22.04.3) ... 正在选中未选择的软件包 libxcb-glx0:i386。 准备解压 .../117-libxcb-glx0_1.14-3ubuntu3_i386.deb ... 正在解压 libxcb-glx0:i386 (1.14-3ubuntu3) ... 正在选中未选择的软件包 libxcb-shm0:i386。 准备解压 .../118-libxcb-shm0_1.14-3ubuntu3_i386.deb ... 正在解压 libxcb-shm0:i386 (1.14-3ubuntu3) ... 正在选中未选择的软件包 libxfixes3:i386。 准备解压 .../119-libxfixes3_1%3a6.0.0-1_i386.deb ... 正在解压 libxfixes3:i386 (1:6.0.0-1) ... 正在选中未选择的软件包 libxxf86vm1:i386。 准备解压 .../120-libxxf86vm1_1%3a1.1.4-1build3_i386.deb ... 正在解压 libxxf86vm1:i386 (1:1.1.4-1build3) ... 正在选中未选择的软件包 libglx-mesa0:i386。 准备解压 .../121-libglx-mesa0_23.2.1-1ubuntu3.1~22.04.3_i386.deb ... 正在解压 libglx-mesa0:i386 (23.2.1-1ubuntu3.1~22.04.3) ... 正在选中未选择的软件包 libnvidia-compute-530:i386。 准备解压 .../122-libnvidia-compute-530_530.30.02-0ubuntu1_i386.deb ... 正在解压 libnvidia-compute-530:i386 (530.30.02-0ubuntu1) ... 正在选中未选择的软件包 libnvidia-decode-530:i386。 准备解压 .../123-libnvidia-decode-530_530.30.02-0ubuntu1_i386.deb ... 正在解压 libnvidia-decode-530:i386 (530.30.02-0ubuntu1) ... 正在选中未选择的软件包 libnvidia-encode-530:i386。 准备解压 .../124-libnvidia-encode-530_530.30.02-0ubuntu1_i386.deb ... 正在解压 libnvidia-encode-530:i386 (530.30.02-0ubuntu1) ... 正在选中未选择的软件包 libglvnd0:i386。 准备解压 .../125-libglvnd0_1.4.0-1_i386.deb ... 正在解压 libglvnd0:i386 (1.4.0-1) ... 正在选中未选择的软件包 libglx0:i386。 准备解压 .../126-libglx0_1.4.0-1_i386.deb ... 正在解压 libglx0:i386 (1.4.0-1) ... 正在选中未选择的软件包 libgl1:i386。 准备解压 .../127-libgl1_1.4.0-1_i386.deb ... 正在解压 libgl1:i386 (1.4.0-1) ... 正在选中未选择的软件包 libnvidia-fbc1-530:i386。 准备解压 .../128-libnvidia-fbc1-530_530.30.02-0ubuntu1_i386.deb ... 正在解压 libnvidia-fbc1-530:i386 (530.30.02-0ubuntu1) ... 正在选中未选择的软件包 libegl1:i386。 准备解压 .../129-libegl1_1.4.0-1_i386.deb ... 正在解压 libegl1:i386 (1.4.0-1) ... 正在选中未选择的软件包 libopengl0:i386。 准备解压 .../130-libopengl0_1.4.0-1_i386.deb ... 正在解压 libopengl0:i386 (1.4.0-1) ... 正在选中未选择的软件包 libgles2:i386。 准备解压 .../131-libgles2_1.4.0-1_i386.deb ... 正在解压 libgles2:i386 (1.4.0-1) ... 正在选中未选择的软件包 libnvidia-gl-530:i386。 准备解压 .../132-libnvidia-gl-530_530.30.02-0ubuntu1_i386.deb ... dpkg-query: 没有找到与 libnvidia-gl-450 相匹配的软件包 正在解压 libnvidia-gl-530:i386 (530.30.02-0ubuntu1) ... 正在设置 cuda-toolkit-config-common (12.1.55-1) ... 正在设置 libzstd1:i386 (1.4.8+dfsg-3build1) ... 正在设置 cuda-documentation-12-1 (12.1.55-1) ... 正在设置 cuda-nvdisasm-12-1 (12.1.55-1) ... 正在设置 cuda-driver-dev-12-1 (12.1.55-1) ... 正在设置 nsight-compute-2023.1.0 (2023.1.0.15-1) ... 正在设置 cpp-12 (12.3.0-1ubuntu1~22.04.2) ... 正在设置 libdrm-nouveau2:i386 (2.4.113-2~ubuntu0.22.04.1) ... 正在设置 cuda-nvvp-12-1 (12.1.55-1) ... 正在设置 nvidia-kernel-source-530 (530.30.02-0ubuntu1) ... 正在设置 libxcb-xfixes0:i386 (1.14-3ubuntu3) ... 正在设置 libnvidia-fbc1-530:amd64 (530.30.02-0ubuntu1) ... 正在设置 liblzma5:i386 (5.2.5-2ubuntu1) ... 正在设置 libdebuginfod-common (0.186-1ubuntu0.1) ... 正在设置 nvidia-kernel-common-530 (530.30.02-0ubuntu1) ... update-initramfs: deferring update (trigger activated) 正在设置 cuda-profiler-api-12-1 (12.1.55-1) ... 正在设置 cuda-nsight-compute-12-1 (12.1.0-1) ... 正在设置 libdrm-radeon1:i386 (2.4.113-2~ubuntu0.22.04.1) ... 正在设置 libglvnd0:i386 (1.4.0-1) ... 正在设置 libxcb-glx0:i386 (1.14-3ubuntu3) ... 正在设置 cuda-cuxxfilt-12-1 (12.1.55-1) ... 正在设置 zlib1g:i386 (1:1.2.11.dfsg-2ubuntu9.2) ... 正在设置 cuda-cccl-12-1 (12.1.55-1) ... 正在设置 libxcb-shm0:i386 (1.14-3ubuntu3) ... 正在设置 cuda-nvtx-12-1 (12.1.66-1) ... 正在设置 cuda-nsight-12-1 (12.1.55-1) ... 正在设置 libopengl0:i386 (1.4.0-1) ... 正在设置 libnvvm-samples-12-1 (12.1.55-1) ... 正在设置 libxxf86vm1:i386 (1:1.1.4-1build3) ... 正在设置 nvidia-modprobe (530.30.02-0ubuntu1) ... 正在设置 cuda-nvprof-12-1 (12.1.55-1) ... 正在设置 libnvidia-extra-530:amd64 (530.30.02-0ubuntu1) ... 正在设置 libnvidia-compute-530:amd64 (530.30.02-0ubuntu1) ... 正在设置 libnvidia-compute-530:i386 (530.30.02-0ubuntu1) ... 正在设置 libgles2:i386 (1.4.0-1) ... 正在设置 gds-tools-12-1 (1.6.0.25-1) ... 正在设置 cuda-toolkit-12-1-config-common (12.1.55-1) ... Setting alternatives update-alternatives: 使用 /usr/local/cuda-12.1 来在自动模式中提供 /usr/local/cuda (cuda) update-alternatives: 使用 /usr/local/cuda-12.1 来在自动模式中提供 /usr/local/cuda-12 (cuda-12) 正在设置 libxfixes3:i386 (1:6.0.0-1) ... 正在设置 libxcb-sync1:i386 (1.14-3ubuntu3) ... 正在设置 cuda-cuobjdump-12-1 (12.1.55-1) ... 正在设置 cuda-nvrtc-12-1 (12.1.55-1) ... 正在设置 cuda-sanitizer-12-1 (12.1.55-1) ... 正在设置 libatomic1:i386 (12.3.0-1ubuntu1~22.04.2) ... 正在设置 libsensors5:i386 (1:3.6.0-7ubuntu1) ... 正在设置 libglapi-mesa:i386 (23.2.1-1ubuntu3.1~22.04.3) ... 正在设置 cuda-cupti-12-1 (12.1.62-1) ... 正在设置 libnvidia-decode-530:amd64 (530.30.02-0ubuntu1) ... 正在设置 libnvidia-decode-530:i386 (530.30.02-0ubuntu1) ... 正在设置 libxcb-dri2-0:i386 (1.14-3ubuntu3) ... 正在设置 cuda-nvml-dev-12-1 (12.1.55-1) ... 正在设置 libnvidia-common-530 (530.30.02-0ubuntu1) ... 正在设置 libxshmfence1:i386 (1.3-1build4) ... 正在设置 nvidia-utils-530 (530.30.02-0ubuntu1) ... 正在设置 libasan8:amd64 (12.3.0-1ubuntu1~22.04.2) ... 正在设置 cuda-nvprune-12-1 (12.1.55-1) ... 正在设置 nvidia-settings (530.30.02-0ubuntu1) ... 正在设置 libnvidia-cfg1-530:amd64 (530.30.02-0ubuntu1) ... 正在设置 nvidia-compute-utils-530 (530.30.02-0ubuntu1) ... Warning: The home dir /nonexistent you specified can't be accessed: No such file or directory Adding system user `nvidia-persistenced' (UID 129) ... Adding new group `nvidia-persistenced' (GID 137) ... Adding new user `nvidia-persistenced' (UID 129) with group `nvidia-persistenced' ... Not creating home directory `/nonexistent'. Created symlink /etc/systemd/system/multi-user.target.wants/nvidia-persistenced.service → /lib/systemd/system/nvidia-persistenced.service. 正在设置 cuda-nvrtc-dev-12-1 (12.1.55-1) ... 正在设置 libtsan2:amd64 (12.3.0-1ubuntu1~22.04.2) ... 正在设置 cuda-gdb-12-1 (12.1.55-1) ... 正在设置 libtinfo5:amd64 (6.3-2ubuntu0.1) ... 正在设置 libelf1:amd64 (0.186-1ubuntu0.1) ... 正在设置 libelf1:i386 (0.186-1ubuntu0.1) ... 正在设置 cuda-toolkit-12-config-common (12.1.55-1) ... 正在设置 libstdc++6:i386 (12.3.0-1ubuntu1~22.04.2) ... 正在设置 dctrl-tools (2.24-3build2) ... 正在设置 libtinfo6:i386 (6.3-2ubuntu0.1) ... 正在设置 libicu70:i386 (70.1-2) ... 正在设置 libdrm-amdgpu1:i386 (2.4.113-2~ubuntu0.22.04.1) ... 正在设置 libnvidia-gl-530:amd64 (530.30.02-0ubuntu1) ... 正在设置 libpciaccess0:i386 (0.16-3) ... 正在设置 libdw1:amd64 (0.186-1ubuntu0.1) ... 正在设置 libnvidia-encode-530:amd64 (530.30.02-0ubuntu1) ... 正在设置 libnvidia-encode-530:i386 (530.30.02-0ubuntu1) ... 正在设置 nsight-systems-2023.1.2 (2023.1.2.43-32377213v0) ... update-alternatives: 使用 /opt/nvidia/nsight-systems/2023.1.2/target-linux-x64/nsys 来在自动模式中提供 /usr/local/bin/nsys (nsys) update-alternatives: 使用 /opt/nvidia/nsight-systems/2023.1.2/host-linux-x64/nsys-ui 来在自动模式中提供 /usr/local/bin/nsys-ui (nsys-ui) 正在设置 libnvjpeg-12-1 (12.1.0.39-1) ... 正在设置 libcusolver-12-1 (11.4.4.55-1) ... 正在设置 libcufile-12-1 (1.6.0.25-1) ... Setting alternatives update-alternatives: 使用 /usr/local/cuda-12.1/gds/cufile.json 来在自动模式中提供 /etc/cufile.json (cufile.json) 正在设置 libedit2:i386 (3.1-20210910-1build1) ... 正在设置 libdebuginfod1:amd64 (0.186-1ubuntu0.1) ... 正在设置 cuda-nsight-systems-12-1 (12.1.0-1) ... 正在设置 libdrm-intel1:i386 (2.4.113-2~ubuntu0.22.04.1) ... 正在设置 libcusolver-dev-12-1 (11.4.4.55-1) ... 正在设置 cuda-cudart-12-1 (12.1.55-1) ... 正在设置 cuda-cupti-dev-12-1 (12.1.62-1) ... 正在设置 cuda-cudart-dev-12-1 (12.1.55-1) ... 正在设置 libcufft-12-1 (11.0.2.4-1) ... 正在设置 libegl-mesa0:i386 (23.2.1-1ubuntu3.1~22.04.3) ... 正在设置 cuda-nvcc-12-1 (12.1.66-1) ... 正在设置 libcublas-12-1 (12.1.0.26-1) ... 正在设置 libnvjpeg-dev-12-1 (12.1.0.39-1) ... 正在设置 libcusparse-12-1 (12.0.2.55-1) ... 正在设置 libgcc-12-dev:amd64 (12.3.0-1ubuntu1~22.04.2) ... 正在设置 libcufile-dev-12-1 (1.6.0.25-1) ... 正在设置 libcufft-dev-12-1 (11.0.2.4-1) ... 正在设置 libnpp-12-1 (12.0.2.50-1) ... 正在设置 xserver-xorg-video-nvidia-530 (530.30.02-0ubuntu1) ... 正在设置 libnvjitlink-12-1 (12.1.55-1) ... 正在设置 libnpp-dev-12-1 (12.0.2.50-1) ... 正在设置 cuda-opencl-12-1 (12.1.56-1) ... 正在设置 libcurand-12-1 (10.3.2.56-1) ... 正在设置 libegl1:i386 (1.4.0-1) ... 正在设置 cuda-command-line-tools-12-1 (12.1.0-1) ... 正在设置 libxml2:i386 (2.9.13+dfsg-1ubuntu0.9) ... 正在设置 cuda-compiler-12-1 (12.1.0-1) ... 正在设置 cuda-libraries-12-1 (12.1.0-1) ... 正在设置 libnvjitlink-dev-12-1 (12.1.55-1) ... 正在设置 libcusparse-dev-12-1 (12.0.2.55-1) ... 正在设置 libcurand-dev-12-1 (10.3.2.56-1) ... 正在设置 libcublas-dev-12-1 (12.1.0.26-1) ... 正在设置 gcc-12 (12.3.0-1ubuntu1~22.04.2) ... 正在设置 cuda-opencl-dev-12-1 (12.1.56-1) ... 正在设置 libllvm15:i386 (1:15.0.7-0ubuntu0.22.04.3) ... 正在设置 cuda-libraries-dev-12-1 (12.1.0-1) ... 正在设置 libgl1-mesa-dri:i386 (23.2.1-1ubuntu3.1~22.04.3) ... 正在设置 cuda-visual-tools-12-1 (12.1.0-1) ... 正在设置 dkms (2.8.7-2ubuntu2.2) ... 正在设置 nvidia-dkms-530 (530.30.02-0ubuntu1) ... update-initramfs: deferring update (trigger activated) A modprobe blacklist file has been created at /etc/modprobe.d to prevent Nouveau from loading. This can be reverted by deleting the following file: /etc/modprobe.d/nvidia-graphics-drivers.conf A new initrd image has also been created. To revert, please regenerate your initrd by running the following command after deleting the modprobe.d file: `/usr/sbin/initramfs -u` ***************************************************************************** *** Reboot your computer and verify that the NVIDIA graphics driver can *** *** be loaded. *** ***************************************************************************** INFO:Enable nvidia DEBUG:Parsing /usr/share/ubuntu-drivers-common/quirks/lenovo_thinkpad DEBUG:Parsing /usr/share/ubuntu-drivers-common/quirks/dell_latitude DEBUG:Parsing /usr/share/ubuntu-drivers-common/quirks/put_your_quirks_here Loading new nvidia-530.30.02 DKMS files... Building for 6.8.0-85-generic Building for architecture x86_64 Building initial module for 6.8.0-85-generic Error! Bad return status for module build on kernel: 6.8.0-85-generic (x86_64) Consult /var/lib/dkms/nvidia/530.30.02/build/make.log for more information. dpkg: 处理软件包 nvidia-dkms-530 (--configure)时出错: 已安装 nvidia-dkms-530 软件包 post-installation 脚本 子进程返回错误状态 10 dpkg: 依赖关系问题使得 cuda-drivers-530 的配置工作不能继续: cuda-drivers-530 依赖于 nvidia-dkms-530 (>= 530.30.02);然而: 软件包 nvidia-dkms-530 尚未配置。 dpkg: 处理软件包 cuda-drivers-530 (--configure)时出错: 依赖关系问题 - 仍未被配置 正在设置 libglx-mesa0:i386 (23.2.1-1ubuntu3.1~22.04.3) ... 正在设置 libglx0:i386 (1.4.0-1) ... 因为错误消息指示这是由于上一个问题导致的错误,没有写入 apport 报告。 正在设置 cuda-tools-12-1 (12.1.0-1) ... dpkg: 依赖关系问题使得 nvidia-driver-530 的配置工作不能继续: nvidia-driver-530 依赖于 nvidia-dkms-530 (= 530.30.02-0ubuntu1);然而: 软件包 nvidia-dkms-530 尚未配置。 dpkg: 处理软件包 nvidia-driver-530 (--configure)时出错: 依赖关系问题 - 仍未被配置 因为错误消息指示这是由于上一个问题导致的错误,没有写入 apport 报告。 正在设置 cuda-toolkit-12-1 (12.1.0-1) ... 正在设置 libgl1:i386 (1.4.0-1) ... dpkg: 依赖关系问题使得 cuda-drivers 的配置工作不能继续: cuda-drivers 依赖于 cuda-drivers-530 (= 530.30.02-1);然而: 软件包 cuda-drivers-530 尚未配置。 dpkg: 处理软件包 cuda-drivers (--configure)时出错: 依赖关系问题 - 仍未被配置 由于已经达到 MaxReports 限制,没有写入 apport 报告。 正在设置 libnvidia-gl-530:i386 (530.30.02-0ubuntu1) ... 正在设置 libnvidia-fbc1-530:i386 (530.30.02-0ubuntu1) ... dpkg: 依赖关系问题使得 cuda-runtime-12-1 的配置工作不能继续: cuda-runtime-12-1 依赖于 cuda-drivers (>= 530.30.02);然而: 软件包 cuda-drivers 尚未配置。 dpkg: 处理软件包 cuda-runtime-12-1 (--configure)时出错: 依赖关系问题 - 仍未被配置 由于已经达到 MaxReports 限制,没有写入 apport 报告。 dpkg: 依赖关系问题使得 cuda-12-1 的配置工作不能继续: cuda-12-1 依赖于 cuda-runtime-12-1 (>= 12.1.0);然而: 软件包 cuda-runtime-12-1 尚未配置。 dpkg: 处理软件包 cuda-12-1 (--configure)时出错: 依赖关系问题 - 仍未被配置 由于已经达到 MaxReports 限制,没有写入 apport 报告。 由于已经达到 MaxReports 限制,没有写入 apport 报告。 dpkg: 依赖关系问题使得 cuda 的配置工作不能继续: cuda 依赖于 cuda-12-1 (>= 12.1.0);然而: 软件包 cuda-12-1 尚未配置。 dpkg: 处理软件包 cuda (--configure)时出错: 依赖关系问题 - 仍未被配置 dpkg: 依赖关系问题使得 cuda-demo-suite-12-1 的配置工作不能继续: cuda-demo-suite-12-1 依赖于 cuda-runtime-12-1;然而: 软件包 cuda-runtime-12-1 尚未配置。 dpkg: 处理软件包 cuda-demo-suite-12-1 (--configure)时出错: 依赖关系问题 - 仍未被配置 由于已经达到 MaxReports 限制,没有写入 apport 报告。 正在处理用于 libc-bin (2.35-0ubuntu3.8) 的触发器 ... 正在处理用于 man-db (2.10.2-1) 的触发器 ... 正在处理用于 dbus (1.12.20-2ubuntu4.1) 的触发器 ... 正在处理用于 mailcap (3.70+nmu1ubuntu1) 的触发器 ... 正在处理用于 desktop-file-utils (0.26-1ubuntu3) 的触发器 ... 正在处理用于 initramfs-tools (0.140ubuntu13.4) 的触发器 ... update-initramfs: Generating /boot/initrd.img-6.8.0-85-generic I: The initramfs will attempt to resume from /dev/nvme0n1p6 I: (UUID=d8f58ea1-1320-4202-9f33-33c2fe7a177b) I: Set the RESUME variable to override this. 正在处理用于 gnome-menus (3.36.0-1ubuntu3) 的触发器 ... 在处理时有错误发生: nvidia-dkms-530 cuda-drivers-530 nvidia-driver-530 cuda-drivers cuda-runtime-12-1 cuda-12-1 cuda cuda-demo-suite-12-1 E: Sub-process /usr/bin/dpkg returned an error code (1)
最新发布
10-12
从你提供的日志来看,你在安装 CUDA Toolkit 12.1 或 NVIDIA 驱动时遇到了 **依赖关系错误** 和 **内核模块构建失败** 的问题。以下是问题的分析和解决建议: --- ### ❗主要错误信息分析: #### 1. **DKMS 构建失败** ``` Error! Bad return status for module build on kernel: 6.8.0-85-generic (x86_64) Consult /var/lib/dkms/nvidia/530.30.02/build/make.log for more information. ``` - 这说明 NVIDIA 驱动的内核模块(通过 DKMS)在构建过程中失败。 - 常见原因: - 内核版本不兼容(6.8.0 较新) - 缺少必要的内核头文件 - Secure Boot 启用导致模块签名失败 #### 2. **依赖关系未满足** ``` dpkg: 处理软件包 nvidia-dkms-530 (--configure)时出错: 已安装 nvidia-dkms-530 软件包 post-installation 脚本 子进程返回错误状态 10 ``` - 由于 `nvidia-dkms-530` 没有正确配置,后续依赖它的包(如 `cuda-drivers`、`cuda`)都无法配置。 --- ### ✅解决方法建议: #### ✅1. 安装内核头文件 ```bash sudo apt install linux-headers-$(uname -r) ``` #### ✅2. 检查 Secure Boot 设置 - 如果你使用的是 UEFI 系统,请进入 BIOS 检查是否启用了 Secure Boot。 - 如果启用了,请**关闭 Secure Boot**,然后重启系统并重新尝试安装。 #### ✅3. 删除 DKMS 配置并重试 ```bash sudo dkms remove nvidia/530.30.02 --all sudo apt purge nvidia-dkms-530 sudo apt install nvidia-dkms-530 ``` #### ✅4. 更新 initramfs(initrd) ```bash sudo update-initramfs -u ``` #### ✅5. 回退内核版本(如果 6.8 不兼容) - 你可以尝试回退到更稳定的内核版本(如 5.15 或 6.5): ```bash sudo apt install linux-image-5.15.0-112-generic sudo apt install linux-headers-5.15.0-112-generic ``` - 安装完成后重启,在 GRUB 菜单中选择旧内核启动。 #### ✅6. 使用官方 CUDA 安装脚本(推荐) 如果你是手动安装 `.deb` 包导致问题,可以尝试使用 NVIDIA 提供的官方安装脚本: ```bash sudo apt update sudo apt install ./cuda-repo-ubuntu2204-12-1-local_12.1.0-1_amd64.deb sudo apt install cuda ``` --- ### 📌安装后建议 - 安装完成后重启: ```bash sudo reboot ``` - 检查 NVIDIA 驱动是否正常加载: ```bash nvidia-smi ``` - 检查 CUDA 是否安装成功: ```bash nvcc --version ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值