操作系统与 CPU 是怎么执行线程的?
时间:2022-07-23
本文章向大家介绍操作系统与 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 线程是用户空间的线程,采用的是线程-进程 一对一模型
内核线程与用户线程
内核线程就是内核分身,一个内核线程处理一个事务,很少有直接调取内核线程,而是操作用户线程,用户线程与内核线程一对一,多对一,多对多。
多对一
一对一
多对多模型
JVM 与线程
JVM 提供了 JavaThread 类来对 Java 语言的Thread ,Java 语言中创建一个 java.lang.Thread 对象,JVM 会在对象中创建一个 OsThread 来对应Pthread 创建的底层操作系统线程对象。
JVM 创建线程源码
- JavaThread: 创建线程执行任务,持有java_lang_thread & OSThread对象,维护线程状态运行Thread.run()的地方
- OSThread: 由于不同操作系统的状态不一致,所以JVM维护了一套平台线程状态,被JavaThread所持有
- java_lang_Thread::ThreadStatus: 即Java线程状态,与java.lang.Thread.State完全一致
- 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;
}
https://zhuanlan.zhihu.com/p/103463694
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法