【Linux系统】进程概念(一)

简介: 【Linux系统】进程概念(一)

在了解进程概念前我们还得了解下冯诺依曼体系结构和操作系统的概念与定位。

1 冯诺依曼体系结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系:

e57a9fcfc83c45ee87f2768f49712143.png

  • 输入单元:包括网卡,键盘鼠标,扫描仪, 写板,话筒等 ;
  • 中央处理器(CPU):含有运算器和控制器等 ;
  • 输出单元:网卡,显示器,打印机等;

 关于冯诺依曼,必须强调几点:

  • 这里的存储器指的是内存 ;
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备) ;
  • 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取;
  • 一句话,所有设备都只能直接和内存打交道;

对冯诺依曼的理解,不能只停留在概念上,要深入到对软件数据流理解上,请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。

在不考虑网络层情况下,小明用qq向小红发送了一条消息,小明的电脑从键盘上读取信息然后加载到内存,再从内存将数据通过一系列操作发送到输出设备上(网卡),然后通过一系列的网络操作将数据发送到小红的输入设备上(网卡),小红的电脑再从输入设备中将数据读到内存,然后通过输出设备(显示器)将信息刷新到小红的电脑上,这里数据刷新是两个方面的,再成功发送后小明的电脑也会显示出已经成功发送后的信息。

2 操作系统(Operator System)

概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:

  • 内核(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(例如函数库,shell程序等等)

设计OS的目的

  • 与硬件交互,管理所有的软硬件资源
  • 为用户程序(应用程序)提供一个良好的执行环境

定位

在整个计算机软硬件架构中,操作系统的定位是:一款纯正的搞管理的软件。

总结

计算机管理硬件

  1. 描述起来,用struct结构体
  2. 组织起来,用链表或其他高效的数据结构

系统调用和库函数概念

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。

系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

3 进程

有了上面对冯诺依曼体系结构和操作系统的理解,我们自然可以想到进程也是先描述,再组织。

3.1 基本概念

  • 课本概念:程序的一个执行实例,正在执行的程序等
  • 内核观点:担当分配系统资源(CPU时间,内存)的实体。

有些教材书上甚至是给出这样的定义的:进程就是程序加载到内存中。但是我觉得这种描述是狭隘的不够具体的,具体的我们下面会给出解释.

3.2 描述进程-PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCBprocess control block),Linux操作系统下的PCB: task_struct

task_struct是PCB的一种:

  • Linux中描述进程的结构体叫做task_struct
  • task_structLinux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息

我们将所有进程的属性用一个队列来维护,当我们想要加载程序时就将它的PCB链接到该运行队列中,这样就很好的维护了进程。

35dd010ac46c4bc2b30c45b9763e3937.png

那现在我们再来回答什么是进程?

进程=当前程序的代码和数据+内核关于进程的相关数据结构

task_ struct内容分类:

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

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

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

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

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

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

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

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

其他信息

3.2 组织进程

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

3.3 查看进程

我们在Linux环境中创建了一个profile.cpp的Cpp文件,然后编译运行生成了一个叫做profile的可执行文件,我们可以通过一下命令来查找进程:

ps ajx | head -1 && ps ajx | grep "查找进程的名字"

当我们运行profile后来查看:

ffd58a62b2c64c86b7a15f766c12e388.png

不难发现我们查询到了profile进程的一些基本信息,如果我们想不加上下面那一行的信息可以将命令后面多加一些内容:

ps ajx | head -1 && ps ajx | grep "查找进程的名字" | grep -v grep

02f471d420574b99bd40d319b751c7a0.png

当然,文件名可加可不接双引号。

我们还可以在./proc中查询:

ls ./proc

b37d46a831af41bcbc990997a6649482.png

3.4  通过系统调用获取进程标示符

  • 进程idPID
  • 父进程idPPID

我们向profile.cpp中写入以下代码:

  1 #include<iostream>
  2 #include<sys/types.h>
  3 #include<unistd.h>
  4 using namespace std;
  5 
  6 
  7 int main()
  8 {
  9   while(1)
 10   {
 11     pid_t ret=getpid();
 12     cout<<"hello"<<ret<<" "<<endl;
 13     pid_t t=fork();
 14     if(t==0)
 15     {
 16       while(1)
 17       {
 18       cout<<"我是一个子进程"<<" pid:"<<getpid()<<" ppid:"<<getppid()<<endl;
 19       sleep(1);
 20       }
 21     }
 22     else if(t>0)
 23     {                                                                                                                                                      
 24       while(1)
 25       {
 26       cout<<"我是一个父进程"<<" pid:"<<getpid()<<" ppid:"<<getppid()<<endl;
 27       sleep(1);
 28       }
 29     }
 30   }
 31   return 0;
 32 }

当我们查看进程时:

d5750cc6b1fb4ce2aafed73d675a19ef.png

fork()后执行流会变成两个,是先执行父进程还是子进程是由调度器决定的,fork()后的代码共享,我们通常是用if else 来进行分流的。

  • 运行 man fork 认识fork
RETURN VALUE
       On success, the PID of the child process is returned in the parent, and  0
       is  returned  in  the child.  On failure, -1 is returned in the parent, no
       child process is created, and errno is set appropriately.
  • fork有两个返回值
  • 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

当我们只读数据不写数据时,父子进程是共享代码的,而当有其中一个执行流尝试修改数据时OS就会在当前进程触发写时拷贝另外生成一份。

如何理解有两个返回值呢?

创建子进程本质上就是OS提供的一个函数,当函数内部进行return 时我们主体功能已经完成了。

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
20天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
45 1
|
9天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
124 78
|
12天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
47 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
8天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
61 13
|
15天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
24天前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
44 4
|
23天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
28天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
1月前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
36 3
|
9天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
28 0

热门文章

最新文章