这里写目录标题
一、进程:程序文件加载进内存
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 = 0;
waitpid(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结构体包含文件描述符和缓冲区