【Linux进行时】进程概念

这篇具有很好参考价值的文章主要介绍了【Linux进行时】进程概念。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Linux进行时】进程概念,Linux,linux,java,网络

进程的概念

什么是进程呢?

❓首先我们需要认识一下什么叫进程呢?

【Linux进行时】进程概念,Linux,linux,java,网络

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

上图我们发现进程是一个个可执行程序!

所有,我们以前的任何启动并运行程序的行为——由操作系统帮助我们将程序转换为进程——完成特定的任务

可执行程序(.exe)本质就是一个普通的二进制文件

❓文件是什么呢? 💡文件等于内容+属性

【Linux进行时】进程概念,Linux,linux,java,网络

这个一个个可执行程序(进程)就像我们学生在学校中被管理一样

❓当可执行程序有很多个,都加载到进程里面,那当有成百上千的可执行程序加载到进程,那操作系统会管吗?

❓会管,所以操作系统如何管理进程?

🔥在计算机中,在操作系统内核 里面,要为每个进程加载到内存的时候,操作系统会帮我们创建一个数据结构对象,这个东西在操作系统教材叫pcb,在Linux中叫task_struct

【Linux进行时】进程概念,Linux,linux,java,网络

这个结构体提取了所有进程的属性

🔥这里的结构体一个个都是独立,因此可以有结构体指针,可以让pcb直接关联起来,就像链表一样

操作系统,要将其中一个进程结束,将其释放它的代码和数据,和task_struct

❓如果想要执行一个优先级最高的要怎么做呢?

🔥因为pcb是用链表的形式,因此我们可以通过pcb的链表找到优先级最高的地方,然后通过pcb找到进程的代码和数据,将这个进程加载到CPU

现在我们新增加一个进程到内存,然后操作系统要管理进程,因此给你创建了一个pcb,因此对进程的管理就变成了对pcb的管理【Linux进行时】进程概念,Linux,linux,java,网络

🔥一般pcb和代码和数据加起来才可以被叫做进程【Linux进行时】进程概念,Linux,linux,java,网络

🔥什么是进程:进程=内核关于进程的相关数据结构+当前进程的代码和数据

❓为什么进程管理中需要pcb?

因为我们要管理进程,pcb就是一个struct结构体

【Linux进行时】进程概念,Linux,linux,java,网络

Makefile

myprocess:myprocess.c
	gcc -o myprocess myprocess.c
.PHONY:clean
clean:
	rm -f myprocess.c

myprocess.c

#include<stdio.h>
#include<unistd.h>
int main()
{
  while(1)
  {
    printf("hello process\n");
    sleep(1);
  }
  return 0;
}

【Linux进行时】进程概念,Linux,linux,java,网络

这个./就是将可执行程序加载到内存,就做进程,也就是生成了pcb

【Linux进行时】进程概念,Linux,linux,java,网络


ps axj指令

🔥ps axj是查看当前所有的进程,通过管道过滤出我的进程

【Linux进行时】进程概念,Linux,linux,java,网络

🔥head -1是把对应的第一个TST界面的输出结果的第一行拿到

【Linux进行时】进程概念,Linux,linux,java,网络

🔥拿到属性名

【Linux进行时】进程概念,Linux,linux,java,网络

这里的逻辑与是先做完前面的,再做后面的

【Linux进行时】进程概念,Linux,linux,java,网络

❓这里这个是什么东西啊?grep自己也就一个进程,如果我们只想看到我们自己的进程,不想看到grep进程呢?

【Linux进行时】进程概念,Linux,linux,java,网络

我们这里再开一次渠道,也执行可执行程序

【Linux进行时】进程概念,Linux,linux,java,网络

查询/proc

一个进程运行起来都有一个对应的一个PID,除了我们用一些指令查看已经运行的进程以外,我们还可以再系统根目录下的proc目录

【Linux进行时】进程概念,Linux,linux,java,网络

proc跟普通文件不一样,他是内存级的文件系统,只有当操作系统的启动才有,我们平常的时候没有

【Linux进行时】进程概念,Linux,linux,java,网络

这里很明显,这里用数字命名的都是目录,都是d开头的,特定进程的PID

❓特定进程的pid又是什么呢

【Linux进行时】进程概念,Linux,linux,java,网络

🔥我们的进程创建后了后,我们的操作系统会自动的在/proc目录下以我们新增的进程的pid命名的

如果我们的进程删掉了呢?,也就是中止进程

【Linux进行时】进程概念,Linux,linux,java,网络

我们会发现我们不能查看了,根本原因就是操作系统会自动把那个文件夹删除回收

父子进程

❓如何查询pid?
ps axj | head -1 && ps axj | grep myprocess | grep myprocess | grep -v grep

中止掉后,那个进程就没有了

【Linux进行时】进程概念,Linux,linux,java,网络

❓如何我们自己获取一下进程的pid,来证明程序运行起来就是经常呢?

man getpid一下

【Linux进行时】进程概念,Linux,linux,java,网络

