内部:线程在进程的地址空间内运行执行分支:CPU调度的时候,只看PCB中每一个PCB曾经被指派过的执行方法和数据,CPU可以直接调度进程的一部分:struct tcb{ };TCB,而是用进程的PCB来模拟线程不用维护复杂的进程和线程的关系,不用单独为线程设计任何算法,直接使用进程的一套相关的算法,OS只需要聚焦在线程间资源分配就可以了。
task_struct,共享同一个进程地址空间,将当前的资源(代码+数据),划分成若干细小份,让每个task_struct使用创建进程的成本是非常高的,成本——时间+空间,创建进程要使用的资源是非常多的。我们可以从内核视角看这两者区别:
内核视角:
进程:是承担分配系统资源的基本实体!
线程:是CPU调度的基本单位,承担进程资源的一部分实体,进程会划分资源给线程!
Linux下的PCB <= 传统意义上的进程PCB,Linux线程也叫做轻量级进程(Light Weight Process)
从这两个角度可以看出:
Linux因为是用线程模拟实现的,复用了很多进程的代码和逻辑,所以Linux下,不会给我们直接提供操作线程的接口函数,而是提供给我们在同一个地址空间内创建PCB的方法,分配资源给指定的PCB的接口,但是这些接口从刚设计出来,对用户很不友好!(需要创建线程的接口,释放线程的接口,等待线程的接口等等),工程师对Linux轻量级进程接口进行封装,打包成库,当用户直接使用库接口——原生线程库(用户层)
所有的轻量级进程(可能是“线程”),都是在进程内部运行(内部指的是地址空间)
地址空间能够标识进程所能看到的大部分资源!
进程之间具有独立性,可以有部分共享资源
进程共享资源如下:
线程大部分资源是共享的,可以有部分资源私有(例如:栈、上下文数据)。
同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
优点:
ps:
计算密集型:加密、大数据运算等→主要使用的CPU资源
I/O密集型:网络下载、云盘,ssh、在线直播,看电影等→主要使用内存和外设的IO资源
缺点:
#include
#include
#include
void *thread_run(void* args)
{
const char* id=(const char*)args;
while(1)
{
printf("我是%s线程,%d\n",id,getpid());
sleep(1);
}
}
int main()
{
pthread_t tid;
pthread_create(&tid,NULL,thread_run,(void*)"thread 1");
while(1)
{
printf("我是main线程,%d\n",getpid());
sleep(1);
}
return 0;
}
makefile
mythread:mythread.c
gcc -o $@ $^ -lpthread
.PHONY:clean
clean:
rm -f mythread
结果展示:

现象说明:
此时依旧是只有一个进程,但是进程内部有两个执行流
指令:ps -aL
用于查看轻量级进程
Linux调度时是看的PID还是LWP?
LWP
如何理解我们之前单独一个进程的情况?
PID==LWP
