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

相关文章
|
11月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
11月前
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
1072 0
|
11月前
|
Unix 物联网 Linux
都什么年代了,你还不懂啥是Linux操作系统
至于华为鸿蒙操作系统是不是独树一帜,这个留给各位阅读本文的网友们来讨论
582 0
|
11月前
|
安全 Linux iOS开发
linux属于什么操作系统
Linux是一种自由和开放源代码的操作系统,具有高度的灵活性和可定制性。与常见的操作系统如Windows和macOS相比,Linux具有自由、安全和稳定等优势。Linux已广泛应用于服务器、桌面电脑、超级计算机和嵌入式设备等领域,并且在未来的发展前景广阔。由于其自由和开放源代码的特性,Linux还促进了计算机技术和社区的发展,为全球的计算机用户提供了更多的选择和可能性。
|
11月前
|
安全 Ubuntu Unix
关于Linux操作系统,你必须要知道的事
我们可以看到无论是Debian还是Buildroot都有各自的特点,为客户提供了更大的选择空间和灵活性,大家可以根据自己的需求选择合适的版本来满足终端用户的体验和功能需求。从平技术将会一直关注更多更安全、灵敏、易于开发的Linux版本,做好适配工作,不断为客户带来“简单开发、方便应用”的使用体验。
|
11月前
|
安全 Ubuntu Linux
如何安装Linux操作系统?
此时,您可以选择重新启动计算机,然后从硬盘上的Linux系统启动。以上是一个大致的安装过程。请注意,不同的Linux发行版可能会在细节上有所差异,因此在进行安装之前,请确保您阅读并理解了相应发行版的安装指南或文档。
|
11月前
|
Ubuntu Linux 开发者
Linux发行版比较:选择适合你的操作系统
在做出选择之前,建议您先在虚拟机或双系统环境中尝试不同的发行版,根据自己的体验和需求做出决策。选择适合自己的Linux发行版是一个个人化和主观的过程,最重要的是找到符合自己需求和喜好的发行版,让您在使用Linux系统时感到舒适和方便。
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
281 20
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
252 0