linux系统应用学习(六)--- 多进程

随着cpu执行效率的提高,为了提高cpu的使用率,引入多进程。

进程是cpu调度的基本单位,也是资源分配的基本单位,

每个进程都有自己0~3G的虚拟地址空间,都有栈区,堆区,数据区,代码区。

进程是CPU一直运行着,程序静止的,是硬盘上一块可执行的二进制代码。

一个程序可以运行多个进程。进程微观上是串行,宏观上是并行。

一、进程号

每启动一个进程,操作系统还会给进程分配唯一的pid号,一个进程需要另一个进程开启,被开启的进程为子进程,启动进程的进程为父进程ppid。所有进程都是1号进程所启动的

查看进程命令:#ps -aux  某一时刻

查看父子进程:#ps -elf    

查看进程动态:#top

二、进程运行状态

  1. 就绪态:等待CPU调度状态
  2. 执行态:正在被CPU执行的状态
  3. 挂起态:因为缺少某些资源,而被挂起、睡眠;当获取到某些资源时会进入就绪态。
     

三、虚拟地址空间

内存管理单元(MMU),为每一个进程映射0~4G的一个虚拟地址空间。其中0~3G是用户空间,3~4G是内核空间。

虚拟地址空间划分

栈区:局部变量,块变量,形参,返回值

堆区:程序员手动分配的malloc /free

数据区:全局变量,静态变量,字符常量

代码区:可执行的二进制代码

虚拟地址空间:其实并没有3G,用多少创建多少。

四、创建进程

fork()
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);

功能:创建一个子进程,调用fork的时候,系统会给子进程分配0~3G虚拟地址空间,然后,会把父进程中内存资源(栈区,堆区,数据区,代码区,环境变量表,文件描述符表等)复制到子进程当中。

从此CPU就去分别执行父子进程(宏观),在父进程中返回值为子进程的PID号,在子进程中返回0。

  • 僵尸进程与孤儿进程

孤儿进程:父进程先于子进程结束,子进程成为孤儿进程,被1号进程接管。(常被作为守护进程,服务进程)

僵尸进程:子进程先于父进程结束,父进程没有回收子进程的资源,子进程成为僵尸进程(浪费系统资源,尽力避免)。

五、进程退出与等待

return ;// 结束所在函数
exit ( ) ; // 退出所在的进程
#include <stdlib.h>
void exit(int status);//退出时会清理缓冲区
#include <unistd.h>
void _exit(int status);//立即退出
status:退出码;退出后会返回给父进程一个退出码
  1. 等待子进程退出
wait/waitpid
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);//等待任意子进程退出
pid_t waitpid(pid_t pid, int *status, int options);//等待指定进程退出。
status :接收子进程退出码
pid :进程号
=-1 等待任意一个进程
>0 等待指定进程退出
=0 等待与本进程同一进程组的其他进程退出
<-1 等待进程组等于其绝对值中的任意进程退出
options: 0 阻塞方式(即等待)
:WNOHANG(不等待)

六、vfork + execl函数族

vfork( ) //创建子进程

功能(可以调用其他程序):创建子进程,开辟0~3G的地址空间,不拷贝父进程资源,而是调用excel函数族启动其他进程,其他进程的资源来填充子进程内存空间,然后各自执行各自的代码。如果子进程中不调用execl或exit( ),父进程会阻塞(即等待)。 

#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void);
#include <unistd.h>
extern char **environ;
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[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
path:   进程所在的路径
arg:    执行进程的操作
··· :执行进程的参数,必须以NULL结尾
例如:
execl(“/bin/ls”,”ls”,”-l”,NULL)
execl(“./a.out”,”./a.out”,NULL)

猜你喜欢

转载自blog.csdn.net/qq_38639426/article/details/89046204
今日推荐