基于Linux的进程分析

什么是进程?

进程是程序执行的实例,是有限状态机的一次迁移过程。进程和程序的区别:动态与静止;多对一。

windows10的相关进程

在Linux中用ps-a列出所有运行中/激活进程

在Linux中使用top命令,可以监视不同进程所使用的资源。(包括:PID,优先级,%CPU,%memory等)

进程运行流程:

进程的创建

用户空间内可以通过执行一个程序、或者在程序内调用fork(或exec)系统调用来创建进程,fork调用会导致创建一个子进程,而exec调用则会用新程序代替当前进程上下文。一个新进程的诞生还可以分别通过vfork()和clone()。fork、vfork和clone三个用户态函数均由libc库提供,它们分别会调用Linux内核提供的同名系统调用fork,vfork和clone。下面以fork系统调用为例来介绍。

最终都是直接调用do_fork。进程创建的函数层次结构如下图:

从图中可以看到 do_fork 是进程创建的基础。可以在 ./linux/kernel/fork.c 内找到 do_fork 函数(以及合作函数 copy_process)。

代码如下:

(1)在system_call函数执行之前,CPU控制单元已经将eflags、cs、eip、ss和esp寄存器的值自动保存到该进程对应的内核栈中。随之,在 system_call内部首先将存储在eax寄存器中的系统调用号压入栈中。接着执行SAVE_ALL宏。该宏在栈中保存接下来的系统调用可能要用到的所有CPU寄存器。
    (2)通过GET_THREAD_INFO宏获得当前进程的thread_inof结构的地址;再检测当前进程是否被其他进程所跟踪(例如调试一个程序时,被调试的程序就处于被跟踪状态),也就是thread_info结构中flag字段的_TIF_ALLWORK_MASK被置1。如果发生被跟踪的情况则转向syscall_trace_entry标记的处理命令处。
    (3)对用户态进程传递过来的系统调用号的合法性进行检查。如果不合法则跳入到syscall_badsys标记的命令处。
    (4)如果系统调用好合法,则根据系统调用号查找./linux/arch/x86/kernel/syscall_table_32.S中的系统调用表sys_call_table,找到相应的函数入口点,跳入sys_fork这个服务例程当中。由于 sys_call_table表的表项占4字节,因此获得服务例程指针的具体方法是将由eax保存的系统调用号乘以4再与sys_call_table表的基址相加。syscall_table_32.S中的代码如下:

进程调度:

创建好的进程最后被插入到运行队列中,它会通过 Linux 调度程序来调度。Linux调度程序维护了针对每个优先级别的一组列表,其中保存了 task_struct 引用。当正在运行的进程时间片用完时,时钟tick产生中断,调用kernel/sched.c:scheduler_tick()进程调度器的中断处理,中断返回后就会调用schedule()。运行队列中的任务通过 schedule 函数(在./linux/kernel/sched.c 内)来调用,它根据加载及进程执行历史决定最佳进程。

进程销毁:

进程状态:

R运行状态(running):表明进程要么在运行中,要么在运行队列里面

S睡眠状态(sleeping):意味着进程在等待事件的完成,这个睡眠也叫做可中断睡眠

D磁盘休眠状态(Disk sleep):这个状态的睡眠通常在等待I/O的结束,也叫做不可中断睡眠

T停止状态(stopped):可以发送SIGSTOP信号给进程,让进程停止。也可以发送SIGCONT信号让进程继续运行。

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里面看到这个状态

Z僵尸状态(zombie):子进程退出,父进程没有读取子进程的退出码,子进程进入Z状态

Linux 还在不断演进,其中一个有待进一步创新和优化的领域就是进程管理。在坚持 UNIX 原理的同时,Linux 也在不断突破。新的处理器架构、对称多处理(SMP)以及虚拟化都将促使在内核领域内取得新进展。其中的一个例子就是 Linux 版本 2.6 中引入的新的 O(1) 调度程序,它为具有大量任务的系统提供了可伸缩性。

