Linux相关概念和易错知识点(27)(认识线程、页表与进程地址空间、线程资源划分)

27、Linux 进程与线程:深入解析与实践 本文深入解析了Linux中进程与线程的设计与实现,对比了将RTOS任务移植到Linux时的两种极端方案:任务映射到进程和任务映射到线程的优缺点。文章详细介绍了进程的创建、终止、运行不同程序的方法,以及守护进程的实现方式。同时,全面探讨了进程间通信(IPC)的各种机制,包括基于消息的通信(如Unix套接字、FIFO、POSIX消息队列)和基于共享内存的通信,并提供了示例代码和流程图,帮助开发者根据实际需求选择合适的方案,以提高系统的性能与稳定性。 阅读详情

目录

1.认识线程

(1)进程与线程的关系

(2)最小执行流

(3)轻量级进程(LWP)

①对task_struct的理解

②轻量级进程

③LWP和TCB的区别

2.页表与进程地址空间

(1)页表的结构

①虚拟地址和物理地址的作用

②页框和page

③多级页表

a.第一级:页目录

b.第二级:页表

c.第三级:页内偏移量(严格意义上不算一级)

④多级页表的作用

(2)虚拟地址 -> 物理地址的过程

(3)懒加载和缺页中断

(4)MMU和快表(TLB)

(5)高速缓存cache和局部性原理

(6)线程的优缺点

①优点

②缺点

3.线程资源划分

(1)代码块

(2)其它独立资源


1.认识线程

(1)进程与线程的关系

一个进程是为了完成一整个任务,而线程是完成这个任务的最小执行单位。以一个直观的说法,宏观上看这个进程是一个公司,这个公司里面有人力、资源等,就像进程那样掌管着进程地址空间。这个公司存在的使命就是完成一个大型项目。要完成一个大项目,还需要有员工分工,这些员工就是线程。每个员工作为最小执行单元完成分配给自己的子任务,期间公司会给这些员工分配资源(如电脑、办公桌),对应起来就是进程给线程分配资源(如进程地址空间的划分)。

我们前面之所以感受不到线程是因为我们创建的都是单(多)进程单线程,但除此之外还有单(多)进程多线程等待我们学习。

(2)最小执行流

进程是一个执行起来的程序,它是承担分配系统资源的基本实体,它承担完成任务的使命,但并不是进程直接去处理任务,它只负责分配资源,处理任务需要交给线程。线程就是执行流,执行粒度比进程要更细,是进程内部的一个执行分支。

就好比工人和它们小组长的关系,组长需要向上(系统)交代,完成一整个任务,但并不是组长去完成这一整个任务,它不会直接参与,而是会把任务拆开分配给工人,让工人去做。整个过程中组长就是进程,而工人就是线程,相对整个产业来看,工人又是最底层最基础的劳动力,因此线程被称为最小执行流,线程是OS调度的基本单位。

这个时候我们就发现之前我们对进程的理解只停留在对小组长进行交流,很局限,而学习线程我们可以进一步去管理工人。

(3)轻量级进程(LWP)

①对task_struct的理解

如果Linux支持线程,那么线程就必须要被OS管理,这会创造TCB(T指的是Thread,TCB和PCB相对应)这个数据结构,和PCB同时存在于系统之中,对Linux设计者来说这太复杂。

线程的本质是在进程内部运行,且粒度要更细。Linux下的线程是用进程模拟实现的,复用了历史代码。

在Linux中,task_struct不再简单代表PCB,同一个进程可以有多个task_struct,我们可以简单认为一个task_struct对应一个线程。一个进程地址空间里面所有的task_struct都属于一个进程。之前我们直接让PCB和task_struct划等号,是因为我们之前遇到的都是单线程,一个进程要有task_struct,但从来没说只有一个。task_struct描述的是执行流,task_struct里面拥有一个线程需要的页表、分配的地址空间的描述。

一个进程的所有线程共享同一进程地址空间,同时代码区也被肢解分给不同线程执行,即线程在进程的地址空间内运行。

②轻量级进程

线程直接进程的资源用,相对而言进程就需要承担开辟资源的责任。我们已经知道task_struct是用来描述线程的了,它在一定程度上相当于TCB(但不等于,这点很重要)。但真正的PCB在哪呢?实际上,Linux里不存在真正意义上的PCB,而是当前进程下所有task_struct的总和描述了一个PCB等效的信息,这也是task_struct和TCB不同的点。