返回类型是pid_t,这个类型是操作系统的类型就是一个有符号整数

更改一下myprocess.c

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
  while(1)
  {
    printf("hello process,我是一个进程,我的pid是:%d\n",getpid());
    sleep(1);
  }
  return 0;
}

【Linux进行时】进程概念,Linux,linux,java,网络

Ctrl+c可以中止进程

man getppid一下

【Linux进行时】进程概念,Linux,linux,java,网络

查看父进程pid

🔥我们发现getpid是查询子进程pid,getppid是查看父进程pid

 1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/types.h>
  4 int main()
  5 {
  6   while(1)
  7   {
  8     printf("hello process,我是一个进程,我的pid是:%d\n,我的父进程pid为:%d\n",getpid(),getp    pid());
  9     sleep(1);                                                                              
 10   }                                                                        
 11   return 0;                                                                
 12 }            

【Linux进行时】进程概念,Linux,linux,java,网络

❓我们发现就算我们中止一次,虽然我们进程会变,但是我们的父进程基本上不变,这是为什么呢?

我们找一下这个父进程,父进程pid:31059

【Linux进行时】进程概念,Linux,linux,java,网络

我们要找的不是与31059相关的,而是就是31059的

ps ajx | head -1 && ps ajx | grep 31059

【Linux进行时】进程概念,Linux,linux,java,网络

🔥bash命令行解释器,本质上也是一个进程

❓命令行启动的所有的程序,最终都会变成进程,而该进程对应的父进程都是bash(如何做到的呢?)

❓如果我们不想用Ctrl+c中止,我们可以用什么中止呢?

killed -9 对应的pid

❓如何创建的子进程呢?

man forkz,这个fork后面会详细讲,先用用

🔥fork函数

【Linux进行时】进程概念,Linux,linux,java,网络

修改一下myprocess.c

🔥批量注释:Ctrl+v变为视图模式,然后按j向下选中区域,然后按切换为大写模式,按i,然后写//

【Linux进行时】进程概念,Linux,linux,java,网络

❓如何批量取消注释

🔥Ctrl+v ,l选中区域,然后d就可以了

 #include<stdio.h>
 #include<unistd.h>
 #include<sys/types.h>
 int main()
  {

    printf("AAAAAAAAAAAAAAAAAAAAAAAAA\n");
   fork();
   printf("BBBBBBBBBBBBBBBBBBBBBBBBB\n");
   sleep(1);                                                                                          
   return 0;
} 

【Linux进行时】进程概念,Linux,linux,java,网络

❓这是为什么呢?

【Linux进行时】进程概念,Linux,linux,java,网络

🔥谁调pid那就获得谁的pid,说明这是两个进程,这是父子进程,A是第一个进程(也就是第二行那个)

man fork

创建子进程fork

【Linux进行时】进程概念,Linux,linux,java,网络

修改一下myprocess.c

#include<stdio.h>
 #include<unistd.h>
#include<sys/types.h>
 int main()
{ printf("AAAAAAAAAAAAAAAAAAAAAAAAA:父进程是%d,子进程是%d\n",getppid(),getpid());
id_t ret= fork();
 printf("BBBBBBBBBBBBBBBBBBBBBBBBB:父进程是%d,子进程是%d,ret=%d,&ret=%p\n",getppid(),getpid      (),ret,&ret);
sleep(1);
return 0;
}

【Linux进行时】进程概念,Linux,linux,java,网络

❓为什么fork有两个返回值?

一个是父进程的,一个是子进程的

❓为什么一个变量里面地址一样,读取的数据内容不一样呢?

父子进程是独立的

我们一般不会像上面那样写fork,我们来看一个正常情况下的,

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
  pid_t ret=fork();
  if(ret==0)
  {
    while(1)
    {
      printf("我是子进程,我的pid是%d,我的父进程是%d\n",getpid(),getppid());
      sleep(1);
    }
  }
  else if(ret>0)
  {
    while(1)
    {
      printf("我是父进程,我的pid是%d,我的父进程是:%d\n",getpid(),getppid());
        sleep(2);
    }
  }
  else{

  }
  return 0;
}

【Linux进行时】进程概念,Linux,linux,java,网络

❓如何参加子进程呢?

🔥fork就可以

  • fork之后,执行流会变成两个执行流

  • fork之后,谁先运行由调度器决定

  • fork之后,fork之后的代码共享,通常我们通过if和else if来进行执行分流

🔑详细解析:

原理:fork如何看待代码和数据?

进程运行的时候,是具有独立性的,父子进程也是一样

int main()
{
  pid_t ret=fork();
  int x=100;
  if(ret==0)
  {
    while(1)
    {
      printf("我是子进程,我的pid是%d,我的父进程是%d,%d,%p\n",getpid(),getppid(),x,&x);
      sleep(1);
    }
  }
  else if(ret>0)
  {
    while(1)
    {
      printf("我是父进程,我的pid是%d,我的父进程是:%d,%d,%p\n",getpid(),getppid(),x,&x);
    sleep(1);
    }
  }
  else{

  }
  return 0;
}

