1:进程有独立的地址空间 linux为每个进程创建task_struct(内核空间)任务结构体 关于进程的系统数据有PCB,进程控制块,各种寄存器的值和堆栈等 2:进程在切换时系统开销大。cache高速缓存,静态ram,cache分指令cache和数据cache,tlb页表,进程切换时都要刷新 同一进程中的线程共享相同的地址空间,linux不区分进程线程,都认为是一个任务 线程:大大提高了任务切换的效率,避免额外的TLB 和 cache的刷新
3:一个进程中的多个线程共享以下资源 ? 可执行的指令 ? 静态数据 ? 进程中打开的文件描述符 ? 当前工作的目录 ? 用户ID,用户组ID 4:线程私有的资源 ? 线程ID TID ? PC程序计数器和相关寄存器 ? 堆栈 ? 错误号errno ? 优先级 ? 执行状态和属性
同步:多个任务按照约定的先后次序互相配合完成一件事 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。 5:信号量 ?P操作 申请资源 ?if(信号量的值大于0){申请资源的任务继续运行;信号量减一} ?else {申请 ? ? ? ?资源的任务阻塞;} ?V操作 释放资源 ?信号量的值加一; ?if(有任务在等待资源){唤醒等待的任务,让其继续运行} ?无名信号量(基于内存的信号量),进程内部线程之间 ?有名信号量,都可
查看线程 PS aux -L |grep xxx 临界资源:一次只允许一个任务访问的共享资源 临界区:访问临界区的代码 剩下的就只剩各种函数了,关于函数的用法不在本章记录
6:进程和线程的区别 ? 1)进程是资源分配最小单位,线程是程序执行的最小单位; ? 2)进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地址空间,它使用相同的地址空间共享数据; ? 3)CPU切换一个线程比切换进程花费小; ? 4)创建一个线程比进程开销小; ? 5)线程占用的资源要?进程少很多。 ? 6)线程之间通信更方便,同一个进程下,线程共享全局变量,静态变量等数据,进程之间的通信需要以通信的方式(IPC)进行;(但多线程程序处理好同步与互斥是个难点) ? 7)多进程程序更安全,生命力更强,一个进程死掉不会对另一个进程造成影响(源于有独立的地址空间),多线程程序更不易维护,一个线程死掉,整个进程就死掉了(因为共享地址空间); ? 8)程对资源保护要求高,开销大,效率相对较低,线程资源保护要求不高,但开销小,效率高,可频繁切换; ?? 7:什么时候使用线程什么时候使用进程 ? 1、需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的 ? 2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应 ? 3、因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程; ? 4、并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求; ? 5、需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。
|