0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在用户态与内核中实现并使用线程

冬至配饺子 来源:廣廣的随笔 作者:廣廣的随笔 2022-08-17 17:55 次阅读

前言

一个进程内有多个线程,线程有自己的寄存器,程序计数器,堆栈,状态。但是线程间是没有保护的,可以共享地址空间,打开文件集,子进程,定时器以及相关信号量。为什么没有保护,原因是:不可能,也没必要。不同进程可能来自不同用户,它们之间彼此可能有敌意,用户所持有的资源以进程为单位。

与传统进程一样,线程也拥有运行,阻塞,就绪终止状态,正在运行的线程独占CPU并且活跃。与进程状态切换一致,这里就不介绍了。

每个线程堆栈都有一帧,在该栈帧存放了局部变量和过程调用后的返回地址。

在多线程情况下,进程通常会从当前的单个线程开始,也就是主线程,该线程会调用库函数(thread_create)来创建新线程。一般来说,线程之间是平等的。这里介绍其它库函数:

pthread_exit:线程运行结束时,退出,线程消失。

pthread_join:一个线程可以阻塞等待另一个线程退出。

pthread_yield:允许线程自动放弃CPU让给其它线程。

4. pthread_attr_init:创建并初始化一个线程的属性结构。

5. pthread_attr_destroy:删除一个线程的属性结构。

pthread.h

在用户态实现线程

poYBAGL8usCACQ4xAAF5M5PrHlU598.png

在用户空间管理线程时,每个进程都会有一个线程表,用来跟踪该进程中的线程。这些表和内核空间中的进程表相似,不过它仅记录线程的属性。

用户线程中,每个进程都有其相关调度算法,可扩展性高,这是因为内核线程需要固定的表格和堆栈空间。

但是,由于用户线程没有时钟中断,导致某线程想要运行时,只能依靠前一个线程主动放弃CPU,所以没有轮转的说法。

在内核中使用线程

当内核支持管理线程时,进程中就没有线程表了,相反,在内核中就有一张线程表,线程想要创建新线程时,通过系统调用来对线程表更新。另外,内核还维护了传统的进程表。

在上述情况下,当一个线程阻塞时,就可以通过系统调用(内核中的线程表)来切换线程了。

在内核回收和创建线程代价是比较大的,所以回收时,一般会将线程标记为不可运行(并不是真正的回收),需要时再启动。用户态线程不需要。

虽然内核线程可以解决很多问题,但不是能解决所有问题。比如信号问题,创建新进程问题等......

混合实现

人们研究出了采用多个用户线程对应一个内核线程的方法,多个用户线程多路复用。

弹出式线程

在分布式系统中,线程经常使用,通常下,服务接受到消息后,该服务所对应的线程会阻塞并receive,但是弹出式线程会创建一个新的线程去处理收到的消息。

poYBAGL8utWADON8AACnLcR1hFo555.png

在一些OS中,协作的进程可能共享一些彼此都能读写的公共存储区。该存储区可能是一个数据结构,可能是一个共享文件。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5027

    浏览量

    117711
  • 计数器
    +关注

    关注

    32

    文章

    2121

    浏览量

    92952
  • 定时器
    +关注

    关注

    23

    文章

    3146

    浏览量

    112033
收藏 人收藏

    评论

    相关推荐

    [公告]嵌入式Linux内核设计高级研修班

    内核运行轨迹:◆ 返回用户第一条指令  ◆ ld.so的工作3.3如何调试进入不到main的进程3.4 linux线程实现
    发表于 07-24 13:03

    [公告]嵌入式Linux内核设计高级研修班

    内核运行轨迹:◆ 返回用户第一条指令  ◆ ld.so的工作3.3如何调试进入不到main的进程3.4 linux线程实现
    发表于 07-24 13:04

    用户线程内核线程

    线程:不需要内核支持而在用户程序实现线程,其不依赖于操作系统核心,应用进程利用
    发表于 01-10 15:01

    linux 下如何获取线程ID

    ),Linux在早期内核不支持线程的时候glibc就在库用户)以纤程(就是用户
    发表于 07-09 08:36

    【图文并茂】RT-Thread Smart进程概述

    线程:所有的用户线程都属于某一个用户进程,它们共享进程拥有的资源,比如进程的用户
    发表于 03-29 07:08

    操作系统知识点

    用户切换到内核的时候,CPU是在用户进程手中,所以这个是通过硬中断来实现的。再从
    发表于 07-01 10:32

    操作系统为什么分内核用户?这两者如何切换?

    操作系统为什么分内核用户,这两者如何切换?进程在地址空间会划分为哪些区域?堆和栈有什么区别?
    发表于 07-23 09:01

    请问CPU与寄存器,内核用户及如何切换?

    计算机硬件系统由哪几部分构成?编程语言的作用及与操作系统和硬件的关系是什么?请问CPU与寄存器,内核用户及如何切换?
    发表于 10-25 06:31

    OpenHarmony喂狗源码解读之用户源码

    ,ioctl,release ——> 创建内核喂狗线程hidog,并以30.01s喂狗 ——> 用户等待/dev/watchdog创建 ——> 设置和获取超时时间,
    发表于 01-26 10:57

    鸿蒙内核实现用户快速互斥锁Futex设计资料合集

    Futex(Fast userspace mutex,用户快速互斥锁),系列篇简称 快锁 ,是一个在 Linux 上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具,它第一次出现在
    发表于 03-23 14:12

    在RT-Smart用户运行LVGL的操作流程

    可以参考 qemu-vexpress-a9 drv_clcd.c 的实现方法。在用户,要是想获取操作 lcd,驱动至少需要
    发表于 11-18 11:34

    基于Windows 操作系统内核驱动的多核CPU 线程管理

    1 引言 本文分析了Windows 系统的进程调度机制,并设计了一种基于Windows 操作系统内核驱动的多核CPU 线程管理方法,实现了一个基于Windows 内核驱动的
    发表于 10-31 11:02 0次下载
    基于Windows 操作系统<b class='flag-5'>内核</b>驱动的多核CPU <b class='flag-5'>线程</b>管理

    Linux用户空间与内核空间

    应用程序运行在用户空间,而Linux 驱动属于内核的一部分,因此驱动运行于内核空间。当我们在用户空间想要实现
    发表于 05-20 10:58 889次阅读
    Linux<b class='flag-5'>用户</b>空间与<b class='flag-5'>内核</b>空间

    深入浅析Linux内核内核线程(上)

    本文力求与完整介绍完内核线程的整个生命周期,如内核线程的创建、调度等等,当然本文还是主要从内存管理和进程调度两个维度来解析,且不会涉及到具体的内核
    的头像 发表于 04-28 16:26 1732次阅读
    深入浅析Linux<b class='flag-5'>内核</b>之<b class='flag-5'>内核</b><b class='flag-5'>线程</b>(上)

    linux内核线程就这样诞生了么?

    线程是操作系统的重要组成部件之一,linux内核中,内核线程是如何创建的,在内核启动过程中,诞生了哪些支撑整个系统运转的
    的头像 发表于 07-10 10:45 465次阅读
    linux<b class='flag-5'>内核</b><b class='flag-5'>线程</b>就这样诞生了么?