fork

孤儿进程与僵尸进程[总结]

早过忘川 提交于 2020-02-27 17:12:09
今天遇到一个linux进程启动时指定Max open files不对的问题,导致程序建立socket异常,进而导致fullgc问题,影响正常服务。所以顺带又温习了下linux下的父子进程的特性。 孤儿进程与僵尸进程[总结] 1、前言   之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧。晚上回来google了一下,再次参考APUE,认真总结一下,加深理解。 2、基本概念   我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。   孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。   僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程

理解Android进程创建流程

半世苍凉 提交于 2020-02-26 09:39:04
copy from : http://gityuan.com/2016/03/26/app-process-create/ 基于Android 6.0的源码剖析, 分析Android进程是如何一步步创建的,本文涉及到的源码: /frameworks/base/core/java/com/android/internal/os/ - ZygoteInit.java - ZygoteConnection.java - RuntimeInit.java - Zygote.java /frameworks/base/core/java/android/os/Process.java /frameworks/base/core/jni/com_android_internal_os_Zygote.cpp /frameworks/base/core/jni/AndroidRuntime.cpp /frameworks/base/cmds/app_process/App_main.cpp (内含AppRuntime类) /bionic/libc/bionic/fork.cpp /bionic/libc/bionic/pthread_atfork.cpp /libcore/dalvik/src/main/java/dalvik/system/ZygoteHooks.java /art

docker-compose exec时出现\"fork/exec /proc/self/exe: no such file or directory\" 报错

自作多情 提交于 2020-02-26 02:24:08
问题:跟往常一样执行docker-compos exec redis sh时出现如下错误,而容器是运行状态中。 # docker-compose exec redis sh rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "process_linux.go:75: starting setns process caused \"fork/exec /proc/self/exe: no such file or directory\"" 解决办法: 1、获取容器ID # docker ps | grep arcs_redis_1 ac248a3c5c0e redis:alpine "docker-entrypoint..." 2 years ago Up 16 minutes 6379/tcp arcs_redis_1 2、通过容器ID获取容器的PID # ps -ef|grep libcontainerd | grep ac248a3c5c0e root 6650 9053 0 11:14 ? 00:00:00 docker-containerd-shim

Redis深入学习笔记(三)RDB及AOF流程

Deadly 提交于 2020-02-24 14:29:17
RDB是Redis持久化数据的一种方式,是执行时间点的Redis内存快照,redis数据还原时加载rdb文件,Redis的主从数据同步也是基于RDB实现的。 RDB流程: 1)执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回。 2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒。 3)父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令。 4)子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的时间,对应info统计的rdb_last_save_time选项。 5)进程发送信号给父进程表示完成,父进程更新统计信息,具体见info Persistence下的rdb_*相关选项。 AOF是Redis持久化数据的另一种方式,这种方式以日志形式记录每一条操作,当redis恢复数据时,还原所有操作。 AOF流程: 1)所有的写入命令会追加到aof_buf中。 2)AOF缓冲区根据对应的策略向硬盘做同步操作。 3

Redis 之持久化

♀尐吖头ヾ 提交于 2020-02-24 14:27:29
目录 一.前言 二.持久化类型之 RDB 三.持节化类型之AOF 四.Redis 持久化类型的抉择 五.持久化的恢复 六.持久化问题的分析定位与优化 七.回顾总结 一.前言 首先,来回顾下前面文章的知识.Redis的特性之一就是读取速度快,因为它的数据是存储在内存中的,但是这样还有它的不足之处,那就是当你服务器断电时或者进程产生进退后,那么你所存储在内存中的数据也就荡然无存了,可是这样会给我们带来丢失数据的危险.而Redis正是考虑到了这一点,所以便有了持久化的功能.而持久化的作用正像它的名称一样,便是为了保持数据的持久. Redis的持久化类型有两种,一种是全量(RDB),一种是增量(AOF),今天这篇文章中便来聊聊这两种类型的特性和他们的优缺点,以及我们在这两种类型中如何做选择. 二.持久化类型之 RDB 1.什么事RDB? RDB是把Redis中的完整的数据生成一个快照,然后保存到硬盘当中,那么这就是一个RDB文件了,不过这个RDB文件是一个二进制的文件.当你的Redis服务重启时,它会去载入这样的RDB文件.其作用便是为了备份数据和恢复数据,当然它也是一个复制的媒介,对于Redis的主从复制正式利用这个文件来完成的. 2.触发机制 RDB的触发方式有两种,分别是:save(同步)和bgsave(异步).因为save的触发方式是同步的,那么它会阻塞当前的Redis服务器

redis专题之持久机制

