Linux系统: 进程管理

引出: 一个在执行的程序就可以叫一个进程 -- 程序(代码写的)

  • 程序员写的代码要跑起来, 需要先加载进内存中, 然后通过CPU执行(程序是指令, CPU读取指令并执行), 而内存与CPU是操作系统所管理的"资源", 程序变进程就需要被管理
  • 进程 = 代码  +  资源(内存等)  +  管理信息(PCB)

1.进程

进程的组成

  • 程序代码:这是进程执行的指令集合
  • 程序计数器:记录了下一条要执行的指令的地址。
  • 寄存器集合:包括通用寄存器, 程序状态字(PSW)等,用于存储程序执行过程中的临时数据
  • 进程控制块(PCB):这是操作系统用来管理进程的信息结构,包含了进程的标识信息、状态、优先级、程序计数器、CPU寄存器集合、内存管理信息、I/O状态信息等。
  • 内存空间:进程的代码和数据在内存中的存储区域。
  • 资源:进程运行时所需的系统资源,如文件描述符、I/O设备等。

进程与线程

2.进程的五态模型

  • 就绪状态:其它资源(进程控制块、内存、栈空间、堆空间等)都准备好、只差CPU的状态。
  • 执行状态:进程获得CPU,其程序正在执行。
  • 阻塞状态:进程因某种原因放弃CPU的状态,阻塞进程以队列的形式放置。
  • 创建状态:创建进程时拥有PCB但其它资源尚未就绪。
  • 终止状态:进程结束由系统清理或者归还PCB的状态。

3.进程间通信

  • 让双方看到同一份资源即可

4.同步与互斥

生产消费者模型, 生产者放东西, 消费者拿东西, 中间层为临界资源, 由于某些指令不是原子的, 并发执行的时候就会有问题

  • 多生产者之间,竞争关系
  • 多消费者之间,竞争关系
  • 生产者与消费者, 生产者再放数据的时候消费者不能进临界资源消费(竞争)保持一致性

5.作业管理

  • 指计算机通过决策决定哪个就绪进程可以获得CPU使用权。

场景

  • 主动放弃:进程正常终止;运行过程中发生异常而终止;主动阻塞(如等待I/O);

  • 被动放弃:分给进程的时间片用完;有更高优先级的进程进入就绪队列;有更紧急的事情需要处理(如I/O中断);

进程调度算法

死锁

操作相关

进程的创建, 回收, 替换, 终止

进程的创建

pid_t fork(void)

功能: 创建新的进程
头文件: <unistd.h>
返回值: 给父进程返回子进程的pid, 给子进程返回0, 失败返回-1
特点: 父子进程代码共享, 若子进程发生写操作(OS进行写时拷贝)

进程的终止

1.进程常见的退出方式

  • 代码跑完退出
    • 结果正确
    • 结果不正确(可以查看退出码定位出错原因)
    • 如:  return退出,  exit函数退出 
  • 代码没跑完,程序崩溃(此时退出码无意义)
    • 如: 信号终止(可以查看退出信号)

2.操作

void exit(int status);

功能: 进程的退出
头文件:<unistd.h>
参数:status 定义了进程的终止状态,父进程通过wait来获取该值

进程的等待

1.功能

  • 回收子进程资源(可以解决僵尸进程问题)
  • 关心派发给子进程的任务完成情况(是否正常, 正确)通过退出码, 退出信号

2.操作

pid_t wait(int*status);

头文件: <sys/types.h>, <sys/wait.h>
返回值:成功返回被等待进程pid,失败返回-1。
参数:获取子进程退出状态,不关心则可以设置成为NULL(输出型参数)

pid_ t waitpid(pid_t pid, int *status, int options);

头文件: <sys/types.h>, sys/wait.h>
返回值:
       正常返回收集到的子进程的id
       出错返回-1, 这时errno会被设置成相应的值以指示错误所在


参数: 
    pid 为-1表示等待任意一个子进程, >0为等待指定的子进程
    status: 状态码(次第8位):(status>>8)&0xFF.  信号(低7位):status & 0x7F
    options: 默认为0:阻塞等待  WNOHANG:非阻塞等待,若没有子进程可以等就返回0
       

WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)

        
 

  

进程的替换

1.概念

程序替换:是通过特定的接口,加载磁盘上一个全新的程序(代码+数据)

2.原理

3.操作

exec系列函数

  • 头文件<unistd.h>
  • int execl(const char *path, const char *arg, ...);
  • int execlp(const char *file, const char *arg, ...);
  • int execle(const char *path, const char *arg, ...,char *const envp[]);
  • int execv(const char *path, char *const argv[]);
  • int execvp(const char *file, char *const argv[]);
  • int execve(const char *path, char *const argv[], char *const envp[]);

命名解释

  • l  (list) : 表示参数采用列表
  • v(vector) : 参数用数组
  • p(path) : 有p自动搜索环境变量PATH
  • e(env) : 表示自己维护环境变量

返回值

  • 成功就没有返回值(进程已被替换)
  • 失败返回-1

场景

  • bash的简单实现(命令解释器)
  • 父进程读取数据分析, 子进程执行指令
  • 创建子进程来执行exec系列函数(执行其程序的功能 + 保证自己不会被替换)

进程间通信

Linux系统: 管道与共享内存_linux 共享内存 管道-CSDN博客

Linux系统: 信号-CSDN博客

网络: 套接字-CSDN博客


 

进程间同步

Linux系统: 同步与互斥-CSDN博客

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值