Linux----浅谈进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
程序的执行实例被称为进程,进程和程序的区别在于:

进程是执行程序的动态过程;程序是进程运行的静态文本;
进程具有PCB(task_struct),程序没有;
进程生命周期短;
.一个进程只能对应一个程序,一个程序可以对应多个进程。

进程状态
运行状态 R
睡眠状态 S
磁盘休眠状态 D
停止状态 T :向进程发送SIGSTOP停止进程,停止的进程可以发送SIGCONT继续运行
死亡状态:X
僵尸状态 Z:子进程退出,父进程处于运行状态却没有接收到子进程返回的状态信息,这时子进程就是僵尸进程。

僵尸状态的危害:
由于不能接收到子进程的状态所以父进程分配给子进程的任务也未知;
处于僵尸状态的子进程需要PCB的维护;
没有回收的子进程也会占用内存;可能造成内存泄露。

孤儿进程
父进程先退出,子进程这时成为孤儿进程,孤儿进程要被归入1号init进程,被 1号init进程回收。

进程的优先级
CPU分配给进程资源的顺序
查看系统进程:ps -l 指令;

进程的各项信息
UID : 代表执行者的身份
PID:这个进程的代号
PPID:代表其父进程的代号,也就是由哪个进程衍生而来的
PRI :代表进程的优先级,数值越低优先级越高
NI:代表进程可被执行的优先级的修正数值(与优先级概念不同,但是可以影响优先级)PRI(new)=PRI(old)+NI (当NI为负数时,可以使进程的优先级提高,NI一般取值-20—19,40个级别)

修改进程优先级命令:
nice:启动进程前调整(nice -n -5 ./可执行文件)
renice:调整已存在进程的nice(renice -5 -p PID)PID进程的nice值调整为-5。
top 改变已存在进程的nice:进入top之后按 r,输入进程PID,输入nice值。

并行:多个进程在多个CPU下同时进行运行
并发:多个进程在一个CPU下采用进程切换方式,在一段时间之后,让多个进程都得以向前推进。

进程的地址空间
这里写图片描述
进程的控制
fork创建进程
pid_t fork(void);
返回0的进程是子进程,返回子进程id的是父进程。

进程调用fork,当控制转移到内核中的fork代码后,内核会做:
给子进程分配新的内存空间和内核数据结构;
将父进程的部分数据结构拷贝给子进程;
将子进程加入到系统进程列表中;
fork进行返回,开始调度器调度。

fork()函数创建的父子进程具有如下特性:
1.在父子进程都不进行写入的时候代码共享,数据共享;当有一方需要写入的时候,数据就各自开辟空间,私有一份副本(采用写时拷贝);

2.拥有独立的地址空间,PCB,虚拟地址空间,页表,其中一部分信息来自父进程;
3. fork之前父进程单独执行,fork之后父子两个控制流分别执行。
4. 父子进程输出的变量绝对不是同一个变量,地址值一样说明不是物理地址,是虚拟地址;操作系统将虚拟地址转换为物理地址,物理地址由OS统一管理。
5. 子进程会继承父进程的环境变量;

vfork创建进程 :
父子进程共用一块内存地址空间;
子进程保证先运行,调用exec函数或exit函数退出之后父进程开始运行。

进程终止

进程正常终止:
1.在main函数内执行return语句
2.调用exit函数
3.调用_exit或_Exit函数
4.进程的最后一个线程在其启动例程中执行返回语句
5.进程的最后一个线程调用pthread_exit函数
进程异常终止:
1.调用abort
2.当进程接收到某些信号时
3.最后一个线程对”取消”请求做出响应

exit()函数和_exit()函数的区别:
这里写图片描述
执行return n实际上等同于执行exit(n),因为调用main的运行时函数会将main返回值当作exit的参数

进程等待
同个进程等待来回收子进程的资源,获取子进程退出信息
1.wait函数
pid_t wait(int* status);
参数:输出型参数,获取子进程的退出状态,不关心的话可以设置为NULL;
返回值:成功返回被等待进程的pid,失败则返回-1。
2.waitpid函数
pid_t waitpid(pid_t pid,int* status,int options);
参数:
pid:pid= -1,等待的是任一个子进程;
pid>0,等待其进程的ID与pid相等的子进程。
status:
WIFEXITED(status):查看进程是否正常退出,若为正常退出则返回真;
WEXITSTATUS(status):当WIFEXITED(status)为非0,查看进程的退出码。
options:
WNOHANG:若pid指定的子进程没有结束,返回0;正常结束则返回进程的pid。
返回值:
当正常返回的时候,waitpid返回的是收集到子进程的ID;
当设置WONHANG选项的时候,如果pid的子进程没有结束,则返回0;正常结束返回进程pid;
当出现错误的时候返回-1,并且error会被设置成相应的值以指示错误所在。

注:当子进程已经结束的时候,调用wait/waitpid时,则立刻返回并释放资源,获取子进程的退出信息;
如果子进程不存在,则函数会立刻返回;
如果调用wait/waitpid时,子进程依然正常运行则函数返回,可能会造成进程阻塞。

猜你喜欢

转载自blog.csdn.net/qq_39295755/article/details/81075858