南笙酒味 提交于 2020-02-24 14:14:52
redis的持久化机制 说白了,就是在指定的时间间隔内,将内存当中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存 什么意思呢?我们都知道,内存当中的数据,如果我们一断电,那么数据必然会丢失,但是玩过redis的同学应该都知道,我们一关机之后再启动的时候数据是还在的,所以它必然是在redis启动的时候重新去加载了持久化的文件 redis提供两种方式进行持久化 (1)RDB持久化【默认】 (2)AOF(append only file)持久化 1.RDB 原理是 redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化 ,这个子进程的所有数据(变量。环境变量,程序程序计数器等)都和原进程一模一样,会先将数据写入到一个临时文件中,待持久化结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程不进行任何的io操作,这就确保了极高的性能。 问题:为什么要fork一个子进程? 因为redis是单线程的,如果这个线程去进行rdb持久化了,那么此时有客户端向我们服务端发送命令,他是得不到处理的(唯一的线程在做持久化),必须要等持久化结束后才能接受客户端命令。那么这个过程可以理解为客户端发送命令会阻塞,性能低下。 1).这个持久化文件在哪里 根据dir配置 2).他什么时候fork子进程,或者什么时候触发rdb持久化机制 shutdown时,如果没有开启aof

收藏!2020 年最具潜力 44 个顶级开源项目,涵盖 11 类 AI 学习框架、平台

佐手、 提交于 2020-02-24 07:14:25
工欲善其事必先利其器,这也是大部分开发者在日常工作中最重要开发原则。选择与开发内容相匹配的工具,常常会使我们事半功倍。但面对人工智能的多个领域,如:机器学习、深度学习、NLP等等,多样的工具有时也让我们也无从选择。 就在最近,一个基于 javascript 的可视化库 D3js(treemap 可视化)对 json 文件生成的技术图,给开发者提供了详细的各领域工具清单,内容涵盖了 11 种极具潜力的 AI 工具类型,我们将其整理如下,强烈建议大家收藏~ 原文链接:https://github.com/haggaishachar/techmap 目录: Ⅰ、经典机器学习(1-3) Ⅱ、深度学习(4-8) Ⅲ、强化学习(9-12) Ⅳ、自然语言处理(13-18) Ⅴ、语音识别(19-21) Ⅵ、计算机视觉(22-26) Ⅶ、分布式训练(27-31) Ⅷ、自动建模(32-35) Ⅸ、IDEs系统(36-38) Ⅹ、平台(39-41) Ⅺ、评分推理系统(42-43) I . 适用于经典机器学习的工具 一、SciKit-learn  star 39.2k  fork 19.2k scikit-learn 是一种强大的基于 Python 语言的机器学习算法库(https://scikit-learn.org/stable/)。其中,包含了算法预处理,模型参数择优,回归与分类等算法

Python高级编程-多进程

戏子无情 提交于 2020-02-22 15:09:58
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。 Unix/Linux操作系统提供了一个 fork() 系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是 fork() 调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。 子进程永远返回 0 ,而父进程返回子进程的ID 。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用 getppid() 就可以拿到父进程的ID。 Python的 os 模块封装了常见的系统调用,其中就包括 fork ,可以在Python程序中轻松创建子进程: 1 # /usr/bin/python 2 import os 3 import time 4 5 6 def main(): 7 pid = os.fork() 8 if pid == 0: # 子进程中返回0 9 print("I am child process %d, my parent is %d" % (os.getpid(), os.getppid())) 10 time.sleep(1) 11 else: # 父进程中返回子进程id 12 print("I %d just created child %d"

python3 系统编程进程

给你一囗甜甜゛ 提交于 2020-02-22 15:09:24
进程的创建-fork     进程vs程序   编写完毕的代码,在没有运行的时候,称之为程序。   正在运行着的代码,就称为进程。进程除包含代码以外,还有需要运行的环境等,所以和程序是有区别的。   fork()   Python的os模块封装了常见的系统调用,其中就包括fork, 可以在Python程序中轻松创建子进程 :   说明:   程序执行到os.fork()时,操作系统会创建一个新的进程(子进程),然后复制父进程的所有信息到子进程中。   然后父进程和子进程都会从fork()函数中得到一个返回值,在子进程中这个值一定是0,而父进程中是子进程的id号。   在Unix/Linux操作系统中,提供了一个fork()系统函数,他非常特殊。普通函数调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。   子进程永远返回零,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每一个子进程的ID,而子进程只需调用getppid()就可以拿到父进程的ID.   getpid()  getppid()   多进程修改全局变量   总结:   多进程中,每个进程所有数据(包括全局变量)都各自拥有一份,互补影响。   多次fork问题  

Python 之进程

倾然丶 夕夏残阳落幕 提交于 2020-02-22 15:08:59
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。 Unix/Linux操作系统提供了一个 fork() 系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是 fork() 调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。 子进程永远返回 0 ,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用 getppid() 就可以拿到父进程的ID。 Python的 os 模块封装了常见的系统调用,其中就包括 fork ,可以在Python程序中轻松创建子进程: import os print('Process (%s) start...' % os.getpid()) # Only works on Unix/Linux/Mac: pid = os.fork() if pid == 0: print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())) else: print('I (%s) just created a child process (%s).' % (os