Linux系统编程(八)线程
Linux系统编程(八)线程
- 一、什么是线程?
- 二、Linux内核线程实现原理
- 线程共享资源
- 线程非共享资源
- 线程优缺点
- 线程控制原语
一、什么是线程?
- LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下)
- 进程:独立地址空间,拥有PCB
- 线程:也有PCB,但没有独立的地址空间(共享)
- 区别:在于是否共享地址空间
- Linux下: 线程:最小的执行单位 ,进程:最小分配资源单位,可看成是只有一个线程的进程。
二、Linux内核线程实现原理
类Unix系统中,早期是没有“线程”概念的,80年代才引入,借助进程机制实现出了线程的概念。因此在这类系统中,进程和线程关系密切。
- 轻量级进程(light-weight process),也有PCB,创建线程使用的底层函数和进程一样,都是clone
- 从内核里看进程和线程是一样的,都有各自不同的PCB,但是PCB中指向内存资源的三级页表是相同的
- 进程可以蜕变成线程
- 在linux下,线程最是小的执行单位;进程是最小的分配资源单位
- 线程可看做寄存器和栈的集合
代码如下(示例):
线程共享资源
- 文件描述符表
- 每种信号的处理方式
- 当前工作目录
- 用户ID和组ID
- 内存地址空间 (.text/.data/.bss/heap/共享库)
线程非共享资源
- 线程id
- 处理器现场和栈指针(内核栈)
- 独立的栈空间(用户空间栈)
- errno变量
- 信号屏蔽字
- 调度优先级
线程优缺点
优点:
- 提高程序的并发性
- 开销小
- 数据通信、共享数据方便
缺点:
- 库函数不稳定
- gdb无法调试
- 对信号支持不好
线程控制原语
#include <cstdio>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
void* thrd_func(void* arg)
{printf("thread id = %lu , pid = %u \n",pthread_self(),getpid());return NULL;
}int main()
{pthread_t tid;int ret;printf("In main id = %lu , pid = %u \n", pthread_self(), getpid());ret=pthread_create(&tid,NULL, thrd_func,NULL);if (ret != 0){fprintf(stderr,"pthread_create error :%s\n",strerror(ret));printf("pthread_create error:\n");exit(1);}sleep(1);printf("In main2 id = %lu , pid = %u \n", pthread_self(), getpid());return 0;
}
Linux系统编程(八)线程相关推荐
- linux系统编程:线程原语
线程原语 线程概念 线程(thread),有时被称为轻量级进程(Lightweight Process,LWP).是程序运行流的最小单元.一个标准的线程由线程ID.当前指令指针(PC),寄存器集合和堆 ...
- 【Linux系统编程】线程基本操作
00. 目录 文章目录 00. 目录 01. 线程概述 02. 线程常用函数 2.1 获取线程号 2.2 线程号比较 2.3 线程创建 2.4 回收线程资源 2.5 线程分离 2.6 线程退出 03. ...
- 【Linux系统编程】线程的基本操作
概述 每个进程都拥有自己的数据段.代码段和堆栈段,这就造成进程在进行创建.切换.撤销操作时,需要较大的系统开销.为了减少系统开销,从进程中演化出了线程.为了让进程完成一定的工作,进程必须至少包含一个线 ...
- 【Linux系统编程】线程池
00. 目录 文章目录 00. 目录 01. 线程池原理 02. 线程池应用实例 03. 线程池代码 04. 附录 01. 线程池原理 在传统服务器结构中,常是有一个总的监听线程监听有没有新的用户连接 ...
- 【Linux系统编程】线程私有数据
00. 目录 文章目录 00. 目录 01. 线程之间共享数据 02. 线程私有数据 2.1 创建线程私有数据 2.2 销毁线程私有数据 2.3 关联线程私有数据成员 2.4 读取线程私有数据所关联的 ...
- 【Linux系统编程】线程栈大小
00. 目录 文章目录 00. 目录 01. 概述 02. 设置线程栈函数 03. 附录 01. 概述 先来讲说线程内存相关的东西,主要有下面几条: 进程中的所有的线程共享相同的地址空间. 任何声明为 ...
- 【Linux系统编程】线程同步与互斥:POSIX无名信号量
信号量概述 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问. 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 ...
- 【Linux系统编程】线程堆栈大小的使用介绍
先来讲说线程内存相关的东西,主要有下面几条: 进程中的所有的线程共享相同的地址空间. 任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写. 一个线程真正拥有的唯一私有储 ...
- 【Linux系统编程】线程与进程的比较
在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至少包含一个线程. 进程, ...
- 【Linux系统编程】线程同步与互斥:读写锁
读写锁基本原理 当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住.但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互 ...
最新文章
- 查python的软件_[Python实战]Python制作天气查询软件
- LeetCode 26 Remove Duplicates from Sorted Array [Array/std::distance/std::unique] c++
- 【安全技术】关于几种dll注入方式的学习
- centos7安装docker安装rabbitmq(2021)亲测有效!!!
- 用JS解决多行溢出文本的省略问题
- 项目建立数据库初始环境脚本文件的示例
- Java 线程状态---WAITING(部分转载)
- 互联网日报 | 7月19日 星期一 | 美团外卖成立骑手服务部;金山办公发布“文档中台”;一汽-大众奥迪在华销量突破700万辆...
- python爬虫基础扫盲之urllib.pase解析URL
- 多元函数梯度下降 java_机器学习知识点(五)梯度下降法Java实现
- 《Cortex-M0权威指南》之Cortex-M0编程入门
- php判断数值大小_php 快速判断一个数字属于什么范围的实现方法
- 基于深度学习的青菜病害区域图像语义分割与定位
- ArcGIS制图表达Representation实战篇4-自由式制图表达
- php 数组 utf8,PHP数组编码gbk与utf8互相转换的两种方法实例分享
- PTCMS4.2.8小说网站源码模板
- debian apache2不执行php,Debian下Apache2的安装与配置
- codeforces 赛后总结
- 苹果手机(iPhone)系统升级到IOS16.1后,发现连接WiFi、热点总是经常自动(随机)断开
- 大数据入门之学习视频资料分享
热门文章
- 《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---10
- Error0---local variable S is accessed from within inner class; needs to be declared final
- mongodb 如何删除 字段值为 json对象中的某个字段值
- 如何更改Visual Studio 2008中类文件引用的默认名称空间?
- html vbs 输入框,HTML_vbs实现的下拉框对应键入值,vbs实现的下拉框对应键入值 - phpStudy...
- linux伙伴系统算法,Linux伙伴系统(三)--分配
- java使用impala存放多条sql_Impala基于内存的SQL引擎的详细介绍
- python 重置索引_python pandas 对series和dataframe的重置索引reindex方法
- 电脑投屏软件哪个好_目前当贝市场中投屏软件哪个好,最全面投屏技巧盘点
- 新型发明创造大赛计算机类,2017年发明杯全国高职高专大学生创新创业大赛