Linux中的线程

一、进程线程关系

1、首先,Linux中并不存在真正意义上的线程,是通过pthread库加载到相应进程的地址空间之中,在共享区里存储着轻量级进程------也就是用户态线程的信息,其中有栈区等等。各个线程之间有独自的栈区空间,但是堆区公用。

2、进程是资源分配的基本单位,线程是cpu调度的基本单位。cpu并不拥有系统资源,而是共享进程申请来的系统资源;线程不具有自己的地址空间,而是共享进程申请来的地址空间,只不过在则个地址空间中拥有自己独立的一小部分;线程不包含cpu现场,不能独立执行程序;线程之间大多共享,少量独占,所以线程之间的通信比进程编程简单,但是这也带来了线程安全的问题,以及多线程环境在因为共享同一个地址空间,所以在访问公共变量或内存时需要引入同步机制

3、用户态线程的切换在用户态实现,不需要内核的支持。线程和进程都可以并发执行,但是线程之间有大量资源共享,粒度更小占用资源更少,所以并发执行的可行性比进程更高,不过这意味着安全性的降低,因为一个线程退出,会导致同一个进程中的所有线程和进程都推出;对于大量的计算操作,应该使用多线程,以发挥现在大部分机器的多cpu优势,能够提高机器的程序响应速度

4、程序是一个静态的东西,只有在程序运行的时候,才存在进程这个实体概念,是一次程序的运行,因此说一个程序只有至少有一个进程,是错误的;一个线程可以创建和撤销另一个线程;在多进程环境下,子进程可以复制父进程堆栈中的所有的数据,但是线程之间则会共享除了自己的寄存器和栈,为通信创建了良好条件

二、LWP理解

Light Weight Process轻量级进程,是通过pcb实现的,这个pdb有自己的pid,与创建它的进程共用同一块地址空间,所以相对创建的时间、空间成本低;而我们用户调用pthread_create创建的线程被成为用户级线程,是通过轻量级线程实现的,一个进程中所有的轻量级进程在一起组成一个线程组,这个线程组有自己的线程组ID,也就是进程的ID

三、线程互斥

1、锁:锁实际上就是一个计数器,比如说互斥锁就是0/1,如果是0就说明已经加锁成功,已经有一个线程在访问临界区资源,而如果是1,就说明现在没有线程在访问临界区资源,此时锁是可供获得的

2、所谓线程互斥,就是为了防止造成数据二义,所以共享区资源同一时间段内只能有一个线程访问

四、条件变量

条件变量提供了一个pcb阻塞队列,以及阻塞和唤醒线程的接口用于同步(pthread_cond_wait(cond, mutex), pthread_cond_signal(cond)),但是什么时候该唤醒或者该阻塞线程有程序员自己控制,条件变量需要搭配互斥锁使用,而信号量可以单独使用来实现线程的同步与互斥(二元信号量可以认为是一把互斥锁)。

条件变量在等待被唤醒时需要重新对条件进行判断,以避免线程被唤醒后在没抢到锁时阻塞,在抢到锁后访问时不满足访问条件,所以需要进行二次判断。具体实现方法可以通过while循环进行二次判断

相关推荐
我是一只小青蛙888几秒前
Java分层开发:PO、BO、DTO、VO全解析
java
步步为营DotNet1 分钟前
深度剖析.NET 中CancellationToken:精准控制异步操作的关键
java·前端·.net
搞全栈小苏2 分钟前
使用 nvm(不破坏系统)Linux 上把 Node.js / npm 升级到你指定版本(Node v23.x、npm 10.x)
linux·npm·node.js
ONLYOFFICE3 分钟前
ONLYOFFICE 桌面编辑器现已推出 Linux ARM 版本
linux·运维·arm开发
橘颂TA4 分钟前
【剑斩OFFER】算法的暴力美学——leetCode 662 题:二叉树最大宽度
c++·算法·结构与算法
MSTcheng.6 分钟前
【C++】开放定址法实现哈希表!
c++·缓存·stl·散列表·哈希
a努力。6 分钟前
得物Java面试被问:B+树的分裂合并和范围查询优化
java·开发语言·后端·b树·算法·面试·职场和发展
阿钱真强道6 分钟前
04 ubuntu20下 OpenHarmony-3.0-LTS qemu mps2-an386 运行 liteos_m
linux·嵌入式硬件·ubuntu·harmonyos
a程序小傲7 分钟前
中国电网Java面试被问:Kafka Consumer的Rebalance机制和分区分配策略
java·服务器·开发语言·面试·职场和发展·kafka·github
lbb 小魔仙8 分钟前
从零搭建 Spring Cloud 微服务项目:注册中心 + 网关 + 配置中心全流程
java·python·spring cloud·微服务