C语言学习:关于进程

留校第二周的任务,是进程相关知识的学习,和myshell的编写。在《Linux C 编程实战》第七章、一些网络资源以及这周的学长分享会的共同促进下【?】,决定写写我对 进程的认识和理解。

  • 第一个问题当然是,进程是什么?
    我的理解是,进程是一个程序在计算机上的一次执行。
    或者引用网课毕向东老师的表达,进程即是程序的进行
    通过实验,我们在windows的任务管理器中,可以清楚地看到一个进程的诞生和终止,也代表了进程的“生命”仅为其运行的短暂时间。【别问为什么是Windows…老师没用linux啊啊…

  • 与上一章的文件相同,针对进程也有许多表示函数,位于unistd.h头文件中,记录着它们的id和所有用户、所有组的id。和文件的 绝对地址 相似,每个进程都拥有独一无二的 进程id ,进行区分。

  • 进程的内存映像:内核在把程序转化为进程时,会给其在内存中分配存储空间:
    C语言学习:关于进程_第1张图片

  • 程序&映像&进程:
    程序和进程是一个相关的递进关系。我的理解是,可执行程序只是一些“字符”性质的代码,以普通文件的方式被存储在磁盘中。当我们需要执行它时,会在内存中创造相应的“程序映像”,划分出充足的空间以便程序正常运行。此外,程序 是一些静止的平平无奇的代码,而 内存映像 则会根据程序的执行而改变,譬如其中的堆、栈中存储的变量、数据。

进程的创建
  • fork函数
    fork是创建新进程的唯一方法,而且非常独特的是,它拥有两个返回值,分别在子进程和父进程中返回0,和子进程的id。
    学长在分享会上提出了一个问题,为什么只在子进程中返回0?我的想法是,在“区分父子进程”这个功能以外,我们知道,有父子关系的进程都是互相连接、可以找到彼此的。对于一个父进程来说,它自身有getppid可以追溯到它的父进程,又有fork的返回值,能捕捉到它的子进程。而一个子进程,与它最相关的就是它的父进程,而且还能一路溯源回到最最初的“祖先进程‘,所以没有什么特殊的内容有必要返回。
  • fork和vfork函数
    vfork虽然也能创建进程,但我们认为它也是调用了fork函数。二者十分相近,只有两点不同:
  • fork创建的子进程和父进程共同竞争运行,根据系统调度算法来确定运行先后,【 当然也可能交替运行
    而vfork函数则不同,子进程一经创建即开始运行,父进程被挂起,直到调用exec或者exit后,父进程才被解禁。
  • 另一点就是,fork函数会给子进程复制父进程的程序映像,两者参数互不影响。(毕竟物理存储位置不同)。
    而vfork只是让子进程共享父进程的地址空间,即是说,二者在同一位置区间工作,所以子进程对数据的更改也会影响父进程。
    也可以说,fork的子进程继承了父进程的变量,而vfork的子进程与父进程共享变量。
守护进程

鉴于学长学姐表示,我们暂时不太用得到这里的知识点,我就只草草阅读了书上的内容,此处留待以后补坑。

特殊进程

我们在实际操作中,也可能会遇到“孤儿进程”“僵尸进程”。

你可能感兴趣的:(羊的c)