Linux操作系统和进程基本概念(上)

简介: Linux操作系统和进程基本概念

🎵一、冯诺依曼体系和操作系统


🎈1.1冯诺依曼体系结构


我们常见的台式计算机、笔记本以及不常见的公司使用的服务器,大部分都遵从冯诺依曼体系。


1669271442033.jpg


冯诺依曼体系结构主要讲述的是什么呢?它主要向我们介绍了计算机的基本架构:


输入设备:包括键盘、鼠标、扫描仪、写板等。


中央处理器(CPU):含有运算器、控制器等


输出设备:显示器、打印机、网卡等。


我们输入设备输入的数据必须先加载到内存(存储器),才能被CPU处理,CPU能且只能对内存进行读写,不能访问外设(输入设备)。输出设备从内存读取信息。


🎈1.2操作系统


Ⅰ概念


任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。简单来说,操作系统是一款软硬件资源管理的软件,包括:


🖊内核(进程管理,内存管理,文件管理,驱动管理)


🖊其他程序(例如函数库,shell程序等)


Ⅱ目的


设计操作系统的目的是为了与硬件交互,通过合理的管理软硬件资源,为用户提供良好的执行环境。


1669271466113.jpg


Linux操作系统内核是用C语言写的,所以它是如何管理硬件呢?操作系统本身并不管理硬件,驱动管理硬件,从硬件获取数据,对数据做管理,用struct结构体描述,把数据做分类描述,对应设备做特定的结构管理起来,比如队列,链表等数据结构。最后交付给操作系统,而我们用户通过操作系统提供的接口查看这些数据信息。


🎵二、进程


🎈2.1基本概念


进程:一个运行起来(加载到内存)的程序。也就是在内存中的程序,进程与程序相比,具有动态属性。


比如Windows下我们打开任务管理器就可以查看当前正在运行的程序,这些都是一个个独立的进程:

1669271487822.jpg


🎈2.2描述进程-PCB


进程信息被放在一个叫做进程控制块的数据结构中,也就是PCB。Linux操作系统下的PCB是:task_struct。进程被转化为内核数据结构(task_struct)和进程对应的磁盘代码。


PCB概念的提出,使得对进程管理,变成了对进程对应的PCB相关管理。


1669271511947.jpg


task_struct 内容分类:


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


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


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


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


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


🖊上下文数据:进程执行时处理器的寄存器中的数据。


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


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


🖊其他信息。


🎈2.3进程基本指令


👓Ⅰps ajx


ps ajx :显示当前目录下所有进程


1669271533013.jpg


我们也可以通过管道检索指定正在运行的进程。比如:


1669271541076.jpg


当然,我们看向这些内容并不知道是什么数据,我们可以把它的标头打印出来方便我们查看。


1669271549426.jpg


👓Ⅱkill 指令


kill -l 我们查看一下这个指令。


1669271561672.jpg


kill指令集下有很多指令,我们这里需要着重关注的有三条指令 :


🖊kill -9 终止进程


🖊kill -19 停止/暂停进程


🖊kill -18 继续进程


我们先来看如何终止一个进程。

1669271570065.jpg

这里的PID是进程的编号,Linux下的大多数对进程的操作都是对进程的PID,也可称之为它的ID进行操作。


1669271580609.jpg


执行过后,进程就被终止了。还有两个重要的kill指令,后续会提及。


👓Ⅲ getpid && getppid


getpid和getppid是Linux下获取当前进程和父进程id的函数。

1669271597158.jpg


//头文件
#include<unisted.h>
#include<sys/types.h>
//sunopsis
pid_t getpid(void);
pid_t getppid(void);
//返回值
getpid()   返回当前进程ID
getppid()  返回当前进程父进程ID


①getpid

我们写一个程序来查看一下它的ID:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
  while(1)
  {
    printf("我是一个进程,我的ID是%d\n",getpid());                                                 
    sleep(1);                                 
  }   
  return 0;
}

1669271641748.jpg

那么这个ID它真的可以代表这个进程吗?我们来验证一下:

1669271656660.jpg

1669271665656.jpg

1669271672229.jpg

通过验证,我们发现,确实如此,pid确实可以代表各个进程,就如同我们的学号对应一位同学。


②getppid


在了解pid之后,ppid又是何方神圣呢?ppid是当前进程的父进程的id。按照关系,当前进程是其父进程的子进程。


我们编写一个程序来查看一下父进程的id。

/*myprocess.c*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
  while(1)
  {
    printf("我是一个进程,我的ID是%d,父进程的ID是%d\n",getpid(),getppid());                                                 
    sleep(1);                                 
  }   
  return 0;
}

1669271716831.jpg

我们发现子进程的id每次运行程序都会变化,而父进程的id是不会变化的。也就是说,父进程相对于子进程来说只有一个,而子进程可以经父进程创建生成很多个,执行程序时由子进程来执行,就算挂了也不会影响父进程。而shell执行命令就是以子进程来执行的。


那么这里子进程的父进程到底是什么呢?其实就是当前的命令行解释器:

1669271729530.jpg

1669271742163.jpg

👓 Ⅳ fork


fork用于创建子进程。

1669271755802.jpg


1669271763090.jpg


/*fork*/
//头文件
#include<unisted.h>
pid_t fork(void);
//返回值
//如果创建成功,子进程的ID被返回给父进程,0返回给子进程。如果失败,-1返回给父进程,没有子进程创建并报错。

我们研究一下返回值就会发现一个惊奇的现象:如果创建成功,子进程的PID被返回给父进程,0返回给子进程。失败-1返回给父进程,没有子进程创建。我们发现fork的返回值有两个!!而这个会对我们的程序有什么影响呢?


