进程知识
发现问题
- 什么是进程
- 操作系统为什么需要进程
- 进程如何实现
- 如何进行进程管理
- 进程和CPU的关系是什么
进程:A process is just an instance of executing program,including the current values of the program counter, registers, and variables.
现在的操作系统是多任务,多用户的操作系统,使用进程这种抽象,可以合理,有效利用CPU资源
操作系统多个程序同时运行,例如,电脑一边听音乐,一边玩游戏。同时运行多个程序,这里的“同时”,是人的认知同时,并不是电脑运行的同时。认知同时概念。cpu在某一时刻只能执行某个指令。音乐进程A,游戏进程B在电脑中是怎么运行的呢?
进程之间快速地切换,以至于你不能感觉到有中断。t1到t2的时间片很小,小到你感觉不到,在t1到t2的时间片里面执行了进程B,然后回到进程A。进程之间切换需要开销,所以进程越多,开销就越大,cpu占用越大,开销不是有效的进程执行,是上下文切换。
操作系统中有多个进程,既然有多个进程,操作系统就要区别不同进程,所以进程需要有进程id,操作系统是多用户,也需要标识用户,有父进程也要标识等,如图进程的数据结构
进程的状态
进程的内存结构
进程实验
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/*fork()
返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
*/
int main()
{
int pid1,pid2,pid3;
printf("a pid is %d\n",getpid());
if ((pid1=fork())<0)
{
printf("Chilrd1 fail create !\n");
return 1;
}
else if (pid1==0)
{
printf("b pid is %d\n",getpid());
return;
}
if ((pid2=fork())<0)
{
printf("Chilrd2 fail create !\n");
return 1;
}
else if (pid2==0)
{
printf("c pid is %d\n",getpid());
return;
}
if ((pid3=fork())<0)
{
printf("Chilrd2 fail create !\n");
return 1;
}
else if (pid3==0)
{
printf("d pid is %d\n",getpid());
return;
}
return 0;
}
运行结果
现象:每次执行的结果都不一样
分析原因
执行过程描述
fork()执行后,同时存在父进程,子进程,但是执行顺序不一定,例如先执行子进程,pid的值就是0,所以输出b pid is ......,如果先执行父进程,pid为子进程的pid,可能先输出d pid is.....或者c pid is......
Linux进程常用命令
ps
report a snapshot of the current processes.
ps displays information about a selection of the active processes. If you want a
repetitive update of the selection and the displayed information, use top(1) instead.
ps -aux
print all processes owned by a user named "x", as well as printing all
processes that would be selected by the -a option. If the user named "x" does not
exist, this ps may interpret the command as "ps aux" instead and print a warning.
This behavior is intended to aid in transitioning old scripts and habits. It is
fragile, subject to change, and thus should not be relied upon.