线程与进程线程私有资源
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线程与进程线程私有资源
今天讨论⼀个问题,⼀同事说⼀个进程内线程的所有资源都能被彼此共享,我说线程私有堆栈空间不可以,为此争论了⼏句。
今天加班⽤⽹上资源重新学习了下,以备以后查看
在多线程环境下,每个线程拥有⼀个栈和⼀个。
栈和⽤来保存线程的执⾏历史和线程的执⾏状态,是线程私有的资源。
其他的资源(⽐如堆、地址空间、全局变量)是由同⼀个进程内的多个线程共享。
线程是操作系统能够进⾏运算调度的最⼩单位。
它被包含在进程之中,是进程中的实际运作单位。
⼀条线程指的是进程中⼀个单⼀顺序的控制流,⼀个进程中可以并发多个线程,每条线程并⾏执⾏不同的任务。
在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),⽽把⽤户线程(user thread)称为线程。
对于多数合作性任务,多线程⽐多个独⽴的进程更优越
线程共享相同的内存空间。
不同的线程可以存取内存中的同⼀个变量。
所以,程序中的所有线程都可以读或写声明过的全局变量。
如果曾⽤fork()编写过重要代码,就会认识到这个⼯具的重要性。
为什么呢?虽然fork()允许创建多个进程,但它还会带来以下通信问题,如何让多个进程相互通信,这⾥每个进程都有⾃⼰独⽴的内存空间。
对这个问题没有⼀个简单的答案。
虽然有许多不同种类的本地IPC(进程间通信),但他们都遇到两个重要的障碍:
1.加强了某种形式的额外内核开销,从⽽降低性能。
2.对于⼤多数情形,IPC不是对于代码的“⾃然”扩展,通常极⼤地增加了程序的复杂性。
线程共享资源包括:
1.进程代码段
2.进程的公有数据(利⽤这些共享的数据,线程很容易的实现相互之间的通讯)
3.进程打开的⽂件描述符、信号的处理器、进程的当前⽬录和进程⽤户ID与进程组ID。
线程独⽴资源包括:
1.线程ID
每个线程都有⾃⼰的线程ID,这个ID在本进程中是唯⼀的。
进程⽤此来标识线程。
2.寄存器组的值
由于线程间是并发运⾏的,每个线程有⾃⼰不同的运⾏线索,当从⼀个线程切换到另⼀个线程上时,必须将原有的线程的寄存器集合的状态保存,以便将来该线程在被重新切换到时能得以恢复。
3.线程的堆栈
堆栈是保证线程独⽴运⾏所必须的。
线程函数可以调⽤函数,⽽被调⽤函数中⼜是可以层层嵌套的,所以线程必须拥有⾃⼰的函数堆栈,使得函数调⽤可以正常执⾏,不受其他线程的影响。
4.错误返回码
由于同⼀个进程中有很多个线程在同时运⾏,可能某个线程进⾏系统调⽤后设置了errno值,⽽在该线程还没有处理这个错误,另外⼀个线程就在此时被调度器投⼊运⾏,这样错误值就有可能被修改。
所以,不同的线程应该拥有⾃⼰的错误返回码变量。
5.线程的信号屏蔽码
由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程⾃⼰管理。
但所有的线程都共享同样的信号处理器。
6.线程的优先级
由于线程需要像进程那样能够被调度,那么就必须要有可供调度使⽤的参数,这个参数就是线程的优先级。
线程与进程区别:
1,进程是系统进⾏资源分配和调度的⼀个独⽴单位。
线程是进程的⼀个实体,是CPU调度和分派的基本单位。
线程⾃⼰基本上不拥有系统资源,但是它可与同属⼀个进程的其他的线程共享进程所拥有的全部资源。
由于线程⽐进程更⼩,基本上不拥有系统资源,线程上下⽂切换⽐进程上下⽂切换要快得多,故对它的调度所付出的开销就会⼩得多,从⽽显著提⾼系统资源的利⽤率和吞吐量。
2,⼀个程序⾄少有⼀个进程,⼀个进程⾄少有⼀个线程。
进程在执⾏过程中拥有独⽴的内存单元地址空间,⽽多个线程共享内存,从⽽极⼤地提⾼了程序的运⾏效率。
3,进程间通信IPC需要特别的⽅法,线程间可以直接读写进程数据段(如全局变量)来进⾏通信。
进程的实现只能由操作系统内核来实现,⽽不存在⽤户态实现的情况。
⽽线程可以分为内核态和⽤户态。
内核态创建线程⽐较浪费系统空间资源,因为系统需要维护线程列表,⽽线程的数量要远远⼤于进程的数量,过多的线程创建会使系统资源耗尽⽽瘫痪。
其次内核态实现会修改操作系统。
使⽤⽤户态创建线程就不必太担⼼系统资源耗尽的问题,内核不需要知道有多少线程创建。
⽤户创建⽅便。
缺点:
如果在执⾏过程中⼀个线程受阻,它将⽆法将控制权交出来,这样整个进程都⽆法推进。
操作系统随即把CPU控制权交给另外⼀个进程。
这样,⼀个线程受阻造成整个进程受阻,我们期望的通过线程对进程实施分⾝的计划就失败了。
这是⽤户态线程致命的缺点。