Linux进程学习笔记一

    xiaoxiao2021-03-26  31

    一、什么是进程及什么是程序

    进程是程序的一次运行,是动态的

    程序是存储在块设备上的一段代码的集合,是静态的,每一次程序的运行都需要一个进程

    二、fork的内部原理

    如果操作系统需要一个新进程来运行一个程序,那么操作系统就会用一个现有的进程复制出一个新的进程,分别称为父进程和子进程。此过程可以用fork函数来实现,当调用一次fork函数,会返回两次,返回值等于0就是子进程,大于0(值为本次fork创建的子进程的进程ID)就是父进程。

    至于返回两次的原因是:在父进程中调用fork函数之后会复制出一个新的进程,即子进程。子进程会包含有父进程的所有信息(即在父进程中main函数所代表的程序在子进程中也会有相同的一份),父进程在进程调度表中可被调度执行,而fork出的子进程也会被添加到进程调度表中,此后父进程与子进程会被轮番执行,所以会返回两次。

    至于区分父子进程中各自运行哪段代码,可用if分支来进行选择,即:

    p = fork();

    if(p==0) {  /* 子进程中 */  };

    if(p>0) {  /* 父进程中 */  };

    /* 此处为父子进程都会运行的代码区 */

    三、进程的结束

    进程在运行时会消耗系统资源,Linux系统设计时规定:每一个进程退出时,操作系统会自动回收这个进程运行时所占用的资源,但是操作系统并没有回收这个进程本身所占用的内存空间,所以这部分资源就会需要另外一个人去回收,而这个人就是父进程。

    什么是僵尸进程?

    子进程先于父进程结束,在结束后父进程并不一定能立即帮子进程“收尸”,而在这段时间内的子进程就被称为僵尸进程。父进程可以使用wait或waitpid以显式回收子进程的剩余待回收的资源。

    什么是孤儿进程?

    父进程先于子进程结束,子进程就会变成一个孤儿进程。Linux规定:所有的孤儿进程都自动称为一个特殊进程(进程1,也就是init进程)的子进程。

    四、wait的工作原理

    父进程调用wait函数会阻塞,当子进程运行结束后,系统向其父进程发送一个SIGCHILD信号,父进程被SIGCHILD信号唤醒然后去回收僵尸子进程。若父进程没有任何子进程,则wait返回错误。

    转载请注明原文地址: https://ju.6miu.com/read-662602.html

    最新回复(0)