1、理解进程的独立空间的实验内容及步骤
(1)编写一个程序,在其 main()函数中定义一个变量shared,对其进行循环加/减操作,并输出每次操作后的结果;
Ø
图1
Ø
图2
注:在这种情况下,程序不存在多进程的情况,按一般逻辑先对变量循环加,输出结果20,然后在加的基础上循环减,输出结果为-10。
(2)使用系统调用 fork()创建子进程,观察该变量的变化;
Ø
图3
Ø
图4
注:
==》可以看出输出与(1)不同,多进程情况下,子进程拷贝了父进程的内存区,因此父子进程有各自的内存空间,有各自的变量,互不影响。
==》其次,父子进程从fork语句开始分开执行,且一般情况下,父子进程会争夺系统资源,谁先占用资源,谁先执行。
(3)修改程序把 shared变量定义到 main()函数之外,重复第(2)步操作,观察该变量的变化。
Ø
图5
Ø
图6
注:
==》可以看出,程序运行结果与(2)相同,父子进程有各自的内存空间,有各自的变量,独立运行。
==》可见,在多进程情况下,不管是局部变量还是全局变量,父子进程都会有各自的一份拷贝,从而独立运行。
2、理解线程的实验步骤
(1)编写一个程序,在其 main()函数中创建一个(或多个)线程,观察该线程是如何与主线程并发运行的。输出每次操作后的结果;
Ø
图7
Ø
图8
注:
==》这只是一次程序执行的结果,多次运行程序,可以看到会有不同的结果出现,即打印次序不同。
==》可以根据多次执行的结果判定,多个线程是并发执行的,相互独立运行的,多次执行结果可能不相同。
(2)在 main()函数外定义一个变量shared(全局变量),在main()中创建一个线程,在 main()中和新线程shared进行循环加/减操作,观察该变量的变化;
Ø
Ø
图10
注:
==》从程序的结果可以分析出,程序中两个进程都对shared变量产生影响,从而使shared的值在重复0和1。
==》定义了一个全局变量,在多个线程中均可使用,说明多个线程共享了一块存储区,从而验证了这多个线程共享了同一进程块。
(3)修改程序把shared变量定义到 main()函数之内,重复第(2)步操作,观察该变量的变化。
Ø
Ø
图12
注:当shared为全局变量时,程序可以正常执行,说明了shared在共享的进程块中,而不是某个线程所独占;然而此时,shared只是改为局部变量,编译时出现错误,不能继续进行操作,需要改动程序,下面做改进。
采用两种改法,可以解决错误,继续运行。
方法1:
Ø
图13
Ø
方法2:
Ø
Ø
注:可以看出多个线程有了自己的变量shared,相互不影响。
综合上面的三种情况,可以看出当shared为全局变量时,它在多个线程的共享区,即进程区;然而如果shared为局部变量时,就会有不同情况,可以分析出此时shared不在共享区里,而在每个线程自己的存储区。