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

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

查看 CPU 信息

cat /proc/cpuinfo

查询结果

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

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

线程

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

内核线程与用户线程

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

多对一

4b1b51f96aaf4f054af11a2080a345b1.png

一对一

697fdcfd991fffab24453f437214dca9.png

多对对模型

875a7d15474150df05c46f90bbb06eba.png

JVM 与线程

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

b217e7e79006204c0f6e3da760d147bd.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.cppbool os::create_thread(Thread* thread, ThreadType thr_type,                       size_t req_stack_size) {  assert(thread->osthread() == NULL, "caller responsible");  // Allocate the OSThread object (<_>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;}

欢迎关注公众号:程序员开发者社区

  • https://zhuanlan.zhihu.com/p/103463694
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值