当前位置: 首页 > news >正文

linux学习之线程

线程概念

  1. 线程是进程内的一个执行分支,是CPU调度的基本单位
  2. 进程是内核数据结构+进程代码和数据

线程理解

  1. 在代码段中,代码在进程中都是串行调用的(不考虑多线程)
  2. 但是进程创建消耗时间和内存,成本高。那么有没有一种方法,可以只创建task_struct,不创建地址空间和页表呢
  3. 如果要设计线程,那么我们的OS也要对线程进行管理。但是Linux因为进程和线程都是执行流,比较相似,所以就用进程来模拟线程,而windows就是分别涉及了数数据结构和算法

在这里插入图片描述4. 我们在调度的时候,不用区分线程和进程,都是执行流。在Linux中,真正在调度的时候,可能是进程也可能是线程。但由于没有具体的线程调度算法。所以,Linux中的执行流是轻量级线程(小于进程,大于线程)

理解地址空间

问题

大家可以想一想:多个执行流是如何在进程地址空间中进行代码划分的?

复习

  1. 内存大部分是以4kb为单位
  2. 动静态库是进行集体编址,以4kb为单位
  3. 磁盘中的可执行程序,写到文件系统里,自然就是4kb

铺垫

  1. 我们一般将内存中4kb的数据块,叫做页框/页帧。这是操作系统进行内存管理的基本单位
  2. 我们想要管理内存中的数据块,创建一个Page结构体。而我们可以创建Page结构体数组,来方便管理

基本结构

  1. 虚拟地址被分为三块。分别是10byte、10byte、12byte
  2. 进程在刚开始加载的时候,不用加载整个页表,只需要根据虚拟地址的第一块来创建页表(一共有1024项,这张表叫做页目录)
  3. 页目录对应的各个二级页表的地址 在查找的时候,先在页目录进行查找
  4. 页表的一个单位是页表项,页表存储的是每一个4kb数据块(也就是页框)的起始地址
  5. 4kb还是太大了,我们要访问4kb中的某个区域,它的地址就是首地址+虚拟地址后十二位(因为2的12次方对应着4kb)这样就能找到每一个地址。虚拟地址的后12位,叫做页内偏移。
  6. 我们还可以在页表中加一些标志位 ,来表示内存数据块是用户用的还是内核用的

结语

下一篇文章会介绍进程控制。

相关文章:

  • Linux网络编程IO管理
  • JLabel设置字体大小颜色背景色
  • Go语言结构体和元组全面解析
  • 代码随想录八股训练营第三十三天| C++
  • 火狐浏览器设置秘籍:让https协议下的ws不加密时运行无阻(WebSocket connection HTTPS)
  • 【个人笔记】VCS工具与命令
  • HashMap中常用的函数
  • SPEC CPU2017的runcpu命令使用
  • Einsum(Einstein summation convention)
  • 30天pandas挑战
  • 面试准备-6
  • 【Qt】qt发布Release版本,打包.exe可执行文件
  • 如何打造高校实验室教学管理系统?Java SpringBoot助力,MySQL存储优化,2025届必备设计指南
  • 手写登录页面,unique_ptr智能指针
  • 项目实战 ---- 商用落地视频搜索系统(7)---预处理二次优化
  • 海事行政执法证照片要求及尺寸格式修改方法
  • 虚幻中的c++(持续更新)
  • JVM 垃圾回收机制:GC
  • 计算机毕业设计 | SpringBoot+vue 游戏商城 steam网站管理系统(附源码)
  • 浅谈Unity协程的工作机制
  • https://app.hackthebox.com/machines/Inject
  • Spring —— Spring简单的读取和存储对象 Ⅱ
  • 渗透测试之冰蝎实战
  • Mybatis、TKMybatis对比
  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • 《谷粒商城基础篇》分布式基础环境搭建
  • 哈希表题目:砖墙
  • Vue 3.0 选项 生命周期钩子
  • 【车载嵌入式开发】AutoSar架构入门介绍篇
  • 【计算机视觉 | 目标检测】DETR风格的目标检测框架解读