《Linux从0到99》五 进程概念 上

本文深入探讨了冯·诺依曼体系结构,阐述了操作系统的基本概念、设计目的及定位,并详细解析了进程管理,包括进程的基本概念、PCB、状态查看、创建与状态转换。同时,介绍了如何通过系统调用获取和创建进程,以及进程的各种状态,如运行、睡眠、死亡和僵尸状态等。
摘要由CSDN通过智能技术生成

1. 冯·诺依曼体系结构

在这里插入图片描述

  • 中央处理器(cpu):进行算术运算&逻辑运算,含有运算器和控制器等。
  • 存储器:内存,用来存储数据。
  • 输入设备:常见的输入设备有鼠标,键盘,扫描仪,写板等。
  • 输出设备:常见的输出设备有显示器,打印机等。
    // 网卡由输入设备和输出设备共同组成。

注意:

  • 这里的存储器指的是内存。
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)。
  • 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
    冯诺依曼的两个重要思想:
  • 所有的数据采用二进制存储。(契合电路的特性:高低电平)
  • 数据都保存在存储器中。(内存当中)

2. 操作系统

01 概念

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

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

在这里插入图片描述

02 设计OS的目的

  • 方便的管理电脑资源,和电脑硬件进行交互
  • 为用户程序(应用程序)提供一个良好的执行环境

03 OS的定位

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

04 对OS所谓管理的理解

管理:真正的管理,具有强大的领导能力,能够具有决定权,可以区分决策和执行。
在操作系统中:
被管理者:底层硬件以及大部分软件。
管理员:操作系统。
在这里插入图片描述

  • 系统接口:操作系统为程序员提供的函数,功能比较基础,对用户的要求相对也比较高
  • 库函数:行业内大佬,将系统调用函数再次封装,提供出来的函数,称之为库函数。

3. 进程

在这里插入图片描述

01 基本概念

  • 从用户角度:进程就是一个正在运行中的程序。
  • 操作系统角度:操作系统运行一个程序,需要描述这个程序的运行过程,这个描述通过一个结构体task_struct{}来描述,统称为PCB,因此对操作系统来说进程就是PCB(process control block)程序控制块。进程担当分配系统资源(CPU时间,内存)的实体。
    在这里插入图片描述

LINUX下进程的结构:
Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。

  • “数据段” 存放全局变量、常数以及动态数据分配的数据空间。数据段分成普通数据段(包括可读可写/只读数据段,存放静态初始化的全局变量或常量)、BSS数据段(存放未初始化的全局变量)以及堆(存放动态分配的数据)。
  • “代码段” 存放的是程序代码的数据。
  • “堆栈段” 存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。
    在这里插入图片描述

程序和进程的区别:

  • 程序本质上就是一个文件,是静态的,存储在磁盘当中。
  • 进程就是程序跑起来后生成的一个实例,是动态的,由操作系统进行管理。

02 描述进程PCB

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

1)task_struct-PCB的一种

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

2)task_ struct内容分类

在这里插入图片描述

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

03 查看进程

  1. 通过proc文件系统查看
    命令ls /proc/
    在这里插入图片描述

  2. 通过ps查看
    命令ps aux
    在这里插入图片描述

可以通过ps aux | grep [名字] 查找对应的进程

04 通过系统调用获得进程标识符

  • 进程ID:PID
  • 父进程ID:PPID
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}

在这里插入图片描述

05 通过系统调用创建进程-fork

fork函数:
函数形式:pid_t fork()
头文件:#include <sys/types.h>
功能: 创建一个子进程
参数: 没有参数
返回值:创建是失败返回-1,创建成功返回俩个值,子进程中返回0,父进程中返回大于0的值(子进程的PID)。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	int ret = fork();
	printf("hello proc : %d!, ret: %d\n", getpid(), ret);
	sleep(1);
	return 0;
}

fork 之后通常要用 if 进行分流

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	int ret = fork();
	if(ret < 0)
	{
		perror("fork");
		return 1;
	}
	else if(ret == 0)
	{ //child
		printf("I am child : %d!, ret: %d\n", getpid(), ret);
	}
		else
		{ //father
			printf("I am father : %d!, ret: %d\n", getpid(), ret);
		}
	sleep(1);
	return 0;
}

06 进程状态

下面的状态在kernel源代码里定义:

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

1)R运行状态(running)

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

2)S睡眠状态(sleeping)

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。

3)D磁盘休眠状态(Disk sleep)

D磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

4)T停止状态(stopped)

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

5)X死亡状态(dead)

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

6)t跟踪状态

t跟踪状态:当进程被gdb调试的时候,会产生t状态。

7)Z僵尸状态

Z僵尸状态:子进程先于父进程退出,父进程来不及回收子进程的资源,导致子进程变成僵尸进程,处于僵尸状态。

07 进程状态查看

命令:ps aux /ps axj

  • ps aux 查看操作系统中所有的进程信息。
    在这里插入图片描述
  • ps axj 可以查看操作系统中子进程的父进程ID。
    在这里插入图片描述

08 进程状态转换

在这里插入图片描述
以上就是这篇文章的所有内容啦,感谢老铁有耐心看完。有啥错误请多多指正哈!码字不易,希望大佬们点个赞
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RONIN_WZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值