精华内容
下载资源
问答
  • 我先创建一个进程池,用主进程处理socket,accept接收到一个连接请求,成功后将其返回值传入结构体链表用子进程处理,在子进程处理过程中我的主进程还处于阻塞状态吗?还是去等待新的连接了?
  • 进程一旦调用了wait(), 就立即阻塞自己,由wait自动分析是否有当前进程的某个子进程已经退出,如果让它找到了一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一...
    1.  wait()和waitpid()函数说明

    wait()

                 进程一旦调用了wait(), 就立即阻塞自己,由wait自动分析是否有当前进程的某个子进程已经退出,如果让它找到了一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到一个子进程结束或者该进程接到了一个指定的信号为止。


    waitpid()
         waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能等。实际上wait()函数只是waitpid()函数的一个特例,在Linux内部实现wait()函数时直接调用的就是waitpid()函数。
    wait()函数的实现:

    static inline  pid_t  wait(int *wait_stat)
    {
    	return waitpid(-1,wait_stat,0);
    }
    


    2.  wait()和waitpid()函数格式说明

    (1)  wait()函数格式如下:


    wait()举例

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    int main()
    {       
    	int status; 
            pid_t pc,pr;    
       	pc=fork();      
    	if(pc<0)  
    	{
    		printf("error ocurred!\n");   	
    	}    
          	
         	else if(0==pc)    
            {
    		printf("this is child process whit pid of %d\n",getpid());  
                    exit(3);         
            }   
     	else
     	{           
        		pr=wait(&status); 
                   if (WIFEXITED(status))   
                   {
    			printf("the child process %d exit normally.\n",pr);       
                 		printf("the return code is %d.\n",WEXITSTATUS(status));       
                   }         
         	       else   
    		{
    			printf("the child process %d exit abnormally.\n",pr);   
    		}      
    		       
            }   
    	return 0;
     }

    运行截图如下:



    (2)   waitpid()函数格式如下


    waitpid()举例

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/wait.h>
    #include<sys/types.h>
    
    int main(void)
    {
    	pid_t pc,pr;
    	pc=fork();
    	if(pc<0)
    	{
    		printf("Error fork \n");
    	}
    	else if(pc==0)
    	{
    		sleep(5);
    		exit(0);
    	}
    	else
    	{
    		do
    		{
    			pr=waitpid(pc,NULL,WNOHANG);
    			if(pr==0)
    			{
    				printf("The child process has not exited \n");
    				sleep(1);
    			}
    		}while(pr==0);
    	
    		if(pr==pc)
    		{
    			printf("Get child exit code: %d\n ",pr);			
    		}
    		else
    		{
    			printf("Some error occured. \n");
    		}
    	}
    
    	return 0;
    }

    运行截图如下:


    本例中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。
    接下来对原有的父进程使用waitpid()函数,并使用参数WNOHANG使该父进程不阻塞。
    若有子进程退出,则waitpid()返回子进程号;
    若没有子进程退出,则waitpid()返回0,并且父进程每隔一秒循环判断一次。

    程序的流程图如下图:


    展开全文
  • k8s 一个容器启动多个阻塞进程

    千次阅读 2018-04-21 09:01:57
    更多kubernetes文章:k8s专栏目录本文记录了一个容器中同时启动tensorboard服务以及jupyter notebook服务,两个阻塞服务的过程。思路:在原有容器启动jupyter的基础上再启动tensorboard即可。尝试1.启动 ...
    更多kubernetes文章:k8s专栏目录

    本文记录了一个容器中同时启动tensorboard服务以及jupyter notebook服务,两个阻塞服务的过程。

    思路:
    在原有容器启动jupyter的基础上再启动tensorboard即可。

    尝试1.启动 tensorboard即可
    发现tensorboard启动成功,jupyter没有启动。原因是增加command命令后覆盖了原有的jupyter启动命令

    那么先启动tensorboard,然后启动jupyter,因为两个进程都是阻塞式的,用nohup & 将tensorboard后台执行,然后正常启动jupyter。
    尝试2.多command
    时灵时不灵,感觉command执行没有顺序关系(没有验证)。可能先执行了阻塞式的jupyter,就不启动tensorboard了。

    尝试3.将命令写在sh脚本里,挂载到容器中,然后执行脚本启动
    挂载成功,但是执行找不到脚本。很奇怪。

    尝试4./bin/sh -c "xxxxxx" 顺序执行
    发现容器启动失败,也没有报错信息。在本地测试发现 &需要转义成\&,否则报错。
    \& 违反yaml格式,格式检查就不通过。 
    \\& 格式检查通过,但是实际执行成了\&,没有挂在后台执行,后面的jupyter没有启动。
    查了bash -c使用方法 增加()开辟子shell执行方法 即可。 即 (nohup xxxxx &);(xxxx)


    思路5 脚本放到dockerfile里重新打包镜像,然后通过脚本启动

    思路6 通过supervisor启动



    尝试记录 

              #/bin/sh -c "xxxxxx" 顺序执行 成功
              
    command: ["/bin/bash"]
    args: ["-c", "(nohup tensorboard --logdir=/home/user1/notebooks/storage/file_checkpoint/ > /tmp/tensorboard.log 2>&1 &);(bash /run_jupyter.sh --allow-root)"]

              #多command 失败
              #command:
              #- nohup
              #- tensorboard
              #- --logdir=/home/user1/notebooks/storage/file_checkpoint/ > /tmp/tensorboard.log 2>&1 &
              #command:
              #- bash
              #- /run_jupyter.sh
              #- --allow-root

              #失败
              #command: ["/bin/sh"]
              #args: ["-c", "nohup tensorboard --logdir=/home/user1/notebooks/storage/file_checkpoint/ > /tmp/tensorboard.log 2>&1 &;bash /run_jupyter.sh --allow-root"]

              #失败
              #args: ["-c", "nohup echo 123 \\\\&;bash /run_jupyter.sh --allow-root"]

              #失败
              #command:
              #- bash /home/user1/notebooks/storage/start.sh


    展开全文
  • Spark Launcher 进程阻塞问题

    千次阅读 2016-05-11 15:22:15
    Spark Launcher 进程阻塞问题

    Spark Launcher是一个很好的spark job提交工具,但是有时候会发现提交spark job之后会一直等待,将spark launcher这个进程kill 之后发现spark job状态从RUNNING变成FINISHED了,其实这个是否并非是等待spark job,而是因为进程发生了阻塞。

    Spark Launcher 其实也是用了Java 的 ProcessBuilder,经过查阅发现答案在这里
    文档中也标注了:
    By default, the created subprocess does not have its own terminal or console. All its standard I/O (i.e. stdin, stdout, stderr) operations will be redirected to the parent process, where they can be accessed via the streams obtained using the methods getOutputStream()getInputStream(), and getErrorStream(). The parent process uses these streams to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, or even deadlock.

    尤其要注意的是,在Spark Launcher中,spark的INFO都是在 errorStream里。

    所以在 spark输出的时候,要开子线程来读取buffer里面的内容,以免将buffer填满,导致进程阻塞。


    展开全文
  • 进程与线程 阻塞与非阻塞

    千次阅读 2018-04-16 20:22:34
    可以点很多菜(cpu中的进程):宫保鸡丁,鱼香肉丝,酸辣土豆丝。每样菜具体包含了哪些内容(cpu每个进程中的线程):宫保鸡丁(详情:黄瓜、胡萝卜、鸡肉、花生米)。而详情构成了宫保鸡丁这道菜,吃了以后不饿。就可以...

    进程:CPU执行任务的模块。线程:模块中的最小单元。

    cpu比作我们每个人,到饭点吃饭了。可以点很多菜(cpu中的进程):宫保鸡丁,鱼香肉丝,酸辣土豆丝。每样菜具体包含了哪些内容(cpu每个进程中的线程):宫保鸡丁(详情:黄瓜、胡萝卜、鸡肉、花生米)。而详情构成了宫保鸡丁这道菜,吃了以后不饿。就可以干活了,cpu中的进程里的线程也是同理。当线程完成自己的内容将结果返回给进程,进程返回给cpu的时候。cpu就能处理日常需求。

    • 单进程单线程:一盘炒苦瓜,里面只有苦瓜。
    • 单进程多线程:一盘宫保鸡丁,里面有黄瓜、胡萝卜、鸡肉、花生米


    阻塞与非阻塞

    我要看足球比赛,但是妈妈叫我烧水,电视机在客厅,烧水要在厨房。家里有2个水壶,一个是普通的水壶,另一个是水开了会叫的那种水壶。我可以:

    1. 用普通的水壶烧,人在边上看着,水开了再去看球。(同步,阻塞)这个是常规做法,但是我看球不爽了。
    2. 用普通水壶烧,人去看球,隔几分钟去厨房看看。(同步,非阻塞)这个又大问题,万一在我离开的几分钟水开了,我就麻烦了。
    3. 用会叫的水壶,人在边上看着。(异步,阻塞)这个没有问题,但是我太傻了。
    4. 用会叫的水壶,人去看球,听见水壶叫了再去看。(异步,非阻塞)这个应该是最好的。

    等着看球的我:阻塞

    看着电视的我:非阻塞

    普通水壶:同步

    会叫的水壶:异步

    所以,异步往往配合非阻塞,才能发挥出威力。

    展开全文
  • 进程阻塞与唤醒

    万次阅读 2015-10-20 12:44:32
    引起进程阻塞和唤醒的事件: 1:向系统申请资源时失败。如一个进程(A)申请打印机但是此时打印机被其他进程(B)正在使用,此时A进程则处于阻塞状态。 2:等待某种操作:进程A启动了某I/O设备,如果只有完成了...
  • 线程系统调用阻塞是否导致进程阻塞的问题

    万次阅读 多人点赞 2018-01-04 16:21:45
    问题: 如果一个进程中的某一个线程调用了一个阻塞的系统调用函数后,那么该进程包括该进程中的其他所有线程也同时被阻塞 ? 关于这个问题。网上有些解答似乎比较混乱。回答这个问题,首先要简单了解一下线程模型。...
  • 什么是进程阻塞

    千次阅读 2018-07-09 17:44:00
    ①什么是进程阻塞 正在运行的进程由于提出系统服务请求(如I/O操作),但因为某种原因未得到操作系统的立即响应,或者需要从其他合作进程获得的数据尚未到达等原因,该进程只能调用阻塞原语把自己阻塞,等待相应的...
  • //第2fork一定要写在这,也就是父进程里面创建个子进程。放在前面child1会运行2次,也就是实际上变成了4个进程。 if(child2 ) { printf("child2 is error\n"); exit(0); } else if(child2 ...
  • python进程阻塞

    千次阅读 2019-03-12 16:27:40
    from urllib import request import os from multiprocessing import Process ... print("进程A") def B(): print("进程B") if __name__ == '__main__': # 结束了最后执行 # p1=Process(target=A) #...
  • python可以使用os模块中的system函数来启动外部程序。 Windows平台下使用start命令就可以阻塞当前进程的执行程序,测试代码如下: import os os.system('start calc')  ...
  • python3多进程阻塞与非阻塞快速理解

    千次阅读 2020-03-31 12:10:17
    python多进程阻塞和非阻塞 非阻塞: (不需要等待)。 简单来说就是开启几进程就同时运行几进程。 比如下面程序,开启3进程,那么程序运行的时候立马执行3进程同时调用function方法,不需要等待进程1执行...
  • 添加一个任务便执行一个任务,如果一个任务不结束,另一个任务进不来。 进程池: pool = Pool(max) # 创建进程池对象 pool.apply() # 阻塞式 pool.apply_async() # 非阻塞式 pool.close() pool.join() #...
  • (2)同一个进程可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。 (3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有...
  • 文章目录同步(synchronous),异步(asynchronous)阻塞(blocking),非阻塞(non-blocking)(这里指系统的io操作)进程,线程,进程间通信的方式管道匿名管道(pipe)命名管道(FIFO)消息队列共享内存信号信号量socket...
  • mywang88 2019-04-10 简介 Python 通过 threading 库...开发中遇到了这样一个问题:主程序是一个多线程的进程,同时为了满足业务需求创建了若干个子进程,要求主程序的每一个线程都能与一个配套的子进程之间进行响应...
  • 线程和进程/阻塞和挂起

    万次阅读 多人点赞 2016-04-25 23:04:13
    曾多次迷惑于阻塞和挂起状态,后来才发现,有一些文章没有区别,把(阻塞、挂起、等待)等同了,这时看语境作者说的是哪个。自己加以分析区别。 先大概这样理解一下: 挂起:一般是主动的,由系统或程序发出,甚至...
  • android 阻塞安装进程

    2015-12-31 05:41:39
    想做一个应用阻塞第三方的安装进程。 我的程序拥有root权限。 第三方安装应该是 intent.setDataAndType(Uri, application/vnd.android.package-archive"); startActivity(intent); 这种方式。 所以有没有办法hook住...
  • 上图红色框的写法进程阻塞,并不能实现多进程。这种写法不需要调用start方法也会执行。 注意:正常写法是上图红框下面的代码,即可实现多进程。 转载于:...
  • 进程的基本状态及转换和阻塞及挂起的理解

    万次阅读 多人点赞 2018-06-24 16:12:26
    阻塞状态:一个进程正在等待某一事件发生(例如请求I/O而等待I/O完成等)而暂时仃止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。 挂起状态:由于IO的速度慢于CPU的运算速度,经常出现...
  • ----查看阻塞进程和被阻塞进程

    千次阅读 2017-02-20 14:34:00
    ----查看阻塞进程和被阻塞进程 --SELECT *--from master..SysProcesses--where db_Name(dbID) = 'golddb'--and spId &lt;&gt; @@SpId--and dbID &lt;&gt; 0--and blocked &gt;0; --select...
  • 挂起进程在操作系统中可以定义为暂时被淘汰出内存的进程,机器的资源是有限的,在资源不足的情况下,操作系统对在内存中的程序进行合理的安排,其中有的进程被暂时调离出内存,当条件允许的时候,会被操作系统再次...
  • 在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。 进程的创建 允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程。子...
  • 进程阻塞解决方案

    千次阅读 2018-05-10 14:36:32
    我的毕设做了可视化界面,用来展示我的仿真过程,做起来一波三折啊。记录一下用Runtime.getRuntime().exec(s)时出现的问题。2018年5月10日13:44:54、执行一些比较复杂的语句时无法执行,直接退出来解决方法:在...
  • 一 了解进程资源图 Markdown编辑器用的还不是太熟,表格中插入图片这事还没学会,纠结着在...第二步:把不阻塞进程的所有边都去掉,形成一个孤立的点,再把系统分配给这个进程的资源回收回来 第三步:看剩下的进...
  • 进程阻塞和挂起的区别

    千次阅读 2019-06-02 21:38:00
    而且挂起队列在操作系统里可以看成一个,而阻塞队列则是不同的事件或资源(如信号量)就有自己的队列。 理解二:阻塞(pend)就是任务释放CPU,其他任务可以运行,一般在等待某种资源或信号量的时候出现。...
  • 将正在运行的进程,替换成为另外一个程序,运行另外一个程序的代码。 原理 进程程序替换就是将进程的代码段,数据段替换成为新的程序的代码段和数据段,更新堆栈信息。 应用场景 守护进程 守护进程
  • Linux进程信号之阻塞信号

    千次阅读 2018-04-18 21:34:53
    前两天写了信号的基本概念以及如何去产生信号,欢迎大家戳博客链接:https://blog.csdn.net/apt1203JN/article/details/79955014 ...* 信号阻塞(Block):进程可以选择阻塞某个信号,被阻塞的信号产生时将保
  •  并发、并行、串行、同步、异步、阻塞、非阻塞进程、线程、协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这篇博文中我们来区分一下这些概念。 2 并发与并行  在解释并发与并行之前,我们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 384,701
精华内容 153,880
关键字:

一个进程可以阻塞其他进程吗