Linux中线程的基本概念与线程控制

Linux操作系统中线程

1、进程指的是加载进内存的程序,进程 = 内核数据结构 + 进程代码和数据

2、进程在执行ABCD四个函数时是一个单执行流,而如果想让AB函数和CD函数并发执行**,我们通常会创建一个子进程,但这意味着需要创建新的进程控制块、进程地址空间、页表,极大的浪费了虚拟地址*****(地址空间)***

**3、Linux为了解决上述的资源浪费问题,规定在创建子进程时只复制其父进程的PCB,并与其它子进程一起共享父进程的进程地址空间以及页表等内容,同时将代码区中的代码进行分块,保证每个子进程的PCB只能看见为其分配好的代码块,这就是****Linux操作系统中多线程的实现方式,****因为这种独特的实现方式,**所以Linux操作系统中的线程也叫做轻量级进程

4、因为一个进程在执行其代码块中的内容时被看作是一个执行流,所以一个线程***(轻量级进程)也可以被视为一个执行流(完整的执行流需要PCB、进程地址空间、页表、代码和数据,这些内容线程都有只不过可能是借用了进程的部分内容,并且还对代码块做了限制让每个线程看到的函数都不一样,每个线程都会去执行被分配好的代码块中的内容)* 因此一个进程中会有至少一个执行流,综上所述:** 线程 <= 执行流 <= 进程

5、在Linux的中讨论多线程就是讨论一个进程中到底有几个执行流,即在Linux中线程就是进程中的执行流***(而不是Windows或者理论中的那样,完完全全是不同的两个内容)***

6、Linux中的多线程与理论上的多线程的实现方式不同***(Windows中的线程设计是符合理论的),是因为Linux的设计者认为设计线程就要设计线程控制块(新的数据结构TCB)以及与线程相关的调度算法,但进程和线程实际上具有很高的相似性(上图所示)***,没必要单独设计数据结构和调度算法

**结论:**在Linux操作系统中,CPU在调度PCB时不关心该PCB是进程的还是线程的只负责调度,因为在CPU看来它们都是不同执行流中的PCB,故可以说进程是系统分配资源的基本单位,而线程是进程内部的一个执行分支,是CPU调度的基本单位

pthread_create函数

#include <pthread.h>

int _create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

多执行流代码划分

基本概念:大部分操作系统每次都是以4KB大小为基本单位(或4*n大小)对内存进行管理的,磁盘中的数据加载到内存时也是以4KB大小为基本单位,我们叫

线程的理解

页表与页框

线程控制

~over~

相关推荐
道可到几秒前
字节面试 Java 面试通关笔记 03| java 如何实现的动态加载(面试可复述版)
java·后端·面试
聪明的笨猪猪2 分钟前
Spring Boot & Spring Cloud高频面试清单(含通俗理解+生活案例)
java·经验分享·笔记·面试
LoveXming8 分钟前
Chapter9—享元模式
java·c++·设计模式·享元模式·开闭原则
Dontla14 分钟前
Next.js项目演示(从零创建Next.js项目)Next.js入门实战
开发语言·javascript·ecmascript
eqwaak014 分钟前
科技信息差(9.29)
开发语言·科技·学习·算法
聪明的笨猪猪18 分钟前
Spring MVC高频面试清单(含通俗理解+生活案例)
java·经验分享·笔记·面试
失因19 分钟前
Docker 容器与镜像
java·运维·spring cloud·docker·容器
guigu201231 分钟前
C++ 面向对象进阶:继承深化与多态详解
开发语言·c++
双普拉斯32 分钟前
Spring WebFlux调用生成式AI提供的stream流式接口,实现返回实时对话
java·vue.js·人工智能·后端·spring
Mr Aokey35 分钟前
从零开始学RabbitMQ:Java实战简单模式与工作队列消息处理
java·rabbitmq