【Linux进行时】进程概念,Linux,linux,java,网络

int main()
{
  pid_t ret=fork();
  int x=100;
  if(ret==0)
  {
    while(1)
    {
      printf("我是子进程,我的pid是%d,我的父进程是%d,%d,%p\n",getpid(),getppid(),x,&x);
      sleep(1);
    }
  }
  else if(ret>0)
  {
    while(1)
    {
      printf("我是父进程,我的pid是%d,我的父进程是:%d,%d,%p\n",getpid(),getppid(),x,&x);
      x=4237sleep(1);
    }
  }
  else{

  }
  return 0;
}

【Linux进行时】进程概念,Linux,linux,java,网络

我们发现父进程的x改了,但是子进程没有!!!

这个情况跟我们刚刚fork返回值不一样的情况一样

【Linux进行时】进程概念,Linux,linux,java,网络

写时拷贝,也就是只更改写的时候的情况,不改变读的情况

fork如何理解两个返回值问题

fork调用本质上就是操作系统OS提供的一个函数

【Linux进行时】进程概念,Linux,linux,java,网络文章来源地址https://www.toymoban.com/news/detail-644064.html

到了这里,关于【Linux进行时】进程概念的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux进行时】磁盘文件结构

    上篇文章,我们提及文件是存放在磁盘当中,本篇文件我们来了解一下磁盘的结构!!! ❓什么是磁盘? 💡磁盘(disk)是指利用磁记录技术存储数据的存储器。 磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用

    2024年02月05日
    浏览(46)
  • Linux 使用 PTP 进行时间同步

    PTP(精确时间协议)是一种用于在网络中进行时钟同步的协议。当与硬件支持结合使用时,PTP 能够达到亚微秒的精度,这种精度远高于 NTP 协议。 PTP 时间同步协议的支持分为内核空间和用户空间两部分。在 Linux 系统中,PTP 协议的实际实现称为 LinuxPTP,它是 PTPv2 根据 Linux 的

    2024年04月11日
    浏览(43)
  • ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之传统的网络安全

    ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序,是人工智能技术驱动的自然语言处理工具。 基于其语言模型庞大、可控制、具有高度扩展性的特点,本文通过对话ChatGPT,浅谈网络安全攻击防御进行时。 ChatGPT:你真的了解网络安全吗?浅谈

    2024年02月08日
    浏览(44)
  • ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时之传统的网络安全

    ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序,是人工智能技术驱动的自然语言处理工具。 基于其语言模型庞大、可控制、具有高度扩展性的特点,本文通过对话ChatGPT,浅谈网络安全攻击防御进行时。 ChatGPT:你真的了解网络安全吗?浅谈

    2024年02月06日
    浏览(38)
  • MySQL:查询时进行时间比较

    在 MySQL 中查数据的时候,往往需要对记录的创建时间进行筛选,比如只需要查询今年1-5月份的,或者查询距离当前时间多久以前的。 本文介绍了在 MySQL 中查询记录时如何进行时间比较 解决办法:使用 TIMESTAMPDIFF 函数 查询特定时间范围的记录有多种方法,这里介绍几种 查询

    2024年02月16日
    浏览(45)
  • Arrow:在项目中进行时间处理的强大工具

    目录 一、Arrow简介 二、安装与配置 三、基础功能与使用 1. 日期和时间格式转换 2. 时区处理 3. 时间序列分析 四、进阶应用与案例分析 五、性能与优化 六、最佳实践与经验分享 七、总结与展望 在处理日期和时间时,我们经常需要一个精确、可靠的库来帮助我们。Python的Ar

    2024年02月02日
    浏览(55)
  • ESP8266调用NTP服务器进行时间校准

    NTP是网络时间协议(Network Time Protocol,简称NTP),是一种用于同步计算机时间的协议。NTP服务器指的是提供NTP服务的计算机或设备。NTP服务器的主要功能是保证网络上的所有设备的时间同步,以确保各个设备相互之间的时间协调一致。NTP服务器通常连接到具有高度精确时间源

    2024年02月08日
    浏览(43)
  • Mybatis-Plus如何进行时间日期的比较

    获取数据库中跟当前日期相等的记录时,还是调用eq方法,所以实体类包括数据库中的类型是Date,而不是DateTime,否则只能获取相同时刻的数据。 Mybatis-Plus的时间比较是基于数据库的函数进行的,而不是字符串的比较。在Mybatis-Plus中,可以使用Wrapper对象的 ge、gt、le、lt 方法

    2024年02月11日
    浏览(44)
  • 【数据挖掘】使用 LSTM 进行时间和序列预测

            每天,人类在执行诸如过马路之类的任务时都会做出被动预测,他们估计汽车的速度和与汽车的距离,或者通过猜测球的速度并相应地定位手来接球。这些技能是通过经验和实践获得的。然而,由于涉及众多变量,预测天气或经济等复杂现象可能很困难。在这种情

    2024年02月15日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包