进程和线程

一、进程:程序文件加载进内存

在这里插入图片描述

1、定义(进程=PCB等相关数据结构+程序的代码和数据)

  • 是什么:进程=PCB等相关数据结构+程序的代码和数据
  • 为什么:任务需要被计算机完成,任务是可能存在多个的,就有了管理的需求,先描述,再组织,PCB等数据结构,任务=代码+数据
  • 怎么办:进程管理(如何新建,如何调度,如何释放,如何进行其他管理)

文件 = 内容 + 属性
进程 = 对应的文件 + 进行属性
进程:可执行程序与管理进程需要的数据结构的集合
系统允许多个进程同时运行,操作系统需要对进程进行管理(先描述,再管理)

2、如何管理进程?

  • 先描述,再组织
    描述(stuct)
    struct task_struct{
    1.标识信息,Pid(一个进程的标识符),PPid(和父进程形成某种关系)
    2.运行信息,时间
    3.优先级信息
    4.上下文
    5.
    }

3、bash和子进程的关系

bash->能不能挂?不能!bash也是一个进程!->bash创建子进程-> 交给子进程->进程是具有独立性的
bash运行原理:bash叫做命令行解释器,通常是如何解释的呢?通过创建子进程,让子进程去完成对应的任务。

4、如何理解进程创建?

创建进程,是系统多了一个进程,多一个进程,系统就要多一组管理进程的数据结构+该进程对应的代码和数据

5、多进程的理解

用fork函数创建子进程时
父进程和子进程共享语句,但数据,各自私有
return函数是一个语句,但return的值是数据,所以return的值不一样

6、函数

①state函数-----查看进程状态

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、进程的优先级

优先级 VS 权限

①是什么?

优先级:使用“事物”的先后顺序
权限:能不能使用某种“事物”

②为什么?

优先级什么场景下才有价值?被管理对象多的时候

③怎么办?

进程优先级?决定了,哪个进程优先使用某种资源(CPU,外设IO)
struct task_struct{
//优先级,通过整数来表示的,一般数值越小,优先级越高(仲裁,抢占)
}
在这里插入图片描述
prin_new(优先级) = pri_old(pri) + ni(nice优先级的修正数据_不同操作系统不一样)
nice取值范围从-20——19

sudo top-----通过调整ni值调整优先级

在这里插入图片描述

ps-l-----可以当前用户上下文产生的进程
ps aux-----显示所有用户产生的进程

8、其他概念

①竞争性

在这里插入图片描述

②独立性

加粗样式

③并行

在这里插入图片描述

④并发

在这里插入图片描述

9、进程退出的情况:

①代码跑完了,结果是对的

return 0;
0为退出码,说明结果是对的

②代码跑完了,结果是不对的

③代码没跑完,程序退出了

10、进程终止

①exit VS return

  • exit退出整个进程
  • return退出当前函数
exit(5
a、_exit-----系统调用
b、exit-----C语言的库函数

exit的参数就是进程的退出码

②CTRL + C-----信号终止

11、进程等待

我们通常要让子进程先退出,让父进程先等待
在这里插入图片描述

①wait

在这里插入图片描述

a、是什么?

是父进程通过wait等系统调用,用来等待子进程状态的一种现象

b、为什么?
  • 1.防止子进程发生僵尸问题,进而产生内存泄漏
  • 2.读取子进程状态
c、怎么办?

wait/waitpid,status(signal,exit code)

②waitpid

在这里插入图片描述

int st = 0waitpid(pid, &st, 0);    //开始等待,子进程退出,操作系统就会从进程PCB中读取退出信息,保存在status指向的变量中

在看子进程的status时,status的第七位可以看进程是否为信号所杀
退出码:高八位-----代码跑完,结果不对
退出信号:低八位-----
在这里插入图片描述
在这里插入图片描述

12、进程程序替换

①exec-----替换

在这里插入图片描述
第一个参数是让我们找到这个命令,第二个参数是命令行的形式,告诉我们怎么执行这个命令,以NULL结尾表示参数传完了

execl("/usr/bin/ps", "ps", "-e", "-l", "-f", NULL);

替换开始后,用/usr/bin/ps中的代码段和数据段整体替换掉接下来的代码和数据
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

a、execl
execl("/usr/bin/ls", "ls", "-i", "-l", "-a", NULL);
b、execlp
execlp("ls", "ls", "-i", "-l", "-a", NULL);
c、execv
char* arg[] = {
  "ls",
  "-a",
  "-l",
  "-i",
  NULL
};
execv("/usr/bin/ls", arg);
d、execvp
char* arg[] = {
  "ls",
  "-a",
  "-l",
  "-i",
  NULL
};
execvp("ls", arg);

13.linux中,一切皆文件的理由

文件是由数组来管理的

struct file*fd_array[]
1
数组fd_array中包含着文件的描述符fd(整数)_0-n
其中,0号文件描述符叫做标准输入
1号描述符叫做标准输出
2号描述符叫做标准错误

fd:文件的描述符
每个文件有个文件的struct
struct file{
//文件的属性信息
//文件的缓冲与存储位置
}

14.一个进程默认最多打开32个文件

15.缓冲方式

①显示器:行缓冲

②文件:全缓冲

  • 重定向影响缓冲方式
    write函数把进程缓冲区(用户级的缓冲区_C语言)的数据复制到操作系统(内核)缓冲区
    fflush函数输出的数据是把用户级的缓冲区(C语言)在操作系统系统刷新
  • FILE结构体包含文件描述符和缓冲区

二、线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值