课时66_线程
文章目录
1、创建线程
创建线程后,地址空间没有变化,进程退化成了线程,即主线程。
创建出的子线程和主线程公用地址空间。
主线程和子线程有各自的pcb(进程控制块),子线程的pcb是从主线程拷贝而来。
2、用户区独立与共享
用户区哪些是线程共用的?哪些是线程不共用的?
2.1、用户区包括哪些内容
(1).text:代码段
(2).bss:未初始化的全局变量
(3).data:初始化的全局变量
(4)动态库加载区
(5)环境变量
(6)命令行参数
(7)堆
(8)栈
2.2、用户区共享内容
除栈外,其他为共享资源。
那么,线程之间通信可以使用:全局变量、堆。
(1).text:代码段
(2).bss:未初始化的全局变量
(3).data:初始化的全局变量
(4)动态库加载区
(5)环境变量
(6)命令行参数
(7)堆
2.3、用户区不共享内容
(8)栈
假设一共5个线程,地址空间中栈被平均分成5份,即stack size 8192kb
被平均分成5份。
enspire@Ubuntu18:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7639
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7639
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
3、线程与进程
在Linux下:
(1)线程就是进程-轻量级进程
(2)对于内核来说,线程就是进程(内核只看pcb)
查看指定线程的LWP号:
(1)线程号和线程ID是有区别的
(2)线程号是给内核看的
(3)查看方式:
步骤1:ps aux
找到进程的ID,即pid
步骤2:ps -Lf pid
4、多线程与多进程区别
一个单独的进程可以看做线程。
4.1、多进程始终共享的资源
(1)代码
(2)文件描述符(例如管道的实现)
(3)内存映射区(mmap创建)
4.2、多线程始终共享的资源
(1)堆
(2)全局变量
4.3、多线程比多进程节省资源
4.4、多线程没有降低效率
内核分配时间碎片是根据pcb分配,多线程中每个线程有各自的pcb,从这个角度分析不会降低效率。