文章目录

  • 一、多线程概述
  • 二、线程分类
  • 三、线程创建的Linux实现

一、多线程概述

  进程是系统中程序执行和资源分配的基本单位。每个进程有自己的数据段、代码段和堆栈段,这就造成进程在进行切换等操作时都需要有比较复杂的上下文切换等动作。为了进一步减少处理器的空转时间支持多处理器和减少上下文切换开销,于是就出现了线程。
  线程通常叫作轻量级进程,线程是在共享内存空间中并发执行的多道执行路径,是一个更加接近于执行体的概念,拥有独立的执行序列,是进程的基本调度单元,每个进程至少有一个 main 线程。它与同进程中其他线程共享进程空间 {堆 代码 数据 文件描述符 信号等},只拥有自己的栈空间,大大减少了上下文切换的开销。
  进程和线程的关系如下所示:

  线程和进程在使用上各有优缺点:线程执行开销小,占用的 CPU 资源少,线程之间的切换快,但不利于资源的管理和保护;反而进程正相反。从可移植性来说,多进程的可移植性要好些。
  同进程一样,线程也将相关的变量值放在线程控制表内。一个进程可以有多个线程,也就是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。要注意的是,由于线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都会给其他线程带来影响。

二、线程分类

  线程按调度者不同可分为用户级线程和核心级线程。
  用户级线程:主要解决上下文切换问题,调度算法和调度过程全部由用户决定,在运行时不需要特定的内核支持。缺点是无法发挥多处理器的优势。
  核心级线程:允许不同进程中的线程按照同一相对优先调度方法调度,发挥多处理器的并发优势。
  现在大多数系统都采用用户级线程和核心级线程并存的方法。一个用户级线程可以对应一个或多个核心级线程,也就是“一对一”或“一对多”模型。

三、线程创建的Linux实现

  Linux 的线程是通过用户级的函数库实现的,一般采用 pthread 线程库实现线程的访问和控制,它用第 3 方 posix 标准的 pthread,具有良好的可移植性。编译的时候要在后面加上 -lpthread 。

              创建              退出              等待多进程      fork()              exit()              wait()多线程   pthread_create()    pthread_exit()      pthread_join()

嵌入式Linux系统编程学习之二十六多线程概述相关推荐

  1. 嵌入式Linux系统编程学习之二十八线程的等待退出

    文章目录 一.等待线程退出 二.线程的取消 三.线程终止清理函数 一.等待线程退出   线程从入口点函数自然返回,或者主动调用 pthread_exit 函数都可以让线程正常终止.线程从入口点函数自然 ...

  2. 嵌入式Linux系统编程学习之二十九线程的互斥

    文章目录 前言 一.创建和销毁锁 二.互斥锁属性 三.锁操作 四.加锁注意事项 五.加锁步骤 前言   在 Posix Thread 中定义了一套专门用于线程互斥的 mutex 函数.mutex 是一 ...

  3. 嵌入式Linux系统编程学习之二十四消息队列

    文章目录 前言 一.msgget 函数 二.msgsnd 函数 三.msgctl 函数 补充 前言   消息队列与 FIFO 很相似,都是一个队列结构,都可以有多个进程往队列里面写信息,多个进程从队列 ...

  4. 嵌入式Linux系统编程学习之二十二内存映射

    文章目录 前言 一.mmap函数 二.munmap函数 三.补充 前言   内存映射函数包括 mmap.munmap 和 msync,其原型为: #include <unistd.h>#i ...

  5. 嵌入式Linux系统编程学习之二十五信号量

    文章目录 前言 一.System V IPC 机制:信号量 1. semget 函数 2. semop 函数 3. semctl 函数 二.Posix 有名信号量 前言   信号量与信号量集的概念如下 ...

  6. 嵌入式Linux系统编程学习之二十无名管道(PIPE)

      管道是 Linux 进程间通信的一种方式,如命令 ps -ef | grep ntp .   无名管道的特点包括: 只能在亲缘关系进程间通信(父子或兄弟): 半双工(固定的读端和固定的写端): 它 ...

  7. 嵌入式Linux系统编程学习之二常用命令

    嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...

  8. 嵌入式Linux系统编程学习之二十三 System V 共享内存机制

    文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言   共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...

  9. 嵌入式Linux系统编程学习之二十一命名管道(FIFO)

    文章目录 前言 一.创建.删除FIFO文件 1. 用函数创建和删除 FIFO 文件 2. 用命令创建和删除 FIFO 文件 二.打开.关闭FIFO文件 三.读写FIFO 前言   无名管道只能在有亲缘 ...

最新文章

  1. 常用memcached命令详解
  2. 离开百度三年多,吴恩达纽交所敲钟,身价再增20亿
  3. 009_InputNumber计数器
  4. OpenCASCADE:读取和写入 STEP
  5. 转: Linux下单网卡多vlan多虚拟机
  6. linux下用mail发送邮件
  7. UVA11361 Investigating Div-Sum Property
  8. 前端宽度一至显示宽度不一致_便利店装修注意事项,你确定不看看?
  9. 【2019杭电多校第七场1011=HDU6656】Kejin Player(期望dp+递推+逆元)
  10. js 闭包传参_javascript深入理解js闭包
  11. Robotframework+Appium环境搭建
  12. 大量大数据如何进行查询
  13. 社交网络和物联网技术,拓展了数据采集技术渠道
  14. 使用 kind 1 分钟启动一个本地 k8s 开发集群
  15. Windows 10与微软公有云Azure
  16. 更改vscode Java项目的.class文件输出路径
  17. 全国计算机等级考试一级(WIN7+OFFICE2010)作题练习指导
  18. Oracle问题:如何远程连接Oracle数据库
  19. STM32L0 内部EEPROM写读
  20. sketch html尺寸,为何sketch预置画布尺寸比真实分辨率小?

热门文章

  1. JupyterLab显示pyecharts图像
  2. 使用python GluonTS库做概率预测
  3. Linux/Mac修改conda源,方便安装pytorch等
  4. linux设备驱动模型及其他,Linux设备驱动模型
  5. java酒店信息管理系统_java实现酒店管理系统
  6. html5 video在uc不自动播放,uc浏览器无法播放视频怎么办
  7. Linux之间配置SSH互信(SSH免密码登录)
  8. python如何安装第三方库
  9. 使用C# 未解决的问题(VS2012)
  10. Codeforces 120F Spiders