站在系统角度来看这个进程,没有专门管理整个进程的PCB,而是众多task_struct中的其中一个。在Linux中,task_struct既不是TCB,也不是PCB,其对应的线程也被统一称为轻量级进程LWP。

在这里,我们需要严谨的区分一个概念了。由于Linux下的task_struct不是TCB,那么用它来描述的虽然可以被称为线程,但从严谨的角度出发Linux中没有真正意义上的线程,因为线程的概念及其管理的数据结构TCB是用task_struct模拟实现的,task_struct和TCB是有区别的。

③LWP和TCB的区别

接下来我们需要回答两个问题,多个LWP是如何结合起来描述一整个PCB的等效信息呢?还有为什么LWP不能称为TCB呢?

最关键的一点是同一进程的所有task_struct共享一套进程地址空间mm_struct。虽然实例化出了多个task_struct数据结构,但它们的mm_struct指向同一块空间,它们的进程地址空间的划分并不独立,而是耦合的。也就是说,当我们修改其中一个task_struct里面描述进程地址空间的信息时,其它task_struct的相关信息也会更新。同样的,所有task_struct的页表是一样的,映射位置都一致,但由于空间划分的耦合,正常情况下读写内存不会冲突。

因此,task_struct和TCB存在一定的区别,TCB并不侧重于资源的共享,而task_struct之间互相耦合,最终也描述了PCB应该描述的信息,因此不需要专门存储一个PCB了。这样一来就能回答上面两个问题了,这也是为什么Linux中的线程要被叫做轻量级进程,其根源也是task_struct的特殊性。

例如:对于3线程的进程来说,整个进程有3个task_struct,也就是有3个LWP,这三个task_struct共同完成了对整个进程以及进程内线程的全面描述。

注意:LWP是轻量级进程,代表的是一个实体。而task_struct不叫LWP,只是描述和管理LWP的数据结构。同理,task_struct也不完全等同于PCB或者TCB。

2.页表与进程地址空间

(1)页表的结构

①虚拟地址和物理地址的作用

不同进程有不同的生命周期,这会导致物理内存可能有碎片。虚拟地址将不连续的物理地址转换成连续的,并且实现了系统层面和硬件的解耦合。

②页框和page

物理内存和文件都是以4KB的数据块划分的,通过块内的碎片减少块间的碎片,用空间换时间。

物理内存将划分好的4KB的数据块叫做页框,所有内存都被划分多个页框。

哪一个页框要刷新,哪些页框被用了?OS要对内存进行管理,管理方式就是对页框先描述再组织。这个描述页框的结构体就是struct page。

page里面有位图unsigned long flags,1表示该页框被使用。一个约40字节的page描述一个4KB的页框。OS还会维护一个struct page* mem_map[N]用来管理众多的page,用数组增删查改来管理内存。类似于偏移量,物理地址和mem_map之间能相互转换。物理地址 = mem_map下标 * 4KB,下标 = mem_map物理地址 / 4KB。OS只需要知道下标就能找到对应的page,进而获取页框的使用情况。这个转换过程通过位操作就能实现,这里不展开。

4GB内存的管理需要一百多万个page,一个page大概40B,所有page的占用空间不超过40MB,大概千分之一的空间被占用,不算严重。对于现在普遍的16GB、32GB电脑,同样占用很小。因此用page来管理页框的占用比较合理。

③多级页表

page利用了位图大大压缩了空间占用,仅需1bit就可标志1B的使用情况。但页表就没这么好压缩了。页表左侧为虚拟地址,右侧为物理地址,页表一行就算不计入标记位都至少要8B,而这8B仅描述了1B的地址映射,显然这要占很大的空间,比存数据的内存都要大了。因此我们接下来要用多级页表来解决这个问题。

下面以一个指针4字节(32位系统)的标准来介绍

当拿到虚拟地址之后,32bit会被拆为10、10、12三份,经过三级找到对应的物理地址。

a.第一级:页目录

页目录表里面有1024项,虚拟地址的高10位会作为页目录表的下标匹配对应项,而下标对应的某一项存的内容叫页目录表项,是该虚拟地址对应的物理地址的高10bit,同时这个物理地址会指向下一级页表的物理地址的起始位置,这个起始位置的物理地址高位就是页目录表项存的值,低位为0。

例如:

