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

相关文章
|
5天前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
50 23
|
13天前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
75 20
|
4天前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
25 5
|
5天前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
|
17天前
|
编解码 自然语言处理 JavaScript
智谱发布GLM-OS概念及Agent产品,CogAgent-9B模型开源助力GUI交互场景
11月29日,智谱正式提出 GLM-OS 概念,并发布 AutoGLM 和 GLM-PC 两款 Agent 产品。近期GLM-PC 的基座模型—— CogAgent-9B 开源,供社区进一步开发。
|
1月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
105 13
|
1月前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
1月前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
8月前
|
存储 缓存 Linux
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
|
5月前
|
Linux Shell 调度
【在Linux世界中追寻伟大的One Piece】Linux进程概念
【在Linux世界中追寻伟大的One Piece】Linux进程概念
52 1