C++11多线程编程 一:多线程概述

C++11多线程编程 一:多线程概述

C++11多线程编程 二:多线程通信,线程同步,锁

C++11多线程编程 三:锁资源管理和条件变量 

C/C++基础,Boost创建线程、线程同步 


0 背景

        多线程可以提高程序的并发性,提高并发性有两种方式,一个是多线程,一个是多进程,但多线程对系统的消耗更加少一些,并且线程和进程的平均效率是差不多的。
我们在执行一个程序的时候,其会占用CPU资源,而CPU资源是有限的,假如有8个CPU,然后需要执行100个应用程序,但是为什么会同时运行呢?,其实这是一个假象,CPU会把单位的时间平均分成若干份,每一份都是CPU的时间片,纳秒或者微秒级别,时间片分好之后让系统进行调度,每个线程在执行的时候,都需要抢占CPU的时间片,如果抢到了,那这个线程就执行,如果没有抢到,就处于一个就绪状态,就绪态的线程没有CPU的使用权,因为没有抢到CPU的使用功权,所以就需要不停的去抢,抢到之后就可以运行了,就变成了运行态,用完时间片之后,就又重新恢复到了就绪态,继续抢占时间片,循环往复,通过这样的快速切换,我们看到的这个线程是在运行,其实他也是在走走停停的,只不过因为视觉暂留现象,看不出他暂停了。
 
        Linux内核只有进程,没有线程,线程就是一个轻量级的进程(LWP:light weight process),在 Linux 环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位,分配系统资源,可以这样理解,进程是资源分配的最小单位,线程是操作系统调度执行的最小单位。

        多个线程共用同一个地址空间,而进程有自己独立的地址空间,线程更加节省系统资源,效率不仅可以保持,而且能够更高
        在一个地址空间中多个线程独享:每个线程都有属于自己的栈区,寄存器 (内核中管理的),栈区就是内存四区中存储临时变量的区域,寄存器是CPU里面的资源,寄存器资源是由内核区来管理的,就不过多展开了。
        在一个地址空间中多个线程共享代码段,堆区,全局数据区,打开的文件(文件描述符表)都是线程共享的

        操作系统在分配资源的时候,最小单位是一个虚拟地址空间,这一个地址空间被一个进程使用,每个进程对应一个虚拟地址空间,一个进程只能抢一个 CPU 时间片(如果地址空间中住着10个线程,那么这个10个线程都可以抢CPU的时间片,所以线程虽然占用的系统资源少,但是他的效率并没有降低),一个地址空间中可以划分出多个线程,在有效的资源基础上,能够抢更多的 CPU 时间片
 
        什么是地址空间呢?就是我们启动一个应用程序,就会得到下图所示的地址空间,其实就是内存四区的增强版
        代码段就是下面图中的.text段
        堆区就是存储new出来的或者malloc出来的资源
        全局数据区就是全局变量或者静态变量存储的位置,就是.bss段或者.data段

        这个地址空间包含了内存四区,还包括另外的一些东西,上图是一个进程里面所有的东西,每启动一个进程都占用这样的一个地址空间,如果再启动一个进程就得到了第二个这样的虚拟地址空间。而多个线程共用同一个地址空间。

        假如操作系统里面只有一个线程,那么单线程和单进程是一样的,因为没有其他的程序跟它进行抢占,那他他就会一直被得到执行,也就是上图的那个单线程所示的那样,他就被一直执行。如果有多个线程,CPU在处理多个线程的时候, 把CPU的时间分成了若干个碎片,每个线程只抢一个,抢到了就执行,执行完之后,放弃CPU的使用权,这个多线程的图画的太理想了,在系统后台这些抢占都是随机的,可能线程1在前3次抢到了CPU的时间片,线程2可能前10次都抢到了,线程3可能2-5次抢到了。都有可能,并且每次执行都不一样。多线程运行他是一个无序的运行状态。
 
CPU的调度和切换:线程的上下文切换比进程要快的多
        上下文切换:进程 / 线程分时复用 CPU 时间片,在切换之前会将上一个任务的状态进行保存(保存在寄存器里面),下次切换回这个任务的时候,从寄存器加载这个状态继续运行,任务从保存到再次加载这个过程就是一次上下文切换。
线程更加廉价,启动速度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值