原文地址:https://www.cnblogs.com/wrj7296032/p/8969545.html

时间: 2024-10-08 23:28:11

基于Linux的进程分析的相关文章

linux用户进程分析

       经过实验3的介绍,我们需要来点实在的,所以将我们理解的流程用于linux系统的分析.换句话说,通过类比的方式去进行描述与理解linux相关的部分.本节的内容很详实,而且也分析了很久,所以长话短说,静静的去感受与理解linux内核代码的实现.当然,我们实验的系统代码很简单而且直接,但是linux内核经过20多年的发展,更有成千上万的开发者共同维护,所以对于代码的书写会更加精练,对于基础相对薄弱的程序员去理解有一些障碍,但是反过来说,更有利于我们语言知识的提高. 如下的介绍方法是对

浅析Linux计算机进程地址空间与内核装载ELF

简介: 本文基于Linux?系统对进程创建与加载进行分析,文中实现了Linux库函数fork.exec,剖析内核态执行过程,并进一步展示进程创建过程中进程控制块字段变化信息及ELF文件加载过程. 一.初识Linux进程                                                                                                                                            

第一次作业:基于Linux操作系统深入源码进程模型分析

1.Linux操作系统的简易介绍 Linux系统一般有4个主要部分:内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统. (1)内核 内核是操作系统的核心,具有很多最基本功能,如虚拟内存.多任务.共享库.需求加载.可执行程序和TCP/IP网络功能.Linux内核的模块分为以下几个部分:存储管理.CPU和进程管理.文件系统.设备管理和驱动.网络通信.系统的初始化和系统调用等. (2)shell shell是系统

基于Linux 2.6.32的进程分析

前言 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统. 本文的分析全部基于Linux Kernel 2.6.32,源代码的链接地址:https://elixir.bootlin.com/linux/v2.6.32/source/fs 具体内容分为: 进程的概念 进程的建立 进程的转换 进程的调度 对于进程的理解 一.进程的概念 1.1什么是进程 大众对进程的理解基本上基于打开任务管理器所看到的正在执行的软件等

基于Linux进程模型分析

1.进程与线程  1.0  进程: 进程是正在运行的程序的实例(an instance of a computer program that is being executed). 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元. 1.1  线程: 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. 1.2  进程与线程的关系和区别:

基于linux与busybox的reboot命令流程分析

http://www.xuebuyuan.com/736763.html 基于Linux与Busybox的Reboot命令流程分析 *************************************************************************************************************************** 作者:EasyWave                                                

linux c 进程 pipe 通信代码分析

[[email protected] 04]# cat ex04-3-pipe02.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> int main(void){ int result=-1; int fd[2],nbytes; pid_t pid; char string[]="

第一次作业:深入Linux源码分析其进程模型

一.进程 1.进程的概念 (1)进程:Process,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. (2)进程由程序.数据和进程控制块PCB组成.当系统创建一个进程时,实际上是建立一个PCB.当进程消失时,实际上是撤销PCB.在进程活动的整个生命周期内,系统通过PCB对进程进行管理和调度. 2.查看进程状态 (1)ps指令(常用组合:aux.ef.eFH.-eo.axo) (2)示例 # ps  aux:显示所有与终端有无关联的进程信

基于Linux平台下的僵尸网络病毒《比尔盖茨》

感觉分析的很好,所以决定翻译出来,希望和大家多多交流O(∩_∩)O~ 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 关键字:病毒,linux,信息安全 我昨天写的日志里面提到,家用路由器在x86的CentOS系统下奇怪的自己行动,像是在自己加载处理器.于是我决定爬上去看看,在那里发生了什么,然后我马上意识到有人爬到服务器和挂在进程中的dgnfd564sdf.com.主要是下面几个方面atddd,cupsdd,cupsddh, ksap