自学嵌入式 day27 进程
进程:
一、定义:
进程是一个程序执行的过程,会去分配内存资源,cpu的调度,和其他的硬件资源
二、pcd块组成:
1、PID:进程标识符。
2、chdir:当前工作路径 。
3、umask 0002
4、fds:进程打开的文件列表 文件IO中有提到。
5、signal:信号相关设置 处理异步io,用户id,组id。
6、进程资源的上限。
注:命令:ulimit -a,显示资源上限。
三、进程与程序的区别
1、程序:静态,存储在硬盘中代码,数据的集合。
2、进程:动态,程序执行的过程,包括进程的创建、调度、消亡。
3、
1)程序是永存,进程是暂时的。
2)进程有程序状态的变化,程序没有。
3)进程可以并发,程序无并发。
4)进程与进程会存在竞争计算机的资源。
5)一个程序可以运行多次,变成多个进程,一个进程可以运行一个或多个程序。
四、内存(虚拟)分布
code:代码段,保存.c的代码(只读)
data:数据段,保存全局变量和静态变量(可读可写)
heap:动态内存空间
map/share:硬设区和共享区
stack:栈,大小为8k
五、内存分类
1、交互式进程
2、批处理进程 shell脚本
3、 守护进程 :守护计算机
六、进程状态
七、进程作用
并发(多个任务同时运行)
八、进程的调度
进程上下文切换
1、调度算法:
(1)先来先服务
(2)段任务优先
(3)优先级
(4)时间片轮转
注:(1)man -k :查相关函数。
九、进程相关命令
1、ps aux 查看进程相关信息
2、top 根据cpu占用率查看进程相关信息
3、kill 发送一个信号
(1)kill -2 pid
(2)killall -9 程序名
注:(1)-2:要求关闭,程度较轻
(2)-9:强制关闭,程度较重
十、进程相关函数
1、fork():pid_t fork()
(1)特点:①一次调用,会返回两次。
②子进程先运行和是父进程先进程,顺序不确定。
③变量不共享。
④子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同
(2)功能:通过该函数可以从当前进程中克隆一个同名新进程,克隆的进程称为子进程,原有
的进程称为父进程,子进程是父进程的完全拷贝,子进程的执行过程是从fork函数之后执行,子进
程与父进程具有相同的代码逻辑。
(3)返回值:int 类型的数字。
在父进程中:成功 返回值是子进程的pid号 >0
失败 返回-1;
在子进程中:成功 返回值 0
失败 无
#include<stdio.h>
#include<string.h>
#include <sys/types.h>
#include <unistd.h>int main()
{
printf("strat ...\n");
pid_t ret = fork();
if(0 == ret)
{
while(1)
{
printf("child,控制方向\n");
sleep(1);
}
}
else if(0 < ret)
{
while(1)
{
printf("father,發送視屏\n");
sleep(1);
}
}
else
{
perror("fork\n");
return 1;
}
return 0;
}
2、getpid:pid_t getpid(void);
(1)功能:获得调用该函数进程的pid
(2)参数:缺省
(3)返回值:进程的pid
3、getppidpid_t getppid(void);
(1)功能:获得调用该函数进程的父进程pid号
(2)参数:缺省
(3)返回值:返回父进程id号
#include<stdio.h>
#include<string.h>
#include <sys/types.h>
#include <unistd.h>
int a = 20;
int main()
{
printf("strat ...\n");
pid_t ret = fork();
if(0 == ret)
{
a += 10;
int i = 10;
while(i--)
{
printf("child,控制方向 pid : %d,ppid : %d\n",getpid(),getppid());
sleep(1);
}
}
else if(0 < ret)
{
int i= 10;
while(i--)
{
printf("father,發送視屏 pid : %d,ppid : %d\n",getpid(),getppid());
sleep(1);
}
}
else
{
perror("fork\n");
return 1;
}
printf("%d,%d\n",a,getpid());
return 0;
}
注:(1)父子进程的关系:子进程是父进程的副本。子进程获得父进程数据段,堆,栈,正文段共享。运行前后具有随机性。
(2)父子进程的区别:①fork的返回值
②pid不同
(3)写时复制:子进程只会复制对于父进程中发生变化和变量的代码
优点:速度快,所占空间小
十一、进程的终止
主动退出:
1、main 中return
2、exit(), c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。已经清理函数(atexit)。
3、_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。
4、主线程退出
5、主线程调用pthread_exit
异常终止
6、abort()
7、signal kill pid
8、最后一个线程被pthread_cancle