操作系统与 CPU 是怎么执行线程的?

简介: 操作系统与 CPU 是怎么执行线程的?

操作系统与 CPU 是怎么执行线程的?



查看 CPU  信息


cat /proc/cpuinfo

查询结果


processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 60
model name  : Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz
stepping    : 3
microcode   : 0x22
cpu MHz     : 2393.631
cache size  : 6144 KB
physical id : 0
siblings    : 8
core id     : 0
cpu cores   : 4
  • physical id 机器上就安装了几个物理CPU
  • cpu core 记录了每个物理CPU,内部有几个物理核
  • siblings 代表每个物理CPU有多少个逻辑核


经常提到 6 核 12 线程,4 核 8 线程是什么意思?一核会定义处理一个线程,但是为提高效率,经常会将物理虚拟成逻辑处理单元,让一个物理核为2个虚拟核,每个核两个线程。


线程


线程是 CPU 调度的最小单位,程序代码执行的最小单元 进程是资源管理用的,Linux 线程是用户空间的线程,采用的是线程-进程 一对一模型


内核线程与用户线程


内核线程就是内核分身,一个内核线程处理一个事务,很少有直接调取内核线程,而是操作用户线程,用户线程与内核线程一对一,多对一,多对多。


多对一


640.png



一对一

640.png


多对多模型

640.png




JVM 与线程


JVM 提供了 JavaThread 类来对 Java 语言的Thread ,Java 语言中创建一个 java.lang.Thread 对象,JVM 会在对象中创建一个 OsThread 来对应Pthread 创建的底层操作系统线程对象。


640.png


JVM 创建线程源码


  1. JavaThread: 创建线程执行任务,持有java_lang_thread & OSThread对象,维护线程状态运行Thread.run()的地方
  2. OSThread: 由于不同操作系统的状态不一致,所以JVM维护了一套平台线程状态,被JavaThread所持有
  3. java_lang_Thread::ThreadStatus: 即Java线程状态,与java.lang.Thread.State完全一致
  4. OSThread::ThreadState: 2所说的平台线程状态


//os_linux.cpp
bool os::create_thread(Thread* thread, ThreadType thr_type,
                       size_t req_stack_size) {
  assert(thread->osthread() == NULL, "caller responsible");
  // Allocate the OSThread object (<_<)可能空指针
  OSThread* osthread = new OSThread(NULL, NULL);
  if (osthread == NULL) {
    return false;
  }
  // java_thread
  osthread->set_thread_type(thr_type);
  // Initial state is ALLOCATED but not INITIALIZED
  osthread->set_state(ALLOCATED);
  thread->set_osthread(osthread);
  pthread_attr_t attr;
  pthread_attr_init(&attr);
  // 所以java线程都是分离状态,join也并非用结合状态
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  // -Xss默认1M,Thread没设置stackSize,在Linux-x86默认512K,取最大值
  size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size);
  //这里设置栈警戒缓冲区,默认系统页大小
  //原注解的意思是,Linux的NPTL没有完全按照posix标准
  //理应guard_size + stack_size,且二者大小相等,而不是从stack_size取guard_size作为警戒取
  //所以这里模仿实现posix标准
  size_t guard_size = os::Linux::default_guard_size(thr_type);
  if (stack_size <= SIZE_MAX - guard_size) {
    stack_size += guard_size;
  }
  assert(is_aligned(stack_size, os::vm_page_size()), "stack_size not aligned");
  int status = pthread_attr_setstacksize(&attr, stack_size);
  assert_status(status == 0, status, "pthread_attr_setstacksize");
  pthread_attr_setguardsize(&attr, os::Linux::default_guard_size(thr_type));
  ThreadState state;
  {
    //欧了,创建线程,函数指针thread_native_entry是重点
    pthread_t tid;
    int ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread);
    pthread_attr_destroy(&attr);
    if (ret != 0) {
      // Need to clean up stuff we've allocated so far
      thread->set_osthread(NULL);
      delete osthread;
      return false;
    }
    // Store pthread info into the OSThread
    osthread->set_pthread_id(tid);
    // 等待thread_native_entry设置osthread为INITIALIZED,或收到终止信号
    {
      Monitor* sync_with_child = osthread->startThread_lock();
      MutexLockerEx ml(sync_with_child, Mutex::_no_safepoint_check_flag);
      while ((state = osthread->get_state()) == ALLOCATED) {
        sync_with_child->wait(Mutex::_no_safepoint_check_flag);
      }
    }
  }
    // Aborted due to thread limit being reached
  if (state == ZOMBIE) {
    thread->set_osthread(NULL);
    delete osthread;
    return false;
  }
  // The thread is returned suspended (in state INITIALIZED),
  // and is started higher up in the call chain
  assert(state == INITIALIZED, "race condition");
  return true;
}


相关文章
|
1月前
|
消息中间件 存储 算法
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
82 0
|
1月前
|
存储 消息中间件 算法
《操作系统》——进程与线程
《操作系统》——进程与线程
|
3月前
|
存储 缓存 安全
浅谈OS进程和线程
浅谈OS进程和线程
37 0
|
3月前
|
缓存 Linux 调度
操作系统-CPU粘合
操作系统-CPU粘合
25 0
|
3月前
|
Linux 调度
操作系统-线程同步
操作系统-线程同步
33 0
|
3月前
|
存储 Java API
操作系统,进程与线程(一)(下)
操作系统,进程与线程(一)(下)
39 0
|
25天前
|
存储 缓存 PHP
阿里云服务器实例、CPU内存、带宽、操作系统选择参考
对于使用阿里云服务器的用户来说,云服务器的选择和使用非常重要,如果实例、内存、CPU、带宽等配置选择错误,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文为大家介绍一下阿里云服务器实例、CPU内存、带宽、操作系统的选择注意事项,以供参考。
阿里云服务器实例、CPU内存、带宽、操作系统选择参考
|
1月前
|
算法 网络协议 调度
操作系统 -- CPU调度
操作系统 -- CPU调度
18 0
|
1月前
|
Go 调度
|
2月前
|
安全 Linux API
认识操作系统线程
操作系统(OS)是管理计算机硬件与软件资源的系统软件,它作为用户与计算机硬件之间的接口,提供了用户界面和必要的服务以控制硬件。
15 0