LinuxPthread_1

1.Linux中thread和process的异同

1.1thread的基本概念

线程是操作系统能够调度和执行的基本单位,在Linux中也被称之为轻量级进程。从定义中可以看出,线程它是操作系统的概念,在不同的操作系统中的实现是不同的。

对于Linux操作系统而言,它对Thread的实现方式比较特殊。在Linux内核中,其实是没有线程的概念的,它把所有的线程当做标准的进程来实现,也就是说Linux内核,并没有为线程提供任何特殊的调度语义,也没有为线程实现特定的数据结构。取而代之的是,线程只是一个与其他进程共享某些资源的进程。创建线程使用的底层函数和进程底层一样,都是clone,每一个线程拥有一个唯一的task_struct结构,Linux内核它仅仅把线程当做一个正常的进程,或者说是轻量级进程,LWP(Lightweight processes)。

对于其他的操作系统而言,比如windows,线程相对于进程,只是一个提供了更加轻量、快速执行单元的抽象概念。v2-655394a99f5e60a5160cf1aacc95ff24_r

总结一下,Linux线程是进程资源共享的一种方式,而其他操作系统,线程则是一种实现轻量、快速执行单元的抽象概念或者实体。这里再深入的理解一下,Linux中的线程和进程的区别。

1.2线程与进程的区别

线程与进程共享的资源有:内存地址空间,进程基础信息,大部分数据,打开的文件,信号处理,当前工作目录,用户和用户组属性等属性.

线程独有的资源有:线程ID,一系列的寄存器,栈的局部变量和返回地址,错误码 errno,信号掩码,优先级。

由于线程拥有独立的调用栈,除了栈之外共享了其他所有的段segment。但是由于线程间共享了内存,也就是说一个线程,理论上是可以访问到其他线程的调用栈的,可以用一个指针变量,去访问其他线程的局部栈帧,以访问其他线程的局部变量。

1.3线程调度

上下文切换也被称作为进程调度或者任务切换,简单的来说是把CPU从一个进程或者线程切换到另一个执行。概括的来说,线程的上下文切换,要比进程更加快速,因为本质上,线程很多资源都是共享进程的,所以切换时,需要保存和切换的项是很少的。

线程上线文切换时,虚拟地址空间是不变的,但是进程上下文切换时,是需要重新映射虚拟地址空间。进程切换上下文时,进出OS内核&寄存器切换,是最大的时间支出。更模糊的代价是上下文切换时,会干扰处理器的缓存机制。当上下文切换时,处理器需要重新cache一些内存。

这里更大的一个区别时,当更改虚拟地址空间时,CPU 的 TLB 等也会被刷新,导致接下来的内存访问更加耗时,所以相对线程切换来说,进程的切换耗时更大。

1.4线程的缺点

1.4.1共享属性

共享属性:全局变量是在所有线程间共享的,访问时是需要同步加锁。

1.4.2线程安全

因为线程间共享数据,一个线程可以重写另外一个线程的堆栈,导致出现一些异常的情况。

2.线程的基本操作