0111010101 0101001010 101011010101会在页目录表中找到下标为0111010101对应的项,这个项里面存的是对应物理地址的高10位,为0010110101,之后会到下一级页表中查找,这个页表的物理地址就是0010110101 0000000000 0000000000。

b.第二级:页表

由上级页目录表项指向,每个页表1024项,由虚拟地址的中间10bit作为下标匹配,对应项存的内容叫页表项,同样标记了转换后的物理地址的中间10bit。同理,这个物理地址会继续指向下一级的物理地址的起始位置,高20位已确定,低12位自动补0。

同样是刚才的例子:

在物理地址为0010110101 0000000000 0000000000的页表中,虚拟地址的中间10位0101001010作为下标查找该表,得到的项的内容为0011010111。至此,得到的物理地址为0010110101 0011010111,接下来要继续向下一级查找,这一级的起始物理地址为0010110101 0011010111 0000000000。

c.第三级:页内偏移量(严格意义上不算一级)

转换的物理地址的高20位我们已经得到了,还剩下12bit,12bit的地址能够标识2 ^ 12bit数据(即4KB)。也就是说,一个页表项里存的值结合之前获得的地址可以标识内存中的一个具体的页框的起始地址,剩下的12bit就是以页框为起始地址的偏移量。也就是说,32位系统下最后12bit的虚拟地址就是物理地址的最后12bit,这里所谓的第三级其实并不存在,只需要两级页表即可转换虚拟地址为物理地址。

接着刚才的例子:

找到0010110101 0011010111 0000000000对应地址,这就是某一个页框的起始地址。虚拟地址101011010101会作为该页框的偏移量。至此,虚拟地址能够转为物理地址0010110101 0011010111 101011010101。

④多级页表的作用

当系统拿到虚拟地址要转换为物理地址时,它必须采用多级页表,否则页表占用空间会非常大。在32位系统下,多级页表其实只有两级,上面也说了页内偏移量不需要访问任何空间,不算做一级。每一级都开辟1024块空间,按每项4字节,页表总大小在1024 * 1024 * 4 = 4MB左右,完全处于可用状态。另外一个进程不可能使用全部地址,意味着页表一定是不完整的,所以一个页表远远小于4MB。

(2)虚拟地址 -> 物理地址的过程

在了解多级页表的转换之后,我们再次从头到尾梳理一次系统是如何进行地址转换的。

我们程序的每一条指令都有其虚拟地址,在执行某一指令前,要先从虚拟 -> 物理地址,获取到内容后才能交给CPU处理。在CPU中,寄存器CR3存的是页目录表的物理起始地址,当要开始进行虚拟 -> 物理地址的转换时,CR3会直接找到页目录表的物理地址;寄存器EIP里面存的下一条要执行的指令的虚拟地址。CPU中的硬件MMU就拿着这两个地址,按照多级页表的查找方式转化成物理地址。这是硬件自动完成的,是用硬件电路来完成页表查找的过程。

MMU得到物理地址后就通过系统总线来物理寻址,操作是in / out(根据EIP指令决定)。MMU将其内容交给IR,这就是该指令的内容,之后将由CPU来进一步处理。之后EIP + MMU读到的指令的长度就可以得到下一条指令的地址,循环往复。也就是说,整个进程地址空间的存在,是靠软硬结合实现的。

为什么虚拟 -> 物理地址的转换一定要靠硬件?速度是非常重要的因素,这个工作太高频了,CPU不是外设,不需要IO,集成到硬件就是提升效率最好的办法。

(3)懒加载和缺页中断

我们怎么知道指定页框的使用情况?page可以解决这个问题。我们已经知道mem_map[N]存储了所有物理内存的页框使用情况,且访问效率很高,这就意味着OS可以随时知道物理内存页框的使用情况以及相关属性。另外虚拟 -> 物理地址的过程也很高效,所以OS可以先建立映射关系,即先创建好多级页表,内容均填充,但实际物理内存对应位置不一定要有数据。当访问对应物理内存时可以配合page、标志位即时加载数据到对应页框中。

举个例子,一万个虚拟地址 -> 物理地址映射的页表只加载了一千个页框的数据,当访问的地方没有加载时,就会触发错误软中断去进一步加载内容,这就叫缺页中断。

有个问题,如何区分缺页中断和越界访问呢?只需页号合法性检查即可,页表中有映射地址就是缺页中断,物理地址在不在映射范围内就是越界。

