我在多年的工程生涯中发现很多工程师碰到一个共性的问题:Linux工程师很多,甚至有很多有多年工作经验,但是对一些关键概念的理解非常模糊,比如不理解CPU、内存资源等的真正分布,具体的工作机制,这使得他们对很多问题的分析都摸不到方向。比如进程的调度延时是多少?Linux能否硬实时?多核下多线程如何执行?系统的内存究竟耗到哪里去了?我写的应用程序究竟耗了多少内存?什么是内存泄漏,如何判定内存是否真的泄漏?CPU速度、内存大小和系统性能的关联究竟是什么?内存和I/O存在着怎样的千丝万缕的联系?
2、嵌入式硬件系统的结构 (1)嵌入式处理器+外围硬件 (2)常见的外围硬件:电源、时钟、内存、I/O、通信、调试; 3、嵌入式处理器 (1)ARM、S3C6410、STM32单片机、华为海思、高通骁龙等 (2)Intel /AMD 都不是嵌入式处理器 4、嵌入式操作系统 功能: 种类:嵌入式linux;WinCE;Vxworks;μC/OS-II;Android;IOS。注意:linux不是嵌入式操作系统;MAC OS WINDOWS XP/7/8/10都不是
原子操作 通常我们代码中的a = a + 1这样的一行语句,翻译成汇编后蕴含着3条指令: ldr x0, &a add x0,x0,#1 str x0,&a 即 (1)从内存中读取a变量到X0寄存器 (2)X0寄存器加1 (3)将X0写入到内存a中 既然是3条指令,那么就有可能并发,也就意味着返回的结果可能不是预期的。 然后在linux kernel的操作系统中,提供访问原子变量的函数,用来解决上述问题。其中部分原子操作的API如下: atomic_read atomic_add_return(i,v) a
进程是 Linux 事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源。进程的环境由当前系统状态及其父进程信息决定和组成,将某个可执行文件加载到内存中运行,那么就会演变成一个或者是多个进程。(产生多个进程的原因是进程在运行的时候可以再创建新的进程,但是加载的时候只有一个进程),为了更好的理解进程,以我们平时在 Linux 环境下运行一个 C 程序为例进行说明: 代码很简单,hello world:
大家周末好,今天给大家继续分享linux内核学习。上次讲解到linux内核启动分析的前期准备,还没有去分析linux内核具体启动分析过程,这里我换一种方式来分享,在linux启动后,linux系统接下来会如何进行工作?然后再反过来具体分析linux内核启动过程,启动过程会设计到一些汇编语言,以及这个时候去具体分析c语言代码的话,就真正考验c语言的功底的时候到了;同时c语言的基本功,大家可以去看我以前学习c语言的一些常用c语言用法,我把它搞成了专辑,方便大家查看。
进程间通信有如下的目的:1、数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间;2、共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到;3、通知事件,一个进程需要向另一个或一组进程发送消息,通知它们发生了某件事情;4、资源共享,多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制;5、进程控制,有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
4.1 监测程序 1. ps 默认只显示运行在当前控制台下的属于当前用户的进程。 可以接很多选项,比如 -A表示所有进程 -e等。 2. ps -l 查看进程更多信息 UID:启动这些进程的用户 PID:进程的进程ID PPID:父进程的进程ID C:进程生命周期中的CPU利用率 TTY:进程启动时的终端设备 TIME:运行进程需要的累计CPU时间 CMD:启动的程序名称 PRI:进程的优先级(数字越大代表越低的优先级) ADDR:进程的内存地址 F:内核分配给进程的系统标记 S:进程的状态(O正在
Linux进程管理是系统管理中的一个重要部分,它可以帮助管理员了解和控制系统中运行的所有进程。本文将详细介绍Linux进程管理的相关知识,并提供示例来演示如何管理进程。
文章目录 Linux——进程管理篇(详解fork和exec) 🚗如何在Linux编写与运行代码 编写 编译 运行 🚗进程管理 fork system exec 🚗总结 Linux——进程管理篇(详解fork和exec) 🚀🚀这篇文章,主要的目的就是帮助同学们完成操作系统的实验,因为考虑到很多同学第一次接触Linux,相当不习惯命令行的操作方式,所以我会详细来介绍,相信只要跟着步骤一步一步来,就一定能完成我们的实验,好了,我们接下来就来介绍吧! ---- 🚗如何在Linux编写与运行代码 🚀🚀做实验,首
引用一句经典的话:“UNIX下一切皆文件”。 文件是一种抽象机制,它提供了一种方式用来存储信息以及在后面进行读取。
程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括 代码段(text section) 和 数据段(data section), 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等等.
☠️每日毒鸡汤:没撒子可说的,好好看文章吧。 👋大家好!我是你们的老朋友Java学术趴。相毕大家对Windows玩的已经是非常的熟练,那么小编今天给大家带大家搞一搞Linux系统,小编用一个星期的时间给大家整了一些Linux干货,由于内容太多,小编分开发。话不多说,直接进入今天的主题:Linux系统。Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于P
网上很多文章都说,线程比较轻量级 lightweight,进程比较重量级,首先我们来看看这两者到底的区别和联系在哪里。
在 Linux 内核 中 , " 进程控制块 " 是通过 task_struct 结构体 进行描述的 ; Linux 内核中 , 所有 进程管理 相关算法逻辑 , 都是基于 task_struct 结构体的 ;
通过这三篇文章的学习我们知道,无论内核进程还是用户进程,都是可以用task_struct来描述的,那么本篇我们实践下如何通过task_struct字段把系统中所有的进程包含的信息打印出来,比如:属性信息,状态,进程标识符,优先级信息,亲属关系,文件系统信息,内存方面的信息等。
超线程技术(Hyper-Threading): 就是利用特殊的硬件指令,把两个逻辑内核(CPU core)模拟成两个物理芯片,(一个核模拟出两个核?)
上图中最后一步 杀掉进程可使用 taskkill /f /t /im 10744,或者 taskkill /f /t /im java.exe
进程或者线程绑定到某个CPU Core,仍然可能会有线程或者进程切换的发生,如果想到达到进一步减少其他进程对于该进程或者线程影响,可以采取把CPU Core从Linux内核调度中剥离出来。Linux内核提供isolcpus,对于有4个CPU core的系统,在启动时候加入isolcpus=2,3,那么系统启动后将不会使用CPU3,CPU4.这里的不适用不是绝对的,但是可以通过taskset命令来设置
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。程序替换所做的本质工作就是将代码和数据加载到内存。
在Linux中,线程是由进程来实现,线程就是轻量级进程( lightweight process ),因此在Linux中,线程的调度是按照进程的调度方式来进行调度的,也就是说线程是调度单元。Linux这样实现的线程的好处的之一是:线程调度直接使用进程调度就可以了,没必要再搞一个进程内的线程调度器。在Linux中,调度器是基于线程的调度策略(scheduling policy)和静态调度优先级(static scheduling priority)来决定那个线程来运行。
xref: /linux-3.18.6/include/linux/sched.h
Linux内核在2.2版本中引入了类似线程的机制。Linux提供的vfork函数可以创建线程,此外Linux还提供了clone来创建一个线程,通过共享原来调用进程的地址空间,clone能像独立线程一样工作。Linux内核的独特,允许共享地址空间,clone创建的进程指向了父进程的数据结构,从而完成了父子进程共享内存和其他资源。clone的参数可以设置父子进程共享哪些资源,不共享哪些资源。实质上Linux内核并没有线程这个概念,或者说Linux不区分进程和线程。Linux喜欢称他们为任务。除了clone进程以外,Linux并不支持多线程,独立数据结构或内核子程序。但是POSIX标准提供了Pthread接口来实现用户级多线程编程。
HZ定义在<asm/param.h>,在i386平台上,目前采用的HZ值是1000。
注:本文的代码仅用于功能验证,不能用于生产。本文对clone的标志的描述顺序有变,主要考虑到连贯性。
进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。
在Linux系统中,了解哪些文件被哪些进程打开对于系统管理和问题诊断是极其重要的。这正是lsof命令,即List Open Files,发挥其强大功能的场景。本文旨在详细介绍lsof的起源、底层原理、参数意义,常见用法,并详解其返回结果的每个字段含义。此外,我们将讨论在使用lsof命令时需要注意的事项。
在前文中我们了解了fork函数的使用,以及写时拷贝机制的原理等,并且也学习了什么是僵尸进程,但是并没有具体讲到应如何处理僵尸进程,本次章节将对fork函数以及如何终止进程,还有僵尸进程的处理做更为详细的探讨。
原创作品转载请注明出处https://github.com/mengning/linuxkernel/
SeLinux全称为安全增强式 Security-Enhanced Linux(SeLinux),是一个在内核的强制存取控制(MAC)安全性机制。SeLinux的整体架构和原理都比较简单,使用也不复杂,其复杂的地方在于规则非常复杂,每个进程都要有规则策略;
在本文中,传统UNIX fork之后,我给出传统的UNIX fork在Linux内核中的变体clone系统调用的精彩。
这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的。
我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof。
作为应急响应工具,支持勒索挖矿病毒及webshell等恶意样本排查检测,辅助安全工程师应急响应时排查入侵痕迹,定位恶意样本。作为基线检查工具,辅助检测和排查操作系统配置缺陷;(TODO) 作为软件供应链安全检查工具,可提取web应用程序开源组件清单(sbom),判别引入的组件风险。(TODO)
在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。
由于CPU数量相对于进程数量来说少之又少,所以CPU维护了一个运行队列,方便管理大量等待CPU资源的进程.
超线程技术(Hyper-Threading):就是利用特殊的硬件指令,把两个逻辑内核(CPU core)模拟成两个物理芯片, 让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行效率。 我们常听到的双核四线程/四核八线程指的就是支持超线程技术的CPU.
Linux的进程状态就是struct task_struct内部的一个属性。 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。 下面的状态在kernel源代码里定义:
进程如何在CPU上运行的:CPU在内核上维护了一个运行队列,进行进程的管理。让进程入队列,本质就是将该进程的task_struct 结构体对象放入运行队列之中。
注:pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了
要对一个信号进行处理(除了无法捕捉的SIGKILL和SIGSTOP),需要为其注册相应的处理函数,通过调用signal()函数可以进行注册。
Linux是一个多任务、多用户的操作系统,因此它允许多个进程同时运行而不相互干扰,进程是Linux操作系统的重要基本概念之一,进程是程序的执行实例,在操作系统中执行不同的任务。Linux为我们提供了一个名为ps的实用程序,用于查看与系统上的进程相关的信息,它是process status进程状态的缩写,ps命令用于列出当前正在运行的进程,它们的pid以及一些其他信息取决于不同的选项,它从/proc文件系统中的虚拟文件读取进程信息,/proc包含虚拟文件,这就是它被称为虚拟文件系统的原因,process status命令ps显示有关活动进程的信息,类似于windows的任务管理器,每个操作系统的ps版本都略有不同,因此若要是需要获取详细情况则需要查阅操作系统的wiki。
Linux top命令用于实时显示 process 的动态,当我们在命令框中敲入top命令然后回车之后,可以看到如下输出:
重复查看代码运行状态:while :; do ps ajx | head -1 && ps ajx | grep testStatus | grep -v grep; sleep 1; done
Linux的who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。使用权限:所有使用者都可使用。
前言:在进程学习这一块,我们主要学习的就是PCB这个进程控制块,而PBC就是用来描述进程的结构体,而进程状态就是PCB结构体中的一个变量。
简单来说,深度睡眠的进程必须等待资源来了才能醒,在此之前,甚至你给它发任何的信号,它都不可能醒来。
使用如下系统(centos)运行容器后,在容器内的挂载目录内执行ls命令出现了“Permission denied”的错误
领取专属 10元无门槛券
手把手带您无忧上云