行业知识
011 Linux
前言
���文将会向你介绍线程的概念,以及线程是怎么被创建的
线程概念
一、进程是承担系统资源的基本实体,线程是cpu调度的基本单位
首先,地址空间在逻辑上相当于进程的资源窗口, 每个进程都有这样一个资源窗口。通过地址空间+页表获取自身的代码和数据
那么有没有可能创建一个“进程”只需要创建一个pcb进程控制块即可?(以前创建进程,需要创建地址空间,页表,建立映射关系等等)
只需要创建一个pcb和父进程指向同一个地址空间的起始位置 注定了每一个“进程”看到的是同一个资源窗口(包括主进程,再创建几个进程,每个pcb都指向同一个地址空间,这意味着每个进程都能看到同一份“资源”),把代码拆成几个部分,把该共享的共享,不该共享的每个“进程”各一份,每个"进程"只会执行一部分代码其实后续创建的每一个“进程”就是linux给出的线程的概念
每一个执行流占一份,每个执行流只需要占页表的一部分,就可以看到每一个区域不同的资源块
创建线程的量级明显比创建进程的要低, 创建进程要从0创建,pcb地址空间构建各种映射关系,页表,加载代码和数据,动态库也要加载,初始化各种代码和数据等等
创建线程只需要创建个pcb,并没有过多的资源申请,线程是参与资源分配的
LInux中线程的实现方案
操作系统只给线程是什么,特征是什么
具体一款os,无论底层怎么实现,只要符合给出的线程概念,就是线程,在教材里只给出线程的特征,但并不给出怎么实现线程,需要各个平台去实现符合概念的线程
(就好比不管你读的哪个大学,读的清华,还是北大,都是大学生)
综上所述:
1.线程创建更简单,
2.线程在进程的地址空间中运行(在进程内部中运行) 主进程创建时,申请地址空间,页表等等资源等到后续再创建线程时,就只需要创建一个pcb即可指向同一个地址空间,分配其中的资源,因此线程在进程的地址空间中运行
想必第一点你已经理解了,线程的创建更加地简单
那么第二点该如何理解呢?
从前的进程:内部只有一个执行流(红色框内的表示进程)
现在的进程(进程=内核数据结构+代码和数据):内部有多个执行流(整个红色框内表示一个进程)
其中第一个线程表示的是主线程
因此回到开头,进程(整个红色框所包含的)是承担系统资源的基本实体,而线程(一个个task_struct)是cpu调度的基本单位
往后cpu看到一个pcb就执行该pcb的方法,方法只需要能在地址空间上被分配资源,cpu就执行进程代码的一部分,访问进程数据的一部分
因此真实在cpu上真实跑的执行流(轻量级进程—线程)就比传统进程的量级要低一些
线程的创建
功能:创建一个新的线程
原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void * (start_routine)(void), void *arg);
参数:
thread:返回线程ID attr:设置线程的属性
attr为NULL表示使用默认属性
start_routine:是个函数地址,线程启动后要执行的函数
arg:传给线程启动函数的参数 返回值:成功返回0;失败返回错误码
绝大多数函数的名字以“pthread_”打头的函数
要使用这些函数库,要通过引入头文件 链接这些线程函数库时要使用编译器命令的“-lpthread”选项
#include #include #include #include int gcnt = 100;//新线程void *ThreadRoutine(void *arg){ const char *threadname = (const char *)arg; while(true) { std::cout pthread_t tid1; //实际上pthread_t就是无符号长整形 //创建线程1 pthread_create(&tid1, NULL, ThreadRoutine, (void*)"thread 1"); sleep(2); //主线程 while(true) { std::cout const char *threadname = (const char *)arg; while(true) { std::cout pthread_t tid1; //实际上pthread_t就是无符号长整形 //创建线程1 pthread_create(&tid1, NULL, ThreadRoutine, (void*)"thread 1"); sleep(2); pthread_t tid2; //创建线程2 pthread_create(&tid2, NULL, ThreadRoutine, (void*)"thread 2"); sleep(2); pthread_t tid3; //创建线程3 pthread_create(&tid3, NULL, ThreadRoutine, (void*)"thread 3"); sleep(2); //主线程 while(true) { std::cout