1.进程
进程:(进行中的程序)--正在运行的程序 (动态的) ---内存
程序的一次执行过程!
一个程序一个程序 可以 对应多个进程
程序 -- a.out (可执行程序) ---静态的
程序 加载 到内存 运行起来 成为了 进程。
进程是 程序运行的实体。
程序 = 数据+代码
2.进程的组成
进程 = pcb + text|data|bss|堆|栈
宏观并行,微观串行。
pcb
3.进程状态
三态模型
linux下的模型
4.linux下进程的命令
ps -elf | grep 程序名 //主要查看父子进程 包含 pid ppid //parent pid
eg: ps -elf | grep a.out //査看 a.out 进程
ps aux grep | 程序名 //主要查看某个而进程的pid号及状态信息
eg: ps aux grep | a.out //查看 a.out
pstree -sp pid号/ /用途,查看 父子进程间的关系(以树形图的方式展现包含了pid号)
kill //杀死---给进程发信号
eg:kill -l //查看 kill可以发送的信号
kill - 9 pid号 //给指定的pid号发9号信号
ki11 -19 pid号 //暂停进程 kill -18 pid号; //恢复进程
killall //可以指定进程名称这种方式发送信号
eg:kill -9 a.out //表示给所有叫a.out的进程发信号
5.linux系统
R --- 运行或可运行 -就绪态
S --- 可中断的睡眠态
D --- 不可中断的睡眠态
T --- 暂停态
Z --- 僵尸态
6.创建一个进程
fork();
功能:
创建一个进程(child process 子进程)
通过复制调用进程复制的子进程
返回值 : 成功 在父进程中返回了子进程的pid号 在子进程返回了0
失败 在父进程中返回了-1并且没有子进程被创建
fork之后,父进程和子进程都是从fork之后的下一句话开始执行。
7.进程的执行
8.进程的结束
正常结束:•使用 exit() 函数:这是最常见的进程正常结束方式。exit() 函数由 C 标准库提供,它会立即终止进程并返回一个状态码给父进程。
异常结束:•信号处理:进程可以因为接收到特定的信号而结束,例如 SIGTERM(终止信号)或 SIGKILL(强制终止信号)。这些信号通常由操作系统发送,也可以由其他进程发送。运行时错误:当程序遇到不可恢复的错误时,如段错误(SIGSEGV)或浮点异常(SIGFPE),进程会被异常终止。
当进程结束时,操作系统会保留一个称为“退出状态”的值。这个值可以被父进程捕获,用于判断子进程是否正常结束。在 UNIX 和类 UNIX 系统中,父进程可以使用 wait() 或 waitpid() 系统调用来获取子进程的退出状态。
9.进程结束时资源的回收 - 僵尸态
在操作系统中,僵尸进程(Zombie Process)是指一个已经结束但其父进程尚未对其进行适当清理的进程。僵尸进程本身并不占用任何资源,但它仍然存在于进程表中,占用一个进程表条目,直到其父进程通过 wait() 或 waitpid() 系统调用来回收它为止。
父进程先于子进程结束:如果父进程在子进程结束之前就已经结束,那么子进程就会变成孤儿进程,并被 init 进程(PID 1)收养。此时,子进程是一个后台进程,init 进程会负责回收孤儿进程,但在这之前,子进程会处于僵尸状态。
父进程没有调用 wait() 或 waitpid():如果父进程创建了子进程,但在子进程结束之前没有调用 wait() 或 waitpid() 来回收子进程的状态信息,那么子进程就会变成僵尸进程。
10. 1.32位的平台,每个进程拥有独立的4G内存空间(虚拟的)
2.每个进程运行在各自独立的4G内存空间中。
3.父子进程间,数据相互独立,不受影响。
4.父子进程运行的顺序,不确定。取决于操作系统---先调度谁 。
判断 fork() && fork() || fork () 这个式子中有几个进程
有5个进程