前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux进程

Linux进程

作者头像
用户11173787
发布2024-06-24 11:21:52
890
发布2024-06-24 11:21:52
举报
文章被收录于专栏:破晓破晓

什么是进程

进程概念

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

我的理解:一个程序从磁盘中加载到内存中,就这个程序就变成了一个进程

进程和程序的区别

程序是永存的;进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的; 程序是静态的观念,进程是动态的观念; 进程具有并发性,而程序没有; 进程是竞争计算机资源的基本单位,程序不是。 进程和程序不是一一对应的: 一个程序可对应多个进程即多个进程可执行同一程序; 一个进程可以执行一个或几个程序

怎样理解进程

如图,代表着一个程序加载到内存的过程。

但是如果数十个程序同时从磁盘加载到内存中,我们该如何标记这些程序?这些程序被放到内存中的那个地方呢?这些程序什时候执行?按照什么顺序执行?

所以,为了使计算机高效的运行,我们必须把这些加载到内存中的程序进行有效的管理。

管理的本质就是先描述再组织。计算机内部为了描述这些进程,所以引进了PCB的概念,也就是进程控制块,本质就是结构体!!这就是描述的过程。然后把这些进程控制块用链表的方式管理起来,这既是组织的过程!!这时,对进程进行管理,就转化为了对链表进行增删查改操作。当一个程序被加载到内存中时,操作系统聚会马上为该程序创建一个PCB对象。

描述进程—–PCB

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct 。 在Linux中描述进程的结构体叫做task_struct。 task_struct是Linux内核的⼀一种数据结构,它会被装载到RAM(内存)⾥里并且包含着进程的信息。

task_ struct内容分类

在进程执行时,任意给定一个时间,进程都可以唯一的被表征为以下元素。

标示符: 描述本进程的唯一标示符,⽤用来区别其他进程。 状态: 任务状态,退出代码,退出信号等。 优先级: 相对于其他进程的优先级。 程序计数器: 程序中即将被执行的下一条指令的地址。 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针 上下文数据: 进程执行时处理器的寄存器中的数据 I/O状态信息: 包括显⽰示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

见一见进程

查询进程

创建一个名为myprocess.c的文件,内容为:

代码语言:javascript
复制
#include<stdio.h>
#include<unistd.h>
int main()
{
      while(1)
      {
            printf("我是一个进程\n");
            sleep(1);

      }
}

运行起来,然后拆分终端

在另一个终端中输入

代码语言:javascript
复制
[user@VM-8-5-centos exercise]$ ps ajx | grep 'a.out'

查询结果为:

因为查询本身也是一个正在运行的进程,所以会查出来两个进程,但是第一个是我们所查找的源进程。

如果想要观察的更详细,我们可以:

代码语言:javascript
复制
[root@VM-8-5-centos ~]# ps ajx | head -1 && ps ajx | grep 'a.out'

这样一来,就带上了各行的意义:

kill进程

在Linux中,kill -9 +PID可以杀掉这个进程

Linux下第一类系统调用接口

getpid
头文件

#include<unistd.h>

#include<sys/types.h>

作用

这个系统调用的作用就是获取该进程的PID

用法
代码语言:javascript
复制
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
     
            printf("我是一个进程:%d\n",getpid());
           

      
}
getppid
头文件

#include<unistd.h>

#include<sys/types.h>

作用

这个系统调用的作用就是获取该进程的父进程的PID

用法
代码语言:javascript
复制
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
     
            printf("我是一个进程:%d\n",getppid());
           

      
}
思考

大家刚开始学时,可能会有些疑问:在Linux下运行的代码的父进程是什么?

我们将getpid(),getppid()一起使用一下:

代码语言:javascript
复制
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
     
            printf("我是一个进程:%d,父进程:%d",getppid(),getppid());
           

      
}

结果为:我是一个进程:8128,父进程:8128

然后我们查一下进程号为8128的进程是什么

其实,8128就是bash,即我们的命令行解释器。

我们知道:我们自己所写程序中可能会存在bug,进而导致程序崩溃。所以,命令行解释器就让它的子进程来运行这段代码,即使代码导致程序崩溃,bash也不受任何的影响。所以,所运行程序的父进程通常情况下都为bash(命令行解释器)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是进程
    • 进程概念
      • 进程和程序的区别
      • 怎样理解进程
        • 描述进程—–PCB
          • task_ struct内容分类
            • 查询进程
            • kill进程
        • 见一见进程
          • Linux下第一类系统调用接口
            • getpid
            • getppid
            • 思考
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档