重庆做网站推广的,网络营销方式多样,谷歌关键词搜索工具,安卓模仿网站开发详细教程在linux中的线程是轻量级线程#xff08;Light-Weight-process#xff0c;LWP#xff09; 文章目录 线程概念线程实现线程拓展 线程概念
线程分类
用户级线程内核级线程#xff0c;没有用户空间#xff0c;完全工作在内核中#xff08;下图中没有[]的就是用户级线程Light-Weight-processLWP 文章目录 线程概念线程实现线程拓展 线程概念
线程分类
用户级线程内核级线程没有用户空间完全工作在内核中下图中没有[]的就是用户级线程 Linux线程特点
Linux内核不区分进程和线程PCB和TCB本质都是task_struct实例task_struct包含pid和tgid无论进程还是线程它们的pid都是独一无二的一个进程包含一个线程组线程组号进程的pid所有线程的tgid(包括主线程)我们使用ps和getpid方法获取的pid其实就是tgid
对下图用户看到的PID其实就是pgid而LWP其实是pid pid用于调度pgid用于资源管理
线程实现
创建进程我们使用fork创建线程的时候可以使用new thread逻辑层的变化大概如下 下面分析物理层的变化 看下函数的调用关系kernel_thread是创建内核级线程的函数它们的底层都是通过调用clone函数来实现功能的区别是flag参数传的不太下面看下clone函数的函数签名 int clone(int (*fn)(void *), void *stack, int flags, void *arg, ... /* pid_t *parent_tid, void *tls, pid_t *child_tid */ ); 我挑了几个flag介绍一下别的你可以执行man clone自个看
CLONE_VM:标志在进程间共享地址空间虚拟内存CLONE_FS标志进程间共享文件系统信息CLONE_FILES标志在进程间共享打开的文件CLONE_SIGHAND标志在进程间共享信号处理程序…
创建进程时上述几个都不设置创建线程时上述都设置所以说创建线程的时候流程其实和进程是一样的只不过共享的资源不同所以说本质上来说内核不区分什么进程/线程都会当作进程处理。 说到这里了不知道你有没有意识到进程和线程就好像文件系统中的硬链接文件一样其实相同的逻辑也可以带到C中的shared_ptr智能指针这些逻辑都是类似的线程对进程资源维持一个计数当计数为0时释放进程。
注意这些资源都是借助指针指向的如果需要共享的话只需要浅拷贝主线程和其它线程的区别只有运行开始的时候起始位置不同
线程拓展
线程是作为栈帧存在于进程的栈中的对一块内存它的栈指针和代码区运行位置的指针是唯一的线程上下文切换的过程中会保存/恢复这两个指针的位置从而让线程觉得自己可以像进程一样工作
线程模型
多对一模型用户级线程现在不用了就是在用户态维持线程的TCB因此在内核态他会认为这是多线程是一个进程简单间理解的话就是用户模拟多线程自己调度这个东西有点像协程好处是调度灵活上下文切换小。 问题 一个线程阻塞所有线程阻塞 在多核系统中多线程无法并行 只有一个内核线程在内核中 一对一模型内核级线程TCB由内核去管理真正将线程暴露在内核中使得并发性更好可以充分的利用多核CPU的资源windows/linux/…主流操作系统采用这种模型 问题 系统开销大调度压力增大调度自由度低 上下文切换变大
注意内核级线程和内核线程是两个东西内核级强调这种模式下的每一个线程由内核直接调度/控制内核线程是内核为了满足操作系统并发性而独立维护的线程
参考 【Linux系列】深入理解task_struct结构体