fork

Threads and fork(). How can I deal with that? [duplicate]

人走茶凉 提交于 2020-02-19 19:06:24
问题 This question already has answers here : Closed 7 years ago . Possible Duplicate: fork in multi-threaded program If I have an application which employs fork() and might be developed as multithreaded, what are the thumb rules/guidelines to consider to safely program this kind of applications? 回答1: The basic thumb rules, according to various internet articles like ( http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them , fork in multi-threaded program ) are: (Main)

配置mongodb分片群集(sharding cluster)

给你一囗甜甜゛ 提交于 2020-02-19 10:37:43
Sharding cluster介绍 这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统。 要构建一个 MongoDB Sharding Cluster,需要三种角色: Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障 Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。 Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。 Sharding架构图 本例实际环境架构 本例架构示例图: 分别在3台机器运行一个mongod实例(称为mongod shard11,mongod shard12,mongod shard13)组织replica set1,作为cluster的shard1 分别在3台机器运行一个mongod实例(称为mongod shard21,mongod shard22,mongod shard23)组织replica set2,作为cluster的shard2 每台机器运行一个mongod实例,作为3个config server

linux 下 进程和线程的区别

僤鯓⒐⒋嵵緔 提交于 2020-02-17 15:32:24
1、进程与线程 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。 从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位 。 线程是进程的一个 执行流,是CPU调度和分派的基本单位 ,它是比进程更小的能独立运行的基本单位 。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源。 "进程——资源分配的最小单位,线程——程序执行的最小单位" 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。 总的来说就是: 进程有独立的地址空间,线程没有单独的地址空间 (同一进程内的线程共享进程的地址空间) 。(下面的内容摘自 Linux下的多线程编程 ) 使用多线程的 理由之一 是 和进程相比,它是一种非常"节俭"的多任务操作方式 。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段

2.15 C++专项练习 错题复盘

核能气质少年 提交于 2020-02-15 17:51:10
定义宏#define DECLARE(name, type) type name##_##type##_type, 则DECLARE(val, int)替换结果为() 正确答案: A 你的答案: B (错误) int val_int_type int val_int_int int name_int_int int name_int_name解析:##相当于强制分割,所以分成了 name,_,type,_type 所以答案显而易见了 以下数字在表示为double(8字节的双精度浮点数)时存在舍入误差的有()。 正确答案: A B C 你的答案: A B (错误) 2的平方根 10的30次方 0.1 0.5 100解析:小数看是否有误差的时候就是化为二进制,如果能够化开那就可以,如果不行的话那么就要舍入 下列运算符重载函数中,属于友元函数的是( ) 正确答案: B C D 你的答案: C D (错误) Base operator+(Base); Base operator--(Base); Base operator&&(Base, Base); Base operator++(Base,int);解析:看出是否是友元的话主要是看是否能够调用this指针,这样就会少传进一个参数, 下面关于"指针"的描述不正确的是() 正确答案: A 你的答案: C (错误)

PHP多进程初步

不羁岁月 提交于 2020-02-15 10:35:21
一、前言 我们都知道PHP是单线程执行,处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli模式下处理大量数据或运行后台DEMON守护进程时。不能应用在Web服务器环境。 /** 检测是否CLI模式,确保这个函数只能运行在SHELL中 */ if (substr(php_sapi_name(), 0, 3) !== 'cli') {   die("cli mode only"); } 日常任务中,有时需要通过php脚本执行一些日志分析,队列处理等任务,当数据量比较大时,可以使用多进程来处理。 PHP的多线程也曾被人提及,但进程内多线程资源共享和分配的问题难以解决。PHP也有多线程想关的扩展 pthreads ,但据说不太稳定,且要求环境为线程安全,所用不多。 要实现PHP的多进程,需要安装 pcntl 和 posix 扩展。 二、创建子进程 使用 pcntl_fork() 函数可以在当前位置产生分支。fork 是创建了一个子进程,父进程和子进程都从 fork 的位置开始向下继续执行,不同的是父进程执行过程中,得到的 fork 返回值为子进程号,而子进程得到的是0,执行失败则返回-1。 因为系统初始init进程的pid为1,后来的所有进程pid都会大于该进程,所以可以通过 pcntl_fork()

PHP多线程

主宰稳场 提交于 2020-02-15 10:34:49
PHP 在liunx里面是可以实现多进程的,但需要使用liunx扩展: pcntl 扩展 主要代码是 1 2 3 4 5 6 7 8 9 10 11 $pid = pcntl_fork(); //创建子进程 if ( $pid == -1) { die ( 'could not fork' ); //错误处理:创建子进程失败时返回-1. } else if ( $pid ) { pcntl_wait( $status ,WNOHANG); //父进程会得到子进程号,所以这里是父进程执行的逻辑 //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成: //等待子进程中断,防止子进程成为僵尸进程。 } else { exit (0); //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。 } PHP进程 从这样,可以看出来,父进程和子进程不是同步关系。父进程结束,子进程可以继续执行,父进程在等待子进程结束并回收。 PHP进程 这里的PHP-fpm 都是fork出来的子进程,并且都是并行执行的。 所以原本单线程需要23分钟执行的代码,这里fork出20个子进程,就可以把时间缩短到30秒 来源: https://www.cnblogs.com/gaf617/p/7281196.html