1669271783835.jpg


我们看到,同一段代码执行了两次,这两次一次是父进程执行的,一次是子进程执行的。而在这里我们也可以看出系统和语言的不同,语言是不可能出现有两个返回值这样的情况的。


所以根据这种特性,我们在使用fork的时候,需要使用if条件判断执行。


1669271796276.jpg


如果我现在把正在执行的进程的可执行程序给删除,那么进程还会继续执行吗?


1669271808569.jpg


我们发现进程还在执行,但是我们查看exe文件会发现闪红并告诉我们deleted。

1669271818113.jpg

相关文章
|
3天前
|
算法 调度 UED
探索操作系统的心脏——进程管理机制
本文将深入探讨操作系统中至关重要的部分——进程管理机制。我们将从基本概念入手,逐步解析进程的定义、状态及其在操作系统中的角色。随后,我们会详细讨论进程调度算法,包括先来先服务、短作业优先、时间片轮转和优先级调度等,分析它们的优势与应用情景。最后,通过实例展示这些算法在实际系统运作中的运用,帮助读者更好地理解进程管理的核心原理。
|
3天前
|
算法 调度 Python
探索操作系统的内核——一个简单的进程调度示例
【9月更文挑战第17天】在这篇文章中,我们将深入探讨操作系统的核心组件之一——进程调度。通过一个简化版的代码示例,我们将了解进程调度的基本概念、目的和实现方式。无论你是初学者还是有一定基础的学习者,这篇文章都将帮助你更好地理解操作系统中进程调度的原理和实践。
|
6天前
|
算法 调度 Python
深入理解操作系统:进程管理与调度
【9月更文挑战第14天】操作系统是计算机系统的核心,负责管理和控制计算机硬件资源,并提供用户和应用程序所需的服务。本文将介绍操作系统中进程管理与调度的基本概念、原理和实现方法,并通过代码示例进行说明。通过阅读本文,读者可以深入了解操作系统的工作原理和机制,提高对计算机系统的理解和掌握能力。
|
2天前
|
算法 调度 开发者
深入理解操作系统的进程调度策略
【9月更文挑战第18天】本文将通过浅显易懂的方式,带你深入了解和掌握操作系统中一个至关重要的概念——进程调度。我们将从基础概念出发,逐步探讨进程调度的策略、算法及其在操作系统中的实现方式。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇通往操作系统深层知识的大门,让你对进程调度有更深刻的理解和认识。
11 3
|
6天前
|
开发者 Python
深入浅出操作系统:进程与线程的奥秘
【8月更文挑战第46天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将揭开进程与线程这两个核心概念的神秘面纱,通过生动的比喻和实际代码示例,带领读者理解它们的定义、区别以及如何在编程中运用这些知识来优化软件的性能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技巧。
|
2天前
|
消息中间件 Python
深入理解操作系统的进程间通信(IPC)机制
本文将探讨操作系统中的核心概念——进程间通信(IPC),揭示其在系统运作中的重要性及实现方式。通过分析不同类型的IPC手段,如管道、信号、共享内存等,帮助读者更好地理解操作系统的内部工作原理及其在实际应用中的表现。
11 1
|
3天前
|
算法 Linux 调度
探索操作系统的心脏:进程管理与调度策略
【9月更文挑战第17天】在数字世界的复杂迷宫中,操作系统扮演着守护者的角色,确保每一次计算的旅程都顺畅无阻。本文将深入探讨操作系统的核心机制——进程管理与调度,揭示它们如何在微观层面影响宏观的系统性能。从理解进程的本质出发,我们将逐步揭开现代操作系统如何通过精妙的调度策略,平衡多任务处理的效率与公平性。通过深入浅出的语言,即便是技术新手也能领略到这一数字世界奇迹背后的智慧。
|
3天前
|
算法 调度 UED
深入理解操作系统中的进程调度
【9月更文挑战第17天】在操作系统的心脏深处,进程调度机制如同一位精心编排交响乐的指挥,确保系统的和谐与效率。本文将揭开进程调度的神秘面纱,从理论到实践,深入浅出地探讨其背后的原理与实现。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深刻的见解,让你对操作系统有更全面的理解。让我们一起走进这场技术与智慧的盛宴,探索进程调度的秘密吧!
|
4天前
|
消息中间件 存储 大数据
深入理解操作系统中的进程间通信(IPC)机制
本文旨在探讨操作系统中进程间通信(IPC)的核心机制与其重要性。通过对不同IPC手段如管道、信号、消息队列及共享内存等的详细解析,揭示它们如何高效地促进进程间的信息交换与同步。文章不仅阐述各种IPC技术的实现原理,还探讨了它们在实际系统应用中的场景与优化策略,为系统开发者提供全面而深入的理解。
|
4天前
|
消息中间件 程序员 数据处理
探究操作系统中的进程间通信(IPC)机制及其在现代软件开发中的应用
本文深入探讨了操作系统中的核心概念——进程间通信(IPC),揭示了其在现代软件开发中的关键作用。通过对各种IPC机制如管道、消息队列、共享内存等的详细分析,本文旨在为读者提供一个清晰的理解框架,帮助他们掌握如何在实际应用中有效利用这些技术以实现进程间的协同工作。此外,文章还将探讨IPC在高并发环境下的性能优化策略,以及如何避免常见的IPC编程错误。通过结合理论与实践,本文不仅适合希望深入了解操作系统原理的技术人员阅读,也对那些致力于提升软件质量和开发效率的程序员具有重要参考价值。
12 0