Linux|进程知识总结

进程的基本概念

进程是程序的一个执行实例,担当分配系统资源(cpu时间,内存)的实体。也是系统进行资源分配和调度的一个独立单位。

描述进程PCB

进程信息被放在一个叫做进程控制块的数据结构中,也可以理解为进程属性的集合。Linux操作系统下的PCB是task_struct。

task_struct是linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含进程的信息。

task_struct的内容分类

标识符:描述本进程的唯一标识符,用来区别其他进程。

状态:任务状态,退出代码,退出信号等。

优先级:相对于其他进程的优先级。

程序计数器:程序中即将被执行的下一条指令。

内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。

上下文数据:进程执行时处理器的寄存器中的数据。

I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记帐号等。

查看进程

1.通过 ls /proc 命令查看系统文件,proc文件中包含进程信息

2.也可以使用top 和 ps命令
进程状态查看:ps aux/ps axj 命令

通过系统调用创建进程

fork :有俩个返回值,且父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
fork 返回值等于0时 为子进程
fork 返回值大于0时 为父进程 返回的是子进程的pid
fork 返回值小于0时 创建进程失败

void test()
{
	pid_t pid = fork();
	if(pid == 0)
	{
		printf("child\n");
	}
	else if(pid > 0)
	{
		printf("parent\n");
	}
	else
	{
		printf("create failed\n");
	}
	
}

进程状态

R 运行状态 (running):并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

S 睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)。

D 磁盘休眠状态(Disk sleep): 有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

T 停止状态(stopped): 可以通过发送SIGSTOP信号给进程来停止(T)进程。这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。

X 死亡状态 (dead): 这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

Z(zombie)-僵尸进程

僵尸进程:当进程退出时父进程没有读取到子进程退出的返回代码时产生的进程 。僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。

僵尸进程的危害

1.内存泄漏
2.如果产生大量的僵尸进程将会占用进程号

避免僵尸进程

1.让僵尸进程的父进程来回收,父进程每隔一段时间来查询子进程是否结束并回收,调用wait()或者waitpid(),通知内核释放僵尸进程。
2.采用信号SIGCHLD通知处理,并在信号处理中程序调用wait函数。
3.让僵尸进程变成孤儿进程,由init回收。

孤儿进程

孤儿进程:父进程如果提前退出,那么子进程就被称为孤儿进程。孤儿进程会被1号init进程领养。

守护进程

特殊的孤儿进程,在后台运行,且不受终端控制的一种进程.

其他概念

并行:多个进程在多个cpu下分别,同时进行运行。
并发:多个进程在一个cpu下采用进程切换的方式,在一段时间内,让多个进程都得以推进。

进程控制

使用时需要头文件 #include <unistd.h>
进程创建
1.pid_t fort(void);创建一个进程与父进程数据独有,代码共享。
创建时采用了写时拷贝技术,一开始与父进程指向同一块物理内存,当子进程数据发生变化时,会给子进程重新开辟物理内存,并将数据拷贝过去。
2.pid_t vfork(void);创建一个子进程,阻塞父进程,只有当子进程exit退出或者程序替换之后父进程才会运行。
vfork创建的进程不能使用main中的return退出,vfork创建进程的效率比较高,因为创建的子进程与父进程共用一个虚拟地址空间。

进程终止
1.main函数中的return
2.void exit(int status);
库函数,退出调用进程,并将status返回给父进程
3.void _exit(int status);
系统接口,退出当前进程,并将status返回给父进程

exit/return 退出时会刷新缓冲区,_exit不会

进程等待
父进程等待子进程的退出,获取子进程的返回值,避免产生僵尸进程。
*1. pid_t wait(int status);
阻塞等待子进程的退出,获取子进程的返回值,放到status指向的空间中,返回值为子进程的pid。
*2.pid_t waitpid(pid_t pid,int status,int options);
非阻塞等待子进程的退出
pid:若pid==-1,则表示等待任意一个子进程退出。
若pid > 0,表示等待子进程的退出。
status:传入一个int空间的首地址,获取退出的子进程的返回值
options: 0表示默认阻塞等待
WNOHANG 将waitpid设置为非阻塞
返回值:如果没有子进程退出的话立即报错返回,若等待子进程返回则返回子进程的pid,若有子进程但是没有退出则返回0,出错返回-1.

程序替换

程序替换就是替换一个正在调度的程序信息,将另一个程序加载到内存中,然后让原有的pcb不在调度,而去调度这个新的程序。

exec函数族 实现进程的程序替换
库函数
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[]);
path:带有路径的新程序的名称,就是用这个程序替换正在运行的程序
arg:新程序的运行参数,通过不定参的形式传递进入新的程序,以NULL作为结尾
系统调用
int execv(const char *path,char *const argv[]);
int execvp(const char *path,char *const argc[]);
int execve(const char *path,char *const argv[],char *const envp[]);

l和v的区别:在于程序运行参数的赋予方式不同,l通过不定参完成/v通过字符串指针数组进行赋予
有无p的区别:在于第一个参数执行程序的时候是否需要带路径,有p则可以不用带路径,默认回去PATH环境变量指定的路径下查找
有无e的区别:在于这个进程是否需要重新初始化;有e则表示初始化,若没有e则表示使用,默认的环境变量。
程序替换之后,当前进程完成替换后的程序就会退出,并不会运行原来的程序。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值