进程和线程实验总结

本文作者通过线程实验,深入探讨了并发执行中的进程与线程行为。实验结果显示,线程的不确定性导致了预期之外的结果,如全局变量的竞争问题。线程的CPU占用率高达300%以上,原因是多处理器并行执行。同时,文中指出,无控制的线程退出可能不理想,需要妥善处理临界资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了线程一个礼拜,我觉得最能考验知识就是这次实验题,让我知道了学习中很多的不足
一、进程原题

/*  POSIX 下进程控制的实验程序残缺版 */ 
#include <stdio.h> 
#include <sys/types.h>
#include <unistd.h> 
#include <signal.h>
#include <ctype.h> 
/* 允许建立的子进程个数最大值 */
#define MAX_CHILD_NUMBER 10 
/* 子进程睡眠时间 */
#define SLEEP_INTERVAL 2 
int proc_number=0; 
/* 子进程的自编号,从0开始 */
void do_something(); 

int main(int argc, char* argv[])
{   
    /* 子进程个数 */
    int child_proc_number = MAX_CHILD_NUMBER; 
    int i, ch; 
    pid_t  child_pid; 
    pid_t pid[10]={
  
  0}; /* 存放每个子进程的id */ 
    if (argc > 1) /* 命令行参数第一个参数表示子进程个数*/ 
    {
        child_proc_number = atoi(argv[1]); 
        child_proc_number= (child_proc_number > 10) ? 10 :child_proc_number;
    } 
    for (i=0; i<child_proc_number; i++) { 
        /* 填写代码,建立child_proc_number个子进程要执行
        * proc_number = i; 
        * do_something(); 
        * 父进程把子进程的id保存到pid[i] */ 
    }
    /* 让用户选择杀死进程,数字表示杀死该进程,q退出 */
    while ((ch = getchar()) != 'q')  
    { 
        if (isdigit(ch)) 
        { 
            /*  填写代码,向pid[ch-'0']发信号SIGTERM, 
            * 杀死该子进程 */ 
        }
    } 
    /* 在这里填写代码,杀死本组的所有进程 */ 
    return;
} 
void do_something() 
{ 
    for(;;) 
    {  
        printf("This is process No.%d and its pid is %d\n",proc_number,  getpid());
        sleep(SLEEP_INTERVAL); // 主动阻塞两秒钟
    }
}
kill()函数用于删除执行中的程序或者任务。调用格式为: kill(int PID, int IID);
其中:PID是要被杀死的进程号,IID为向将被杀死的进程发送的中断号。

实验过程

先猜想一下这个程序的运行结果。假如运行“./process 20”,输出会是什么样?然后按照注释里的要求把代码补充完整,运行程序。开另一个终端窗口,运行“ps aux|grep process”命令,看看process 究竟启动了多少个进程。回到程序执行窗口,按“数字键+回车”尝试杀掉一两个进程,再到另一个窗口看进程状况。按q 退出程序再看进程情况。

回答下列问题

1、你最初认为运行结果会怎么样?
最开始我觉得应该是num按顺序进行

2、实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
结果第一次出现了全是0的情况,因为我把父进程进入无限循环,导致只有num0,只要讲子进程进入无线循环就不会有问题了

3、proc_number 这个全局变量在各个子进程里的值相同吗?为什么?
不相同,因为进入子进程,子进程有独立的堆栈,只是复制了一份全局变量

4、kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?
如果大于等于a.out后面大于等于10,执行10次,每次都会杀死一个子进程,杀死后就不会继续有对应的子进程循环出现

5、使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?
进程只要执行结束所有代码,就可以主动退出,这里是杀了所有进程,才可以退出,如果异常退出,使用kill你就会发现很多子进程都变成僵尸进程,因为父进程还没有回收,就已经杀死了
我的改进
#include <stdio.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值