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

相关文章
|
4天前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
44 10
|
4天前
|
Linux
Linux 操作系统
在 Linux 中,UID(用户 ID)是标识用户身份的重要概念。UID 唯一标识每个用户,通过 UID 可区分不同用户类别:UID 0 为超级用户,1-999 为系统用户,1000 及以上为普通用户。因此,正确选项为:UID 标识用户、可区分用户类别、普通用户 UID 大于 1000。
|
3天前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
50 34
|
7天前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
39 16
|
30天前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
71 7
|
1月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
67 5
|
1月前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
|
9月前
|
Linux Shell 调度
【Linux】7. 进程概念
【Linux】7. 进程概念
81 3
|
9月前
|
存储 缓存 Linux
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
|
6月前
|
Linux Shell 调度
【在Linux世界中追寻伟大的One Piece】Linux进程概念
【在Linux世界中追寻伟大的One Piece】Linux进程概念
59 1