[APUE]进程控制(中)

我与影子孤独终老i 提交于 2020-02-15 10:14:47
一、wait和waitpid函数 当一个进程正常或异常终止时会向父进程发送SIGCHLD信号。对于这种信号系统默认会忽略。调用wait/waidpid的进程可能会: 阻塞(如果其子进程都还在运行); 立即返回子进程的终止状态(如果一个子进程已经终止正等待父进程存取其终止状态); 出错立即返回(如果它没有任何子进程); 如果进程由于收到SIGCHLD信号而调用wait,则可期望wait会立即返回。但是在任一时刻调用则进程可能阻塞。 #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *statloc); pid_t waitpid(pid_t pid, int *statloc, int options); 返回值: 成功返回进程ID, 出错-1. 这两个函数区别: wait如果在子进程终止前调用则会阻塞,而waitpid有一选项可以使调用者不阻塞。 waitpid并不等待第一个终止的子进程--它有多个选项,可以控制它所等待的进程。 如果调用者阻塞而且它有多个子进程,则在其一个子进程终止时,wait就立即返回。因为wait返回子进程ID,所以调用者知道是哪个子进程终止了。 参数statloc是一个整型指针。如果statloc不是一个空指针,则终止状态就存放到它所指向的单元内

linux c语言 fork() 和 exec 函数的简介和用法

孤者浪人 提交于 2020-02-15 10:06:03
linux c语言 fork() 和 exec 函数的简介和用法 假如我们在编写1个c程序时想调用1个shell脚本或者执行1段 bash shell命令, 应该如何实现呢? 其实在<stdlib.h> 这个头文件中包含了1个调用shell命令或者脚本的函数 system();直接把 shell命令作为参数传入 system函数就可以了, 的确很方便. 关于system 有一段这样的介绍: system 执行时内部会自动启用fork() 新建1个进程, 效率没有直接使用fork() 和 exec函数高. 那么这篇文章其实就是介绍一下fork() 和 exec函数的用法, 以及如何使用它们来替代system函数. 1. fork() 函数 1.1 fork() 函数的作用 一般来讲, 我们编写1个普通的c程序, 运行这个程序直到程序结束, 系统只会分配1个pid给这个程序, 也就就说, 系统里只会有一条关于这个程序的进程. 但是执行了fork() 这个函数就不同了. fork 这个英文单词在英文里是"分叉"意思, fork() 这个函数作用也很符合这个意思. 它的作用是复制当前进程(包括进程在内存里的堆栈数据)为1个新的镜像. 然后这个新的镜像和旧的进程同时执行下去. 相当于本来1个进程, 遇到fork() 函数后就分叉成两个进程同时执行了. 而且这两个进程是互不影响

Linux下Fork与Exec使用

感情迁移 提交于 2020-02-15 10:04:29
一、引言   对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。与DOS和早期的Windows不同,Unix/Linux系统是真正实现多任务操作的系统,可以说,不使用多进程编程,就不能算是真正的Linux环境下编程。   多线程程序设计的概念早在六十年代就被提出,但直到八十年代中期,Unix系统中才引入多线程机制,如今,由于自身的许多优点,多线程编程已经得到了广泛的应用。 下面,我们将介绍在Linux下编写多进程和多线程程序的一些初步知识。 二、多进程编程 什么是一个进程?进程这个概念是针对系统而不是针对用户的,对用户来说,他面对的概念是程序。当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。但和程序不同的是,在这个进程中,系统可能需要再启动一个或多个进程来完成独立的多个任务。多进程编程的主要内容包括进程控制和进程间通信,在了解这些之前,我们先要简单知道进程的结构。    2.1 Linux下进程的结构   Linux下一个进程在内存里有三部分的数据,就是"代码段"、"堆栈段"和"数据段"

Redis提供的持久化机制(RDB和AOF)

一世执手 提交于 2020-02-14 17:39:00
Redis提供的持久化机制     Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能、持久存储、适应高并发应用场景等优势。它虽然起步较晚,但发展却十分迅速。 近日,Redis的作者在博客中写到, 他看到的所有针对Redis的讨论中,对Redis持久化的误解是最大的 ,于是他写了一篇长文来对Redis的持久化进行了系统性的论述。 文章主要包含三个方面: Redis持久化是如何工作的、这一性能是否可靠以及和其它类型的数据库比较 。以下为文章内容: 一、Redis持久化是如何工作的?   什么是持久化?简单来讲就是将数据放到断电后数据不会丢失的设备中,也就是我们通常理解的硬盘上。 首先我们来看一下数据库在进行写操作时到底做了哪些事,主要有下面五个过程 : 客户端向服务端发送写操作(数据在客户端的内存中)。 数据库服务端接收到写请求的数据(数据在服务端的内存中)。 服务端调用write这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)。 操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)。 磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)。 故障分析 写操作大致有上面5个流程, 下面我们结合上面的5个流程看一下各种级别的故障 : 当数据库系统故障时,这时候系统内核还是完好的。那么此时只要我们执行完了第3步