理解之后,我们还能进一步理解new和malloc的操作。

new只需要申请虚拟地址空间,维护好页表的映射关系,但是命中标志位设置为0。当使用该空间时OS才会中断,申请空间,就像懒加载那样。程序中申请内存的本质就是申请虚拟内存 + 修改页表映射,而不会真正开辟空间,这实现了进程管理和内存管理解耦。

(4)MMU和快表(TLB)

MMU用于虚拟地址 -> 物理地址转换,若MMU转换时发现对应位置的权限不允许,就会报错,这会存储到寄存器中并作为进程的上下文数据,当进程调度时会检查该寄存器,并发送信号终止程序,这也是权限越界导致程序崩溃的原因。

快表也叫转译后备缓冲器,MMU转换地址后会将已访问的物理地址历史记录存到TLB中,后续所有转换操作都会先到TLB找,如果表中没有再到多级页表中查找,并记录到TLB中,快表的出现可以加速寻址,提高转换效率。

(5)高速缓存cache和局部性原理

CPU有自己的高速缓存cache,cache缓存的的是代码块和数据块,区别于TLB缓存的是虚拟地址到物理地址的映射关系。当要取得虚拟地址对应的数据时,MMU会先到cache中找,找到了就放到IR中。如果没找到就会根据多级页表或者TLB访问物理内存,并一次性将大量代码和数据缓存。

例如我们需要10bit数据,OS就有可能缓存20B到cache中,这取决于CPU硬件设计。

TLB和cache都是虚拟地址 -> 物理地址并读取数据过程的产物,TLB用于地址的转换,cache用于快速读取数据。cache缓存有意义吗?这离不开局部性原理。

cache是基于概率的,当我们访问一块代码时,我们就很有可能访问附近的代码,这就叫局部性原理。cache的本质是预加载,效率的提高离不开预加载(局部性原理)。在更大的角度上讲,局部性原理适用于所有缓存,例如内存就是CPU和外设的缓存。

对于多进程来说,进程间切换时cache也会同时失效,而线程切换不会失效,因为同一进程下所有线程共享同一块代码段,cache存的数据都是有意义的。因此,线程的效率相对进程而言更高。同样,线程切换时页表、TLB也不会切换,这也会增加虚拟地址到物理地址的转换效率,只要切换进程,页表、TLB、cache全部都无效了。

(6)线程的优缺点

①优点

创建线程的代价比创建进程小,占用的资源少。

切换线程的成本消耗少,页表、TLB和cache都能延用,而不像进程那样需要重新加载。

等待慢速IO时可以执行其它计算任务,在IO密集型应用中提高性能。除此之外还能将IO操作重叠,不同线程可以等待不同IO,这能充分利用多处理器的可并行数量。

在多处理器系统上运行计算密集型应用,可以将计算分给多个线程实现,提高效率。注意线程个数不是越多越好,当线程个数过多,计算问题就会转为线程的调度问题,导致切换成本高。推荐的线程个数是CPU的物理个数 * 核数。

②缺点

性能损失(调度消耗),健壮性降低,缺乏访问控制(某些OS调用会对进程造成影响),编程难度提高。

更重要的一个特性是,一个线程崩溃会导致整个进程崩溃。线程是进程的执行分支,线程干的就是进程干的。在OS看来触发错误并中断程序是直接作用于整个进程的,线程不过是进程下面打工的。只要CPU对应寄存器有标志了,OS会直接杀掉所有线程。

3.线程资源划分

(1)代码块

每一个线程执行自己的任务都是以函数为入口的,每一个函数都有一个入口地址,函数代码紧接着入口地址且函数的代码块是连续编址的。这就是说不同线程划分的资源本来就是分离的,不需要进一步处理。可以理解为,线程瓜分函数代码的途中就将进程地址空间的代码段分成了不同的独立的部分。

(2)其它独立资源

进程是资源分配基本实体,线程是资源调度的基本单位。在同一个进程中,线程共享进程数据,也就是说数据都能被所有线程访问到(代码段和数据段),这和进程的独立性有很大的区别。但相对而言线程也有自己的独立的数据:线程ID、一组寄存器(用于存储线程的上下文数据)、栈(独立栈,局部性的互不影响)、errno、信号屏蔽字、调度优先级。其实进程地址空间中有自己独立的空间,但这空间不是私有的,虽然进程将不同空间分块,但其它线程也可以互相访问,只要拿到相应的地址即可,这也带来了一定的风险。

