进程管理

一、解析进程和线程的区别? 解析进程的结构。

进程与线程的区别:

  1. 定义
    • 进程:进程是操作系统进行资源分配和调度的基本单位。它是正在执行的程序的实例,拥有独立的地址空间和系统资源。
    • 线程:线程是进程中的一个实体,是CPU调度和执行的基本单位。线程自身不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。
  2. 资源拥有
    • 进程拥有独立的内存地址空间,每个进程都有自己独立的代码段、数据段和堆栈。
    • 线程共享进程的内存地址空间,多个线程共享代码段、数据段和堆栈。
  3. 创建开销
    • 创建进程的开销比创建线程大,因为进程需要独立的内存空间和系统资源。
    • 创建线程的开销较小,因为线程共享进程的资源,不需要额外的内存空间。
  4. 通信方式
    • 进程间通信(IPC)需要特定的机制,如管道、信号、消息队列等。
    • 线程间通信可以直接通过读写进程数据段(如全局变量)来实现,因为它们共享相同的内存地址空间。
  5. 独立性
    • 进程间相互独立,一个进程的崩溃不会直接影响到其他进程。
    • 线程间高度依赖,一个线程的崩溃可能会影响到整个进程。
  6. 上下文切换
    • 进程上下文切换开销大,因为涉及到虚拟地址空间的切换。
    • 线程上下文切换开销小,因为它们共享相同的地址空间。

进程的结构:

进程通常由以下几个部分组成:

  1. 进程控制块(PCB):是操作系统管理进程的重要数据结构,包含了进程的基本信息,如进程状态、优先级、程序计数器、寄存器集合、进程ID、内存管理信息等。
  2. 代码段:包含进程执行的指令。
  3. 数据段:包含进程执行时使用的数据,包括全局变量和静态变量。
  4. 堆栈:用于存储局部变量、函数参数、返回地址等信息。
  5. :用于动态内存分配,如使用mallocnew分配的内存。
  6. 文件描述符:进程打开的文件列表,用于文件操作。
  7. 信号处理:进程对信号的响应方式。
  8. 环境变量:进程运行时的环境设置。
  9. 线程列表:如果进程是多线程的,这里会包含所有线程的信息。
  10. 其他资源:如信号量、共享内存等同步和通信机制。

二、结合进程管理命令,说明进程各种状态。

进程的状态
进程在操作系统中的典型状态包括:

  1. 新建(New):进程已被创建,但还没有开始运行。此时,进程的PCB已经建立,但还没有被调度运行。
  2. 就绪(Ready):进程已经准备好运行,等待被调度器分配CPU。它可能因为等待I/O操作或其他资源而进入就绪状态。
  3. 运行(Running):进程正在执行。在单核CPU系统中,同一时刻只有一个进程处于运行状态;在多核系统中,可以有多个进程同时运行。
  4. 等待(Waiting):又称阻塞状态,进程正在等待某个事件的发生,如等待I/O操作完成、等待信号量等。在等待状态下,进程不会占用CPU资源。
  5. 终止(Terminated):进程已经完成其任务或由于某种原因被终止。在终止状态下,操作系统将释放进程所占用的资源。
  6. 挂起(Suspended):进程被暂时挂起,不参与调度。挂起状态可以进一步分为两种:
    • 阻塞挂起(Blocked Suspended):进程在等待某个事件的同时被挂起。
    • 就绪挂起(Ready Suspended):进程在就绪状态下被挂起。

在Linux系统中,可以使用一些命令来查看和管理系统中的进程,这些命令可以帮助我们了解进程的状态:

  • ps:显示当前系统中的进程状态。
    • ps aux:显示所有进程的详细信息。
    • ps -l:显示更详细的进程信息。
  • top:实时显示系统中进程的动态。
    • top:启动top命令,实时显示进程信息。
  • pstree:以树状图的形式显示进程。
    • pstree:显示进程树。
  • pgrep:根据条件查找进程。
    • pgrep <name>:根据进程名查找进程。
  • pkill:根据条件杀死进程。
    • pkill <name>:根据进程名杀死进程。
  • kill:发送信号给进程。
    • kill -9 <pid>:强制杀死进程。
  • nicerenice:调整进程的优先级。
    • nice <command>:以低优先级运行命令。
    • renice <priority> <pid>:调整正在运行的进程的优先级。

三、说明IPC通信和RPC通信实现的方式。

IPC(进程间通信)和RPC(远程过程调用)是两种不同的通信机制,它们允许不同的进程或系统之间进行数据交换和通信。以下是它们各自的实现方式:

