观察进程的并发性
1. 创建资源
开始实验之前,您需要先创建实验相关资源。
- 在实验室页面,单击创建资源。
- (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。
说明:资源创建过程需要3~5分钟(视资源不同开通时间有所差异,ACK等资源开通时间较长)。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。
实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。
资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息
2. 预习内容
- 进程创建的基础知识
程序是存储在磁盘上的,程序被加载到内存中开始运行叫做进程。
一个程序可以多次被加载,生成多个进程(比如登录多个QQ),进程就是处于活动状态的计算机程序。
一个进程可以被另一个进程创建,创建者叫父进程,被创建者叫子进程,子进程被父进程启动后在操作系统的调用下同时运行。
当子进程先于父进程结束,子进程会向父进程发送SIGCHLD信号,此时父进程应该去回收子进程的相关资源,如果没有回收,那么子进程就会变成僵尸状态。
僵尸进程:该子进程已经死亡,但它的父进程没有立即回收它的相关资源,该进程就进入僵尸状态。
父进程先于子进程结束,子进程就变成了孤儿进程,孤儿进程就会被孤儿院(即init守护进程,init的进程ID永远是1)领养,init就是孤儿进程的父进程。
2.进程相关的系统调用
(1) pid_t fork(void):创建一个新的进程。返回值:一次调用两次返回,子进程返回0,父进程返回子进程ID,创建进程失败,返回-1.
注意:通过fork创建的子进程,会拷贝父进程的(数据段、bss段、堆、栈、I/O流缓冲区等)数据段,与父进程共享代码段。可以根据返回值的不同,让父子进程进入不同的分支,执行不同的代码。
(2)int wait(int *stat_loc):如果有退出的子进程,则返回退出的子进程的状态;如果没有任何子进程在运行,则返回错误。如果当前有子进程正在运行,则函数会一直阻塞直到一个子进程退出。
(3) pid_t waitpaid(pid_t pid, int *stat_loc, int options):类似于函数wait,但允许用户等待某个进程组的特定进程,并可以设置等待选项。
(4)int nice(int inc):改变当前进程优先级。在调用进程的nice值上添加参数指定的值。较高的nice值意味值较低的优先级,只有超级用户才可指定负增量--即提升优先级。
3.使用gcc编译器
简单写个test.c如下,使用gcc test.c -o test,将test.c编译,并生成可执行文件test(若不指定-o 文件名,则默认生成a.out),输入./test执行程序。
3. 实验内容及步骤
本次实验的编程需要独自完成。
1.进程的创建。编制一段程序,使用系统调用fork()创建两个子进程,在此程序运行时,系统中就有一个父进程和两个子进程在活动。
1)让每一个进程在屏幕上显示一个字符:父进程显示字符a,两个子进程分别显示字符b和子符c。
2)试观察、记录并分析屏幕上进程调度和并发执行的情况。
2.若在程序中使用系统调用nice()来改变各进程的优先级,会出现什么现象?
4. 实验总结
1)系统调用fork()是怎样创建进程的?
2)当首次调用新创建的子进程时,其入口在哪里?
3)分析进程调度和进程并发执行的关系?
4)提交源程序清单,并附加流程图与注释。
实验链接:https://developer.aliyun.com/adc/scenario/e008b37f71b54c26a7189dd0dad51dcc