【Linux系统化学习】探索进程的奥秘 | 第一个系统调用

简介: 【Linux系统化学习】探索进程的奥秘 | 第一个系统调用

进程的概念

上篇文章我们介绍了冯诺依曼体系结构和了解了操作系统的概念和功能;在我们Windows的计算机上的磁盘上有很多的可执行程序,其中有我们自己手动安装的或者自己写的可执行程序的代码等等各种功能的程序。当我们想启动某一程序时,只需要双击它的图标即可。根据冯诺依曼体系结构操作系统便将我们执行的可执行程序从磁盘加载到内存中,此时这个可执行程序在内存中就执行起来了,便是一个我们所谓的进程。

·       课本概念:程序的一个执行实例,正在执行的程序等

·       内核观点:担当分配系统资源(CPU时间,内存)的实体。

 c3a3f0cea6ab404baf65968f8c58f386.png

124f651cd0874494a754bcafd6ff58ba.png


这就是我计算机此时后台进程和运行起来的程序,我们会发现后台的进程不止一个运行起来的程序也不知一个;就像我现在一边在这里写文章一边还是用音乐播放器放着我喜欢的音乐,甚至在阅读参考文档等等运行了很多我使用到的程序,互不干扰每个运行起来的可执行程序只发挥着自己的作用。


进程的管理

当我们启动计算机的那一刻,操作系统这款软件就率先运行起来;上篇文章我们详细谈到操作系统的作用:对软硬件资源进行管理和操作系统的核心之一:进程管理。一个软件加载到内存中运行起来便是一个进程,操作系统的管理方式——先描述,在组织。

描述进程——pcb

进程加载到内存中内存操作系统会分配空间地址(ID)(代码地址&数据地址),记录此时我们是否在使用(状态)等等各种属性,操作系统将这些能够描述一个加载在内存中的程序的属性打包起来(struct),这个struct便是一个进程的pcb(process control block)。

·       进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。

·       课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

组织进程

加载到内存中的可执行程序,操作系统会形成它的pcb,每个pcb不仅仅含有描述对应运行软件的各种属性,还有指向下一个运行起来程序的pcb(也就是结构体指针)。将每个pcb以链表的方式组织起来,其实就是对进程的管理被建模成对链表的增删查改

进程在排队


当我们运行起来的程序需要进入CPU进行数据运算时,会被CPU调度一次;当运行起来很多程序时,每个程序都有自己的pcb;将需要被CPU调度的软件的pcb以队列的形式组织起来,先进先出;这便是进程在排队;

 

e052c45cef184ea69ff329ccb324b888.png

总结:

·       操作系统并不是直接对运行起来的可执行程序做管理,而是对运行起来的可执行程序“打包”(pcb),每个pcb做管理。

·       进程的深层含义:进程=可执行程序+内核数据结构(pcb)

·       进程的pcb不止在一个链表中,可能在很多结构中;例如:当程序运行起来并且需要CPU调度时pcb不仅在链表中,还在一个队列中排队。


Linux下的进程

task_struct——PCB的一种

·       在Linux中描述进程的结构体叫做task_struct

·       task_structLinux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息

task_struct内容分类

·       标示符: 描述本进程的唯一标示符,用来区别其他进程。(pid)

·       状态: 任务状态,退出代码,退出信号等。

·       优先级: 相对于其他进程的优先级。

·       程序计数器: 程序中即将被执行的下一条指令的地址。

·       内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

·       上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。

·       I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

·       记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

·       其他信息

Linux组织进程

可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里

查看进程

指令

·       ps ajx

·       ps指令还有很多的选项,目前我们我们就只介绍这一个选项在以后的文章中会慢慢介绍剩下的选项。

下图为我当前Linux下的部分进程。

1ec1c758e83f4270a75bc63448f2d66f.png

 

查看可执行程序的进程

我们自己使用编程语言写的.c文件不是可执行程序,需要通过预处理、编译、链接生成后缀为.exe的可执行程序,运行这个可执行程序在系统中会生成进程。

 

#include<stdio.h>
#include<unistd.h>
int main()
{
    int i=0;
    while(i<100)
  {
      printf("我是一个进程!\n");
      sleep(1);
      i++;                                                                                                                                                                       
  }
    return 0;
}

34f0075e879740d5bf326728a571cb7d.png

上图我们执行可执行程序后通过管道过滤会查到我们可执行程序运行时的进程。


 6d7ffe240be744e0bc133a3d9d42ed2f.png

总结:

·       我们执行的程序、写的可执行程序、执行的代码都是进程 


第一个系统调用

我们可以通过函数调用得到我们的pid


  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/types.h>
  4 int main()
  5 {
  6     int i=0;
  7     while(i<100)
  8     {
  9         pid_t id  =getpid();
 10         printf("我是一个进程,我的进程id是:%d\n",id);
 11         sleep(1);
 12         i++;
 13     }
 14     return 0;
 15 }   

8700c2745fd94a1aa62d1612172681bc.png

"杀掉进程"

使用kill指令配合进程的pid就可以”杀掉进程“

 7a62c89856404ff1b029486e5830da44.png

相关文章
|
3天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
18 3
|
3天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
15 2
|
3天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
18 3
|
6天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
23 6
|
6天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
30 6
|
7天前
|
机器学习/深度学习 自然语言处理 Linux
Linux 中的机器学习:Whisper——自动语音识别系统
本文介绍了先进的自动语音识别系统 Whisper 在 Linux 环境中的应用。Whisper 基于深度学习和神经网络技术,支持多语言识别,具有高准确性和实时处理能力。文章详细讲解了在 Linux 中安装、配置和使用 Whisper 的步骤,以及其在语音助手、语音识别软件等领域的应用场景。
30 5
|
7天前
|
监控 网络协议 算法
Linux内核优化:提升系统性能与稳定性的策略####
本文深入探讨了Linux操作系统内核的优化策略,旨在通过一系列技术手段和最佳实践,显著提升系统的性能、响应速度及稳定性。文章首先概述了Linux内核的核心组件及其在系统中的作用,随后详细阐述了内存管理、进程调度、文件系统优化、网络栈调整及并发控制等关键领域的优化方法。通过实际案例分析,展示了这些优化措施如何有效减少延迟、提高吞吐量,并增强系统的整体健壮性。最终,文章强调了持续监控、定期更新及合理配置对于维持Linux系统长期高效运行的重要性。 ####
|
4月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
4月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
162 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
3月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。