上篇文章:Linux基础3-基础工具4(git),冯诺依曼计算机体系结构-CSDN博客

本章重点:

1. 操作系统简介

2. 什么是进程?

3. 在Linux使用命令查看进程(ps)

4. getpid,getppid, fork简介

上一章我们了解了冯诺依曼计算机体系结构,我们需要知道数据是如何进行流动的

请解释:你从qq发送一条消息到你的朋友并被接收,数据是如何流动的(暂时不考虑网络层)

        我的键盘输入 --> 我的内存 --> 我的CPU处理 --> 我的内存 --> 我的网卡处理输出

--> 网络 --> 我朋友的网卡处理输入 --> 我朋友的内存 --> 我朋友的CPU处理 --> 我朋友的内存 --> 我朋友的显示器输出

目录

一. 操作系统

二. 进程介绍

三. Linux下查看进程,杀死进程

四. 查看进程pid和创建子进程

4.1 getpid getppid 查看进程的pid

4.2 fork创建子进程

五.下章重点 

5.1 进程状态


一. 操作系统

        根据冯诺依曼计算机体系结构,我们知道计算机由输入,输出设备,存储器,cpu等组成,计算机是如何对这些硬件和其他软件进行管理的?(如果不管理的话不就乱套了)

        操作系统是进行软硬件资源管理的软件.

为什么要对这些资源进行管理?

        (操作系统通过管理软硬件资源,给用户提供良好的,稳定的,安全的执行环境)

操作系统如何对这些软硬件资源进行管理?(先描述后组织)

        1. 使用struct_task进行描述进程,再使用链表等结构进行管理

        2. 操作系统通过对数据的管理来管理软硬件,创建进程来管理资源

计算机的软硬件结构如下

系统调用和库函数辨析

1. 在开发角度,操作系统作为一个整体,会暴露自己部分接口,供外部进行开发使用,这些接口被称为系统调用

2. 系统调用在使用上比较基础,而且使用的要求对用户高.所以部分开发者对系统调用进行适度封装,逐渐形成库,更方便开发者进行开发和二次开发

二. 进程介绍

什么是进程?

        进程就是运行起来(被加载到内存)的程序。

有很多加载到内存中的程序,操作系统如何管理它们呢?

        管理需要先组织,再管理。操作系统通过进程控制块(PCB)来对进程进行管理,PCB中含有很多进程的信息。

        在Linux中,PCB是task_struct

//PCB内核结构体(内核结构体可以创建内核对象,将这个结构和我们的代码数据关联起来)
//这样我们就能通过管理PCB进而管理进程
struct task_struct
{
    //该进程的所有属性
    //该进程对应的代码和属性地址
    struct task_struct* next;//如通过链表链接所有进程,方便对进程进行管理
};

这样就实现了:对进程管理 ----> 对PCB链表管理(增删查改等)

所以: 进程=内核数据结构+进程相应大端数据代码

且操作系统在调度进程的时候,进程具有动态属性

三. Linux下查看进程,杀死进程

以下是Linux下常用的查看进程的命令

ps axj                    //查看所有进程
ps axj | head -1          //查看进程各项属性的标题
ps axj | grep 进程名称    // 通过grep过滤出我们需要查找的进程
ps axj | grep head -1 && ps axj | grep 进程名称    //查看标题同时进程查找
kill -9 进程pid    //杀死这个pid的进程

举例:

1.

2.

3.

4.

另外一种查看进程的方式

在Linux下,一切皆文件。进程也不例外,在系统中,创建一个进程后,就有一个进程文件

使用 ls /proc 即可查看进程目录

四. 查看进程pid和创建子进程

4.1 getpid getppid 查看进程的pid

我们创建一个进程后,如何获取进程的pid??

#include <unistd.h>    //头文件
//这两个都是系统调用
getpid()    //获取进程的pid
getppid()   //获取进程父进程的pid
#include <stdio.h>
#include <unistd.h>

int main()
{
  while(1)
  {
    printf("我是一个进程 pid:%d 我父进程的pid:%d\n", getpid(), getppid());
    sleep(1);
  }
  return 0;
}

 运行结果:

4.2 fork创建子进程

fork()    
//用于创建子进程,
//创建失败返回负数,父进程返回子进程pid,子进程返回0

//fork之后,会有父进程,子进程两个进程执行后续代码
//fork后续的代码,被父子进程共享
//通过返回值不同,父子进程执行后续共享代码的一部分(个进程的执行是并发的)

举例:

该代码在创建子进程后,各自输出自己的pid和自己父亲的pid

#include <stdio.h>
#include <unistd.h>

int main()
{
  pid_t id = fork(); //创建子进程
  
  if(id == 0)
  {
    //child
    while(1)
    {
      printf("我的子进程,我的pid为:%d,我父亲的pid为:%d\n", getpid(), getppid());
      sleep(1);
    }
  }
  else if(id > 0)
  {
    //parent 
    while(1)
    {
      printf("我的父进程,我的pid为:%d,我父亲的pid为:%d\n", getpid(), getppid());
      sleep(1);
    }
  }
  else 
  {
    printf("创建进程失败!");
    return 1;
  }
  return 0;
}

执行结果如下:

fork一般使用if进行分流(根据返回值不同)

通过写实拷贝保证代码共享和进程独立性

五.下章重点 

5.1 进程状态

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部