SQL基础:HQL之常用的行列转换应用总结 行列转换是数据开发者的基本技能,也是面试重点,在数据开发中处处可见,本文对常见的几种情况进行了总结,包括了多行转多列,多行转单列,多列转多行,单列转多行的几种情况,并给出了解决思路和方法,读者可根据本文给出的思路灵活应对业务中遇到的问题。 阅读详情

相关推荐

Python爬虫实战:抓取天气数据并生成可视化图表(完整可复制代码)

工具/库核心作用选型理由requests发送HTTP请求,获取天气网页内容语法简单,上手快,支持Headers配置(反爬)解析HTML页面,提取目标天气数据无需懂复杂XPath,API直观,快速定位标签pandas数据清洗、整理(如日期/温度格式化)一键处理数据格式,与matplotlib无缝适配matplotlib生成可视化图表(折线图/饼图/柱状图)Python主流可视化库,定制性强,支持保存高清图生成随机User-Agent,应对反爬自动更新UA池,避免手动维护。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 909

Linux线程初识(27)

进程和线程真是一个经典的概念,我们要来好好学习它哎,感觉时间总是不够用!!大家继续加油!!将一份代码成功编译后,可以得到一个可执行程序,程序运行后,相关代码和数据被 load 到内存中,并且操作系统会生成对应数据结构(比如 PCB)对其进行管理及分配资源,准备工作做完之后,我们就可以得到一个运行中的程序,简称为 进程,对于操作系统来说,光有 进程 的概念是无法满足高效运行的需求的,因此需要一种执行粒度更细、调度成本更低的执行流,而这就是 线程但是可以说,这样子是比较模糊的,不急,我们接下来继续讲解。

tan180°的博客 973

从永恒之蓝看内网安全:企业如何用Nmap+MSF快速检测445端口风险

本文探讨了企业如何利用Nmap和Metasploit快速检测445端口风险,防范永恒之蓝(MS17-010)漏洞攻击。通过分阶段检测流程和自动化工具组合,企业可高效识别内网风险主机,并实施紧急隔离与长效防护策略,提升整体网络安全防护能力。

weixin_30772105的博客 599

Linux相关概念和易错知识点(39)(URL、HTTP)

应用层协议是很多的,且大多都有现成方案了,因此可以满足用户不同的需求,其中最具代表性的就是HTTP协议。HTTP超文本传输协议(无连接、无状态)定义了客户端(如浏览器)和服务器的通信,是客户端和服务器通信的基础。HTTPS主要就是多了一层加密。HTTP是基于TCP的,具有收发完整性(TCP保证可靠传输,有相应的重传机制等)。什么叫做基于TCP?当客户端和服务器建立连接时采用的就是TCP,相互发数据也都是遵循TCP的规则来的,和普通的TCP通信没什么区别。不同之处在于而。

SGlow0708的博客 1508

浮点数运算的陷阱与启示:FP16加法器/乘法器开发中的常见误区

本文深入探讨FP16加法器和乘法器开发中的常见误区,包括FP16格式解析、阶码对齐陷阱、尾数运算风险及规格化处理。通过Verilog实战代码展示防御性编程技巧,帮助开发者避免边界条件处理和异常状态管理中的错误,提升硬件设计的可靠性和效率。

dell8的博客 250

WorkBuddy Skill赋能HYSYS与Comsol:AI工作台下的仿真自动化实践

AI Agent正将工业软件自动化带向新高度。在工程仿真领域,流程模拟与多物理场分析常因重复性操作而效率低下,Aspen HYSYS的批量工况调整、Comsol的参数扫描与网格重构均属此类。WorkBuddy这类AI工作台通过Skill将软件二次开发能力封装为可插拔技能包,利用HYSYS的COM/OLE接口和Comsol的Java API,实现自然语言指令到自动化执行的转变。其技术价值在于降低自动化门槛、沉淀工程经验,并支持日志审计与异常重试。在实际应用中,无论化工流程的灵敏度分析,还是激光焊接、移动网格等

weixin_29055699的博客 299

Linux——僵死进程及地址空间

