请问:什么是user mode ?
      什么是kernel mode ? 
      如果一个线程调用等待函数,从 user mode 进入 kernel mode ,有什么利弊?

解决方案 »

  1.   

    user mode字面的意思就是用户模式,换句话说就是应用层模式,在系统的基础上,建立的一个环境给用户使用,咱们平常的应用程序都是user mode
    kernel mode 字面意思是内核模式,换句话说就是相对底层,接近系统核心的模式,比如驱动程序的开发就是kerenl mode.不明白你的第三个问题,如果只是一般的应用,为什么要进入kernel 等待,没有特别的需要,是没有必要进入kernel mode的,详细资料可以搜索一下   从ring0进入ring3的相关资料
      

  2.   

    上面说错了
    应该是这样详细资料可以搜索一下   从ring3进入ring0的相关资料
      

  3.   

    谢谢
    就是想知道 kerenl mode 和 user mode 之间的切换都牵扯到什么变化,(比如说控制权 、资源什么的)
      

  4.   

    Example 1:
    // create a manual-reset event
    CEvent g_eventStart(FALSE, TRUE);UINT ThreadProc1(LPVOID pParam)
    {
        ::WaitForSingleObject(g_eventStart, INFINITE);        ...    return 0;
    }UINT ThreadProc2(LPVOID pParam)
    {
        ::WaitForSingleObject(g_eventStart, INFINITE);        ...    return 0;
    }
    问题1 :当 g_eventStart 变成 signaled , 然后 ThreadProc1 或 ThreadProc2 获得后g_eventStart 变成 unsignaled,
            是不是在线程执行完毕  g_eventStart 变成 signaled ?
            既然是 auto-reset 可不可以用 ResetEvent 设置 g_eventStart ?
      

  5.   

    不好意思  上面那个写错了 
    Example 1:
    // create an auto-reset event
    CEvent g_eventStart;UINT ThreadProc1(LPVOID pParam)
    {
        ::WaitForSingleObject(g_eventStart, INFINITE);        ...    return 0;
    }UINT ThreadProc2(LPVOID pParam)
    {
        ::WaitForSingleObject(g_eventStart, INFINITE);        ...    return 0;
    }
    问题1 :当 g_eventStart 变成 signaled , 然后 ThreadProc1 或 ThreadProc2 获得后g_eventStart 变成 unsignaled,
            是不是在线程执行完毕  g_eventStart 变成 signaled ?
            既然是 auto-reset 可不可以用 ResetEvent 设置 g_eventStart ?
      

  6.   

    是不是在线程执行完毕  g_eventStart 变成 signaled ? 
    ================
    不是线程执行完毕,另外,这关user mode 什么事?
      

  7.   

    既然不是执行完毕 , 那是什么时候变成  signaled ?
      

  8.   

    Example 2:
    // create a manual-reset event
    CEvent g_eventStart(FALSE, TRUE);UINT ThreadProc1(LPVOID pParam)
    {
        ::WaitForSingleObject(g_eventStart, INFINITE);        ...    return 0;
    }UINT ThreadProc2(LPVOID pParam)
    {
        ::WaitForSingleObject(g_eventStart, INFINITE);        ...    return 0;
    }问题2 :当 g_eventStart 变成 signaled,是不是  ThreadProc1 或 ThreadProc2 (几乎是)同时执行? 为什么? 如果程序变成这样会怎样 ?UINT ThreadProc1(LPVOID pParam)
    {
        ::WaitForSingleObject(g_eventStart, INFINITE);
        ::ResetEvent(g_eventStart);
            ...    return 0;
    }UINT ThreadProc2(LPVOID pParam)
    {
        ::WaitForSingleObject(g_eventStart, INFINITE);        ...    return 0;
    }