线程和进程的区别
在操作系统中,进程是提供程序运行资源的最小单位,而线程是调度这些资源的最小单位,也称作该进程的执行流.
在一个进程运行时,它的地址空间和另一个进程是独立的.也就是说他们的资源是独有的,一个进程在正常情况下是看不见另一个进程的资源的(除了进程通信)
而在一个进程内部的多个线程,他们是运行在一个地址空间范围内的,所以它们可以看见和共享 进程 提供的资源
所以操作系统创作一个进程,至少给它分配一个线程(执行流)
Linux下的线程
在Linux下并没有提供关于线程数据结构,但我们知道操作系统给一个进程分配的PCB是task_struct的结构体;
但其实Linux系统下的进程是一种轻量级进程(LWP), 它的task_struct结构体关键字段如下
{
pid_t pid;
pid_t tgid;
struct task_struct *group_leader;
struct list_ehad thread_group;
}
其中 pid其实是执行流的 ID号,也就是线程的ID号
而 tgid 是这一组的执行流共有的ID号,实际反应的是个进程的ID号
我们调用 系统调用 getpid();时返回的其实是tgid(执行流共有的ID)
当一个进程中只有一个执行流时, 显然pid的值就等于 tgid
就会给我们一种 调用getpid()就是task_struct 中的 pid 错觉
我们可以使用 gettid() 获得线程的 pid;
多线程和进程的优缺点
优点
1.多线程可以实现进程的并发执行
假设一个进程内只