当fork一个新进程的时候,子进程一般会和父进程同时运行。当子进程结束的时候,它与父进程的关联还会保持,直到父进程也正常终止或者wait,子进程才结束。因此,进程中代表子进程的表项不会立即释放。虽然子进程已经不能正常运行,但是它仍然存在于系统之中,因为它的退出码还要保存起来,以备父进程今后的wait调用使用。这种情况我们称已经结束了但是还不能释放的子进程为僵尸进程。简而言之,就是子进程先于父进程结束,父进程没有获取子进程的退出码,那么子进程就变成僵死进程。

m0_74774362的博客 968

微信小程序中蓝牙打印机中文编码处理:使用iconv-lite库

本文介绍了微信小程序集成蓝牙打印机时中文乱码问题的解决方案。由于打印机通常仅支持GBK/GB2312编码,而小程序使用UTF-8,导致中文显示异常。通过引入轻量级iconv-lite库进行编码转换,可高效解决该问题。文章详细说明了从库安装、编码转换到蓝牙发送的实现步骤,并提供了完整代码示例。关键注意事项包括编码验证、分段发送和兼容性测试。该方法经实际验证,能有效保障中文打印的准确性,适用于零售、物流等场景。

canglingyue的专栏 1310

Linux进程(三)---深入理解进程地址空间

本文章非常深入讲解了Linux进程地址空间,包括进程地址空间本质是什么,是如何产生的,为什么要有地址空间,和物理内存的关系等等,一步步引导读者,从一些现象逐渐引出一些问题,进而对问题进行有针对性地讲解。比较深入.

weixin_47257473的博客 724

【实战技巧】matplotlib中文标签显示问题的3种高效解决方案

本文详细介绍了解决matplotlib中文标签显示问题的3种高效方法,包括修改字体设置、临时指定字体和修改后端配置。针对不同操作系统和环境提供了实用技巧,帮助开发者快速解决中文显示为方框的常见问题,提升数据可视化效果。

weixin_30855099的博客 170

哨兵1号后向散射系数土壤水分反演

打开之前预处理之后的VH和VV极化的后向散射系数转存的tiff文件。

所有专家都曾始于新手 3293

【嵌入式软件工程师面经】Linux多进程与多线程

准备多线程和多进程的面试问题时,深入理解每个问题的核心概念以及它们在实际系统中的应用是非常重要的。实际场景中的问题通常比理论上更为复杂,因此理解如何在特定的上下文中应用这些概念至关重要,当准备这类面试问题时,最好的方法是结合理论知识与实践经验,尝试举一些实际应用中的例子来展示你如何解决多线程和多进程相关的问题。此外,理解Linux内核的工作原理和相关的系统调用也非常重要

嵌入式技术开发 2253

实战封神!YOLOv7 轻量化部署全攻略:ONNX格式转换+TensorRT极致加速(速度直接提升3-5倍,精度无损)

部署核心链路,这是YOLO系列部署的最优解,速度提升3~5倍,精度无损;ONNX是桥梁:解决模型兼容性问题,简化后能去掉冗余节点,是TensorRT加速的前提;TensorRT是核心:NVIDIA显卡的极致加速引擎,FP16量化是速度与精度的最优平衡,无需手动配置,一键开启;轻量化终极组合YOLOv7-tiny + 416尺寸 + TensorRT FP16,速度提升5~8倍,满足所有实时检测场景;避坑核心:转换参数必加,推理尺寸必须一致,engine文件显卡专属。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 308

线程的相关概念,线程与进程的区别,如何进行多线程编程以及如何使用互斥锁

线程的概念,线程与进程的联系,多线程编程和互斥锁的使用。

yohe12的博客 426

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

linux进程概念【万字解析,深度刨析linux底层系统】

计算机管理硬件描述起来,用struct结构体组织起来,用链表或其他高效的数据结构。

qq_54626677的博客 1998

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

操作系统核心概念:进程、线程与内存管理深度解析

操作系统作为计算机系统的核心管理者,通过进程与线程机制实现任务调度和资源分配。进程作为资源分配的基本单位拥有独立地址空间,而线程作为CPU调度单位共享进程资源,二者的协同工作构成了现代计算的基础。在Linux系统中,写时复制(Copy-On-Write)技术显著提升了进程创建效率,而协程(gouroutine)等轻量级线程进一步降低了并发编程的开销。内存管理方面,多级页表与TLB的配合实现了高效的虚拟地址转换,同时Valgrind等工具帮助开发者检测内存泄漏问题。理解这些核心概念不仅能提升系统设计能力,也是

