进程是系统资源分配的基本单位,线程比进程小,是调度的基本单位。
线程独立资源包括:线程id,程序计数器,寄存器租和堆栈。与其他线程共享资源包括:同一进程的代码段,数据段和其他资源,如io等。如果一个进程具有多个线程,那么对于多核cpu,可以同时执行多个线程。对于单核cpu,虽然同一时刻只有一个线程执行,但是cpu可以再空闲时调度其他线程进行执行,当某个线程进行io操作需要等待时,cpu空闲,转而执行其他线程,这样cpu高速在多个线程之间交替执行,给人感觉“同时”执行,但并不是真的同时执行。
在RPC系统中,线程起着至关重要的作用。rpc的通讯进制中,当收到请求时,需要对请求进行回应,通常服务器会使用一个线程去处理这个请求,这样运行服务器处理多个请求,提供并发性。
1.经济:线程更小,因而创建代价小,占用资源少,切换方便,效率高。
2.可伸缩性:充分利用多核系统的的并行资源。
3.响应性:在执行某个需要持续一段时间的任务时,cpu不需要等待该任务执行结束再去执行其他任务,而是可以直接去执行其他任务。因而可以极大的提升多任务的执行效率。
4.资源共享:同一个进程中的多个线程共享进程的内存和资源。而不同进程只能通过共享内存或消息传递来共享资源。
进程id:processID,简称pid。进程可以理解为一组线程,也称线程组。因此pid用于区分线程的归属,不属于同一个进程的线程,其pid必定不同。
线程id:threadID,简称tid。对于单线程的进程,其pid和tid相同,而同一个进程的线程有不同的线程id用于区分。
并发:可以在短时间内处理多个任务,但是不能同时。只不过多个任务之间切换的很快,显得“同时”处理。可以处理多个任务,但是不能同时。如先吃饭,收到电话,转而接听电话,接听完毕后再吃饭。如多个用户同时向服务器发送请求,服务器每次只能处理一个请求,但是每个请求完成或进行io操作需要等待时,cpu去处理其他请求,这样短时间内处理很多请求,提高并发性。而如果使用单线程,请求又是io操作,那么除非io操作完成,否则cpu无法执行其他请求。
并行:可以同时处理多个任务。对于多核cpu的多线程适用,每个计算核都可以同时执行一个线程。吃饭时收到电话,同时吃饭和接听电话。
对于单核系统,并发意味着线程交替执行,而对于多核系统,并发即是并行。现代cpu通常对于计算核进行改进,以使得每个计算核可以并行多个线程,如6核12线程,那么每个计算核都可以并行12个线程。而并发则无线程上限,因此不是同时执行。
数据并行:多个线程执行相同任务,将数据分为几组分别在不同线程上进行操作。
任务并行:多个(任务)线程执行不同的操作,分别在不同线程上运行。
用户线程:用户层中的线程,管理无需内核支持。
内核线程:内核层中的线程,由操作系统来支持和管理。
用户线程必须通过一定方式映射到内核线程上。
一对一模型:一个用户线程映射到一个内核线程上,优点是可以提高系统的并发性,因为当一个线程阻塞时,可以运行其他线程。但是不能创建太多线程。
多对一模型:多个用户线程映射到一个内核线程上,优点是可以创建多个用户线程,缺点是不能提高系统的并发性,因此内核线程一次只能调度一个用户线程。
多对多模型:多路复用用户线程到同样数量或更少数量的内核线程。既可以提高系统的并发性,又可以创建多个用户线程。
异步线程:父线程创建子线程后,父线程恢复自身运行,父线程与子线程相对独立,线程间很少有数据共享,因而父线程不需要知道子线程何时终止。
同步线程:父线程创建子线程后,进入等待状态,直到父线程的所有子线程终止,才恢复运行。
多线程带来的问题:在处理并发时,通常采用一个新线程去处理并发的每个任务。这将带来两个问题:1.新线程的创建需要时间,并且当完成任务后,这个创建的线程将终止,不再使用。2.每个任务都采用新线程去处理,却又未限定并发数目,那么线程的数目可能很大,有可能耗尽系统资源&