什么是线程?
在Linux kernel中是不存在线程的,或者说没有真正意义上的线程,Linux下的线程都是用进程来模拟的,线程的实现就是多个共享数据信息的进程,我们称之为“轻量级进程”。
多线程的引入
多线程是指操作系统在单个进程内支持多个并发执行路径的能力,线程属于进程的的多个执行流。linux多线程设计包括多任务程序的设计,并发程序设计,网络程序设计,数据共享等。
Linux系统下的多线程遵循POSIX线程接口,称为POSIX thread 或者 pthread。在linux下线程函数位于libpthread共享库中,需要加上头文件pthread.h,连接时需要使用-lpthread。
Linux下pthread的实现是通过系统调用clone ( ) 来实现的,clone是linux所特有的系统调用,它的使用方式类似于fork。
线程的共享与私有
由于同一个进程的多个线程共享同一地址空间,因此Text Segment、Data Segment 都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问,除此之外,各线程共享以下进程资源和环境:
(1)文件描述符(fd)
(2)每种信号的处理方式(SIG_IGT、SIG_DEL或者自定义的信号函数)
(3)当前的工作目录
(4)用户id和组id
但是,有一些资源是各个线程私有一份的:
(1)线程id
(2)上下文,包括各种寄存器的值、程序计数器和栈指针
(3)栈空间
(4)errno变量
(5)信号屏蔽字
(6)调度优先级
线程由内核自动调度,并且内核通过一个整数ID来识别线程。同基于I/O多路复用一样,多个线程运行在单一进程的上下文中,因此共享这个进程虚拟地址空间的整个内容,包括代码、数据、堆、共享库和打开的文件。
线程执行模型
多线程的执行模型在某些方面和多进程是相似的,如下图所示:
每个进程开始生命周期都是单一线程,整个线程称之为主线程(main thread)。在某一时刻,主线程创建一个对等线程(peer thread),从这个时间点开始,两个线程就并发地执行。最后,因为主线程执行一个慢速系统调用(read 或 sleep)等,控制就会通过上下文切换传递到对等线程,对等线程会执行一段时间,然后传递回主线程。