weixin_30235225的博客 355

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

学习系统编程No.27【深入信号处理】

详解用户态和内核态,重谈地址空间,介绍sigaction接口,进程调度等问题

狂小伍的博客 2953

linux——线程

Linux——线程

m0_72165281的博客 1407

嵌入式学习 D27:系统编程--进程

c库函数,会执行io库的清理工作,关闭所有的流,以及所有打开的文件。5)进程上下文切换:就是值指调度器要切换CPU给另一个进程的时候,要保存当前进程的状态,然后加载打开一个新的进程这样的一个过程。(单调函数,进程结束,但清理的相对较少)2)稳定性:如果一个进程发生错误,通常不会影响到其他进程,这提高了系统的稳定性。2)内核主要功能之一就是完成进程调度, 硬件,bios,io,文件系统,驱动;(4)子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同(子的id比父大)。

weixin_72737907的博客 1657

【Linux】27.Linux 多线程(1)

它不会给我直接提供线程的系统调用,只会给我们提供轻量级进程的系统调用。线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出。得到的这个数实际上是一个地址,在虚拟地址空间上的一个地址,通过这个地址,可以找到关于这个线程的基本信息,包括线程。相同,这个线程就是主线程,主线程的栈在虚拟地址空间的栈上,而其他线程的栈在是在共享区(堆栈之间),因为。不过,Linux设计觉得,进程和线程差不多,只是线程的颗粒度小一点,直接套用进程的那一套不就行了吗?

hlyd520的博客 579

Linux:虚拟地址空间,程序和进程,创建并回收子进程,孤儿进程和僵尸进程。为什么要回收子进程?

其实对于任何一个进程来说,它被执行起来,都会由系统给他分配一块虚拟地址空间,但是在该进程退出时,它只能释放自己用户区的资源。那么会使得每启动一个进程就会损失一个G的虚拟地址空间资源,那么这样下去系统资源总会被占满的。

qq_51004011的博客 934

Linux中的进程(线程)和并发相关知识

并发与并行 概念: 并发,当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent) 并行,当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线...

每一天的小白 932

Day27 进程管理(PCB、状态、调度、原语与资源管理)

进程是程序执行的动态过程,涉及内存资源分配和CPU调度。:操作系统内核中的结构体(如Linux的chdirpwdulimit -a:进程占用CPU、内存(RAM)、闪存(Flash)、固态硬盘(SSD)等物理资源,通过虚拟地址映射(MMU管理)隔离物理内存,每页4KB。

oareen的博客 744

进程线程复习 2019-7-27

1.Linux下进程 1.1 Linux下进程 1.性质 1.每一个进程都有一个 PCB ,其是一个描述了进程所有详细信息的结构体,比如 pid 、 栈信息 等; 2.程序是静态表现(占用物理磁盘空间);进程是该程序运行后的动态表现(占用物理内存空间,具有CPU使用权); 2.进程的组成结构 从高地址到低地址分别是: PCB(4G~3G) 、 环境变量/命令行参数(从3G开始) 、 栈 、 静...

weixin_42896619的博客 333

Linux 学习记录27(进程线程篇)

当子进程结束时,父进程会拿到哟个SIGCHLD的信号,我们可以将该信号进行捕获,在该信号对应的信号处理函数中手动回收子进程的资源。所谓信号,就是软件模拟的中断的功能,信号是软件实现的,而中断是硬件实现的。异步通信:进程在要执行前不需要一直阻塞等待其他进程结束。同步通信:进程在要执行前一直阻塞等待其他进程结束。ipcs -想要删除的信息 信息ID。可以使用kill -l查看所有信号。系统5又提供了三种进程间通讯。

qq_59004923的博客 178

Linux系统编程——守护进程+线程

在学习Linux系统编程总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。 09-linux-day08(守护进程-线程) 目录:一、学习目标二、守护进程1、守护进程相关的概念2、守护进程创建3、守护进程-扩展了解三、线程1、线程有关的概念2、线程的优点和缺点3、创建一个线程4、线程的退出5、线程的回收6、杀死线程7、线程分离8、线程属性、设置分离9...

Alliswell_WP 628
上一篇: Linux相关概念和易错知识点(26)(命名管道、共享内存)
下一篇: Linux相关概念和易错知识点(28)(线程控制、Linux下线程的底层)
-SGlow-
博客等级 码龄3年 1513粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值