IPC通信的实现方式:

  1. 管道(Pipe)
    • 匿名管道:最简单的IPC形式,用于有亲缘关系的进程间的通信。
    • 命名管道(FIFO):允许不相关的进程间的通信。
  2. 消息队列
    • 消息队列允许一个或多个进程向它写入或读取消息。
  3. 信号(Signal)
    • 信号是一种软件中断,用于通知进程某个事件已经发生。
  4. 共享内存
    • 允许多个进程共享一个给定的存储区,是最快的一种IPC。
  5. 信号量(Semaphore)
    • 信号量用于控制多个进程对共享资源的访问。
  6. 套接字(Socket)
    • 套接字是一种通信机制,允许不同主机上的进程进行通信。
  7. 共享文件系统
    • 进程可以通过读写文件系统中的文件来交换信息。
  8. 内存映射文件
    • 通过将文件映射到内存中,多个进程可以共享内存区域。

RPC通信的实现方式:

  1. 客户端-服务器模型
    • RPC通信通常采用客户端-服务器模型,客户端发送请求,服务器处理请求并返回结果。
  2. 远程过程调用协议
    • 定义了RPC通信的协议,包括参数的编码、传输和解码。
  3. 数据序列化
    • 客户端需要将调用参数序列化(如转换成字节流),通过网络发送给服务器。
  4. 网络传输
    • 使用TCP/IP或其他网络协议来传输序列化后的数据。
  5. 服务端处理
    • 服务器接收到请求后,反序列化参数,调用相应的本地过程,并处理请求。
  6. 结果返回
    • 服务器将结果序列化后通过网络发送回客户端。
  7. 客户端接收
    • 客户端接收到结果,反序列化并使用结果。
  8. 动态绑定
    • RPC允许客户端在不知道服务端接口的情况下调用远程过程。
  9. 错误处理
    • RPC机制需要处理网络错误、数据序列化错误等。
  10. 安全机制
    • 包括认证、授权、数据加密等,以确保通信的安全性。

实现示例:

  • IPC示例:在Linux系统中,可以使用shmgetshmat系统调用来创建和访问共享内存。
  • RPC示例:使用gRPC框架,客户端和服务器可以通过protobuf定义服务接口,然后使用gRPC工具生成客户端和服务器端的代码,实现RPC通信。

IPC和RPC都是进程间通信的重要方式,但它们的主要区别在于IPC通常用于同一系统内的不同进程间通信,而RPC则用于不同系统或网络中的进程间通信。

四、总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换。

前台作业与后台作业的区别:

  1. 前台作业(Foreground Job)
    • 前台作业与终端直接交互,可以接收用户的输入并显示输出。
    • 终端被前台作业独占,直到作业完成或被暂停。
    • 可以通过Ctrl + C来中断前台作业。
  2. 后台作业(Background Job)
    • 后台作业不与终端直接交互,它们在后台运行,不会阻塞用户在终端进行其他操作。
    • 后台作业的输出通常会被重定向到文件或终端,以避免与其他命令的输出冲突。
    • 可以通过jobs命令查看后台作业的状态。

状态转换:

  1. 从前台转到后台
    • 使用Ctrl + Z可以将当前前台作业挂起到后台,挂起的作业会被暂停。
    • 然后使用bg命令将挂起的作业放到后台继续运行。
  2. 从后台转到前台
    • 使用fg命令可以将后台作业调回到前台运行。
    • 如果有多个后台作业,可以使用fg %job_number来指定将哪个作业调回前台。
  3. 将后台作业暂停
    • 后台作业可以通过kill命令发送SIGSTOP信号来暂停,例如kill -STOP %job_number
  4. 将暂停的后台作业恢复
    • 使用bg命令可以将暂停的后台作业恢复到后台继续运行。

示例:

假设你正在运行一个长时间运行的命令,如top,并且想要将其放到后台运行:

[root@rocky8 ~]#top
top - 16:29:59 up  2:20,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 151 total,   1 running, 150 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1945.4 total,   1420.2 free,    206.0 used,    319.2 buff/cache
......
在top运行时,按下Ctrl + Z将其挂起:
[1]+  Stopped                 top
[root@rocky8 ~]#
#然后使用bg命令将其放到后台运行
[root@rocky8 ~]#bg
[1]+ top &
#现在top命令在后台运行。如果你想将其调回前台,可以使用fg命令
fg

五、定时任务

实现定时任务,每日凌晨1点,删除指定文件

[root@rocky8 ~]#which rm
alias rm='rm -i'
	/usr/bin/rm
#创建文件
[root@rocky8 ~]#touch test.txt

#编辑计划任务
[root@rocky8 ~]#crontab -e
crontab: installing new crontab
[root@rocky8 ~]#crontab -l
0 1 * * * /usr/bin/rm -rf /root/test.txt >/dev/null 2>&1

实现定时任务每月月初对指定文件进行压缩

#创建任务每月1号对test1.txt文件进行压缩
[root@rocky8 ~]#touch test1.txt

[root@rocky8 ~]#which tar
/usr/bin/tar

#创建计划任务
[root@rocky8 ~]#crontab -e
crontab: installing new crontab
[root@rocky8 ~]#crontab -l
0 0 1 * * /usr/bin/tar -czf /root/test1/txt 
此条目发表在第四周作业分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注