很多时候,我们要监控系统状态,即监控系统cpu负载、进程状态等情况,如果我们在 Linux 应用层,我们有很多方式,命令行中常用 top、ps 命令,代码中,我们可以使用 popen 函数去执行一个 top 命令,获取返回值。或者我们直接读写 /proc下面的文件,都可以达到目的。
----时间过得好快,不知不觉又到了周末了。记得上周发的文章,有前辈帮忙指出了一些需要改进的地方-----在手机上看代码不是很好,还有就是文章的字体比较小,看的比较累(这里非常感谢前辈们提出的不足之处),在往后我想把示例代码还是写到文章里,再把源码传到github上,感兴趣的朋友到时候可以去github上下载源代码看。好了,废话不多说,进入今天的主题-------linux系统如何管理文件系统?其实说到这里,记得在学校的时候,学过一段时间的文件管理,那个时候还是第一次接触linux,但是接触的是Linux运维方面的知识,学的很浅;通过这几天再次对文件管理的学习,让理解的更深,现在总结分享出来给大家:
" 内核线程 " 是一种 特殊进程 , 独立运行在 " 内核空间 " , 其将 " 内核函数 " 委托给 独立进程 , 该 " 独立进程 " 与 其它进程 ( 包括 普通进程 , 内核自身 , 用户级线程 ) 并行执行 ;
在Linux中,主要是通过fork的方式产生新的进程,我们都知道每个进程都在 内核对应一个PCB块,内核通过对PCB块的操作做到对进程的管理。在Linux内核中,PCB对应着的结构体就是task_struct,也就是所谓的进程描述符(process descriptor)。该数据结构中包含了程相关的所有信息,比如包含众多描述进程属性的字段,以及指向其他与进程相关的结构体的指针。因此,进程描述符内部是比较复杂的。这个结构体的声明位于include/linux/sched.h中。
中 , 介绍了 调度类 sched_class 结构体的源码 , 重要的 字段 以及 函数指针 ;
fd 是(file descriptor)即文件描述符,这种一般是BSD Socket的用法,用在Unix/Linux系统上。fd全称是file descriptor,是进程独有的文件描述符表的索引。
Linux系统中,应用程序访问外设是通过文件的形式来进行的,Linux将所有的外设都看做文件,统一存放在/dev目录下。
主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)等5个子系统组成。
首先,先提一下Namespace是什么。最早知道这个名词是在学习C++语言的时候。由于现在的系统越来越复杂,代码中不同的模块就可能使用相同变量,于是就出现了Namespace,来对全局作用域进行划分。
在 【Linux 内核】实时调度类 ③ ( 实时调度类 rt_sched_class 源码 | 调度类 sched_class 源码 ) 博客中 , 简单介绍了 实时调度类 rt_sched_class 结构体 , 下面开始分析该结构体的具体字段含义 ,
binder_node 代表的是Binder实体对象,每一个service组件或者ServiceManager在Binder驱动程序中的描述,Binder驱动通过强引用和弱引用来维护其生命周期,通过node找到空间的Service对象
题图来自 My second impression of Rust and why I think it's a great general-purpose language![1]
VFS使得用户可以直接使用open()等系统调用而无需考虑具体文件系统和实际物理介质。
内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
1. 首先我们来看一个现象,当只有第一行代码时,编译是能通过的,但会报warning,当加了第二行代码时,编译无法通过,报error。 第一行代码能编过的原因是权限缩小,虽然ptr是可读可写的权限,但在指向常量字符串"hello world"之后,ptr的权限就变为了只读,所以如果仅仅修改一下权限,g++并不会报错,只是报个warning罢了,但当解引用ptr,将ptr指向的内容修改为"H"字符串后,编译器就会报错了,因为我们说ptr的权限是只读,因为常量字符串是不可修改的,你现在进行了ptr指向内容的修改,编译器则一定会报错。
在上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 , 完成了 进程一 的程序 ,
Linux系统一般有4个主要部分: 内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所
内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图所示。
通过上篇 Go 存储基础 — 文件 IO 的姿势, 我们看到有两种文件读写的方式,一种是系统调用的方式,操作的对象是一个整数 fd,另一种是 Go 标准库自己封装的标准库 IO ,操作对象是 Go 封装的 file 结构体,但其内部还是针对整数 fd 的操作。所以一切的本源是通过 fd 来操作的,那么,这个 fd 究竟是什么?就这个点我们深入剖析。
本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看
进程 的 " 虚拟地址空间 " 由 mm_struct 和 vm_area_struct 两个数据结构描述 ;
在普遍的操作系统中,我们所遇到的进程状态有:运行、新建、就绪、挂起、阻塞、停止、挂机、死亡…等等,但是我们并不懂它们(学了等于没学),因为这是操作系统层面的说法,它的理论放到哪个操作系统中都对。所以我们要学习一个具体的操作系统来理解进程状态,而这里我们使用的当然就是Linux!
Linux内核的作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。
Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一。
操作系统为进程维护了打开的文件列表,每个进程维护了一个file数组字段(struct file * fd[NR_OPEN]);每个元素指向一个file结构体。每个file结构体有一个字段指向inode结构体,inode管理这个文件的内容、权限等信息。这里分析的是file结构体的管理。
进程是 Linux 事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源。进程的环境由当前系统状态及其父进程信息决定和组成,将某个可执行文件加载到内存中运行,那么就会演变成一个或者是多个进程。(产生多个进程的原因是进程在运行的时候可以再创建新的进程,但是加载的时候只有一个进程),为了更好的理解进程,以我们平时在 Linux 环境下运行一个 C 程序为例进行说明: 代码很简单,hello world:
原创作品转载请注明出处https://github.com/mengning/linuxkernel/
近期,火绒安全实验室发现了一起针对Linux系统的植入后门病毒攻击,经过分析确认该后门为BDFdoor的变种。
1.Linux中使用 mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项是()
信号,是一种软中断(软件层上对中断机制的一种模拟)。为 Linux 提供了一种处理异步事件的方式。比如,终端用户输入了 ctrl+c 来中断程序,会通过信号机制停止一个程序。
Linux cgroups 的全称是 Linux Control Groups,它是 Linux 内核的特性,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、IO 等)。2006 的时候,Google 的一些工程师(主要是 Paul Menage 和 Rohit Seth)启动了这个项目,最初的名字叫 process containers。因为 container 在内核中名字有歧义,2007 的时候改名为 control groups,并合并到 2008 年发布的 2.6.24 内核版本。最初 cgroups 的版本被称为 v1,这个版本的 cgroups 设计并不友好,理解起来非常困难。后续的开发工作由 Tejun Heo 接管,他重新设计并重写了 cgroups,新版本被称为 v2,并首次出现在 kernel 4.5 版本。
在 Linux 内核中 , 使用 vm_area_struct 结构体描述 " 进程 " 的 " 用户虚拟地址空间 " 的 地址区间 ;
exit是c语言的库函数,他最终调用_exit。在此之前,先清洗标准输出的缓存,调用用atexit注册的函数等, 在c语言的main函数中调用return就等价于调用exit。
2)获取对应软件版本的符号表文件(如vmlinux),可以将该文件放置 crash工具同一目录下。
1.从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
从进程的角度出发来剖析 cgroups 相关数据结构之间的关系。在 Linux 中管理进程的数据结构是 task_struct。cgroup表示进程的行为控制,因为子系统必须要知道进程是位于哪一个cgroup,所以在struct task_struct和cgroup中存在一种映射。
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/83931740
Cgroup设计原理分析 CGroups的源代码较为清晰,我们可以从进程的角度出发来剖析cgroups相关数据结构之间的关系。在Linux中,管理进程的数据结构是task_struct,其中与cgroups有关的代码如清单8所示: 清单8.task_struct代码 #ifdef CONFIG_CGROUPS /* Control Group info protected by css_set_lock */ struct css_set *cgroups; /* cg_list protected by
那是不是所有磁盘的文件都被打开呢?显然不是这样!因此我们可以将文件划分成两种:a.被打开的文件;b.没有被打开的文件 。对于文件操作,一定是被打开的文件才能进行操作,本篇文章只会讲解被打开的文件。
进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。
控制群组(control group)(在此指南中简写为 cgroup)是 Linux kernel 的一项功能:在一个系统中运行的层级制进程组,您可对其进行资源分配(如 CPU 时间、系统内存、网络带宽或者这些资源的组合)。通过使用 cgroup,系统管理员在分配、排序、拒绝、管理和监控系统资源等方面,可以进行精细化控制。硬件资源可以在应用程序和用户间智能分配,从而增加整体效率。
作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init进程是进程树的根,所有的进程都直接或者间接起源于该进程。virt/ —- 提供虚拟机技术的支持。
在Rust源代码中,rust/library/std/src/sys/itron/time.rs文件是用于实现与ITRON操作系统相关的时间功能。ITRON是一种实时操作系统,被广泛用于嵌入式系统中。这个文件中定义了一些与时间相关的结构体和函数。
本系列按类别对题目进行分类整理,这样有利于大家对嵌入式的笔试面试考察框架有一个完整的理解。
首先,栈 (stack) 是一种串列形式的数据结构。这种数据结构的特点是后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。根据栈的特点,很容易的想到可以利用数组,来实现这种数据结构。但是本文要讨论的并不是软件层面的栈,而是硬件层面的栈。
我们都知道,文件等于文件内容加上文件属性。访问文件之前都得先通过进程才能打开相应的文件,一个进程可以打开多个文件。修改文件,都是通过执行代码的方式完成修改。要对文件进行修改(或其他操作),文件就必须事先被加载到内存当中。从前面的叙述我们可以知道,在一定的时间段内,系统可能呢存在多个进程,也一定会存在多个被打开的文件,操作系统通过先描述再组织的方式对这些文件进行统一的管理。所以,在操作系统内部,一定会存在描述被打开文件的结构体,并用其定义对象。没有被打开的文件就存储在磁盘当中。
领取专属 10元无门槛券
手把手带您无忧上云