fork

fork和vfork的区别

别说谁变了你拦得住时间么 提交于 2020-02-04 02:08:31
参见百度百科API说明: fork 头文件: # include <unistd.h> # include <sys/types.h> 函数原型: pid_t fork ( void ); (pid_t 是一个 宏定义 ,其实质是int 被定义在# include < sys/types.h >中) 返回值: 若成功调用一次则返回两个值,子进程返回0, 父进程 返回子进程ID;否则,出错返回-1 函数说明: 一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而 父进程 中返回子进程ID。 子进程是 父进程 的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述 存储空间 的“副本”,这意味着父子进程间不共享这些存储空间。 UNIX将复制 父进程 的 地址空间 内容给子进程,因此,子进程有了独立的地址空间。在不同的UNIX (Like)系统下,我们无法确定fork之后是子进程先运行还是父进程先运行,这依赖于系统的实现。所以在移植代码的时候我们不应该对此作出任何的假设。 为什么fork会返回两次? 由于在复制时复制了 父进程 的 堆栈段 ,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在 父进程

进程基本知识

£可爱£侵袭症+ 提交于 2020-02-04 02:01:18
一、 进程基本知识 1.1 进程概念 进程是程序执行和资源管理的最小单位,是程序动态执行的过程。 Linux下是通过进程控制块(PCB)来描述一个进程的,进程控制块包含了进程的描述信息、控制信息以及资源信息,它是进程的一个静态描述。在Linux中进程控制块中的每一项都是一个task_struct结构,是在include/linux/sched.h中定义的。 1.2 进程标识 在Linux中进程的主要标识有进程标识号(PID)以及父进程标识号(PPID)。PID唯一的标识一个进程。PPID、PID都是一个非零的正整数。获得当前进程的PID和PPID的系统调用分别为 1: #include <sys/types.h> 2: #include <unistd.h> 3: pid_t getpid(void); 4: pid_t getppid(void); 1.3 进程的各个状态 进程状态的宏定义 1: #define TASK_RUNNING 0 2: #define TASK_INTERRUPTIBLE 1 3: #define TASK_UNINTERRUPTIBLE 2 4: #define TASK_STOPPED 4 5: #define TASK_TRACED 8 6: /* in tsk->exit_state */ 7: #define EXIT_ZOMBIE 16 8

UNIX环境编程学习笔记(18)——进程管理之进程控制三部曲

青春壹個敷衍的年華 提交于 2020-02-04 01:58:39
lienhua34 2014-10-05 1 进程控制三部曲概述 UNIX 系统提供了 fork、exec、exit 和 wait 等基本的进程控制原语。通过这些进程控制原语,我们即可完成对进程创建、执行和终止等基本操作。进程的控制可以划分为三部曲, • 第一部:fork 创建新进程。 • 第二部:exec 执行新程序。 • 第三部:exit 和 wait 处理终止和等待终止。 2 第一部:fork 创建新进程 在一个现有的进程中,我们可以通过调用 fork 函数来创建一个新进程, #include <unistd.h> pid_t fork(void); 返回值:子进程中返回0,父进程中返回子进程ID,出错则返回-1 由 fork 创建的新进程被称为子进程。fork 函数调用一次,但返回两次。两次返回的唯一区别是:子进程返回值为 0,而父进程的返回值是新子进程的进程 ID。因为 UNIX 系统没有提供一个函数以获取某个进程的所有子进程 ID,所以父进程可以通过 fork 函数的返回值获取其子进程的进程 ID,并进行后续的处理。而在子进程中,可以通过调用 getppid 函数获取其父进程的进程 ID。 fork 函数返回之后,子进程和父进程都各自继续执行 fork 调用之后的指令。子进程是父进程的副本。例如,子进程获得了父进程数据空间、堆和栈的副本。但是,父子进程共享正文段。 例子

orange's学习--第十章:fork介绍

╄→尐↘猪︶ㄣ 提交于 2020-02-03 22:04:00
shell的原理,说来简单,其实就是用一个子进程来执行一个命令。 一个新的进程需要的要素有: 自己的代码,数据和堆栈; 在proc_table[ ]中占用一个位置; 在GDT中占用一个位置,用以存放进程对应的LDT描述符。 后两项工作比较容易完成,那第一项呢,代码、数据和堆栈从哪里来呢?传统上,生成一个新的进程时,这些都是直接从某个已有的进程那里继承或者复制。这也正解释了子进程这一概念:如果新的进程C的代码、数据和堆栈是从已有的进程P而来,那么P被称为父进程(parent),C被称为子进程(child)。 也就是父子进程是同一个程序代码,通过if--else进入不同分支执行。 生成一个子进程的系统调用被称为fork(),操作系统接到一个fork请求后,会将调用者复制一份,这时就会有两个一模一样的进程同时运行。fork()的返回值有两种:零或非零。如果返回零,表明自己是个子进程;如果返回非零,不仅表明自己是父进程,而且返回值即子进程的pid。 来源: CSDN 作者: 高云朋 链接: https://blog.csdn.net/port23/article/details/104160951

Redis持久化

我们两清 提交于 2020-02-03 07:07:22
一、 文档介绍 redis作为一个内存数据库,读写快,效率高,但是也会有宕机丢失数据的风险,于是就需要持久化操 Q&A: 数据量大于内存大小时应该怎么做? 增加内存or采用内存淘汰策略orRedis集群 持久化会辅助扩大Redis的存储空间么? 不会,持久化的主要作用是数据备份,保证数据不会因进程退出而丢失 (在dump的基础上开始准备Restore的实现,dump操作的第一步就是将aof文件内的记录同步到redis内,故了解一下aof文件) 二、RDB与AOF持久化的原理 2.1 RDB RDB可以认为是Snapshot文件,当恢复时,通过加载RDB文件。把数据从磁盘加载读取到Redis中。 RDB产生:(考虑快照时的操作) SAVE方式:阻塞请求 BGSAVE:fork一个子进程,子进程将快照写到一个临时的RDB文件,写完之后替换旧的RDB文件 RDB的加载: Redis持久化可以禁用,此时数据仅存在于服务器的运行时间内 Redis持久化也可以共存,当同时存在的时候,Redis重启是会先加载AOF文件 2.2 AOF AOF可以认为是日志文件,Append only File,每次对数据的变更或者操作都会先记录打AOF内,当服务启动的时候就会先读取这些文件,重新执行一遍来恢复原始数据。 AOF提供三种同步(写aof文件与操作数据的同步)的方式: always

Fork/Join框架

若如初见. 提交于 2020-02-02 21:02:42
ForkJoinTask 分解任务fork出新任务,汇集任务join得到结果 来源: CSDN 作者: 大栗子122 链接: https://blog.csdn.net/weixin_45095479/article/details/104146557

2020.1.2

本秂侑毒 提交于 2020-02-02 19:32:51
今天学习了github的一些相关,简单来说他是一个托管项目代码的工具。我在用自己的电脑访问这个网站的时候,应该受到网络限速的原因没有办法进行成功的访问这个网站。 在注册自己的账户的时候,需要认证,此时你需要绑定邮箱,此时你需要在邮箱里面的设置中添加自己的域名白名单,否则你是不能够成功地接受验证邮件的。 学习了相关github的一些基本操作,创建仓库,像仓库中添加东西,删除,或是修改里面的内容。了解了issue,fork等基本知识,例如fork的仓库是单独存在的,如果对原仓库中进行其他操作,发送那个pullrequest会在原仓库中出现动态显示,看原仓库的主人是否采取; 还有就是本地创建仓库的流程 在此之后还需要下载git进行一些辅助操作,比较简单便捷。 来源: https://www.cnblogs.com/moxihuishou/p/12253296.html

linux之间进程通信

扶醉桌前 提交于 2020-02-02 00:17:47
进程间通信方式: 同主机进程间数据交换机制: pipe(无名管道) / fifo(有名管道)/ message queue(消息队列)和共享内存。 必备基础: fork() 创建一个与之前完全一样的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。    vfork : 与fork用法相同,但是他和父进程共享同样的数据存储,因此无需完全复制父进程的地址空间。 // fork() study example 1#include <unistd.h> #include <stdio.h> int main () { pid_t fpid; //fpid表示fork函数返回的值 int count=0; // fork 会将这个变量存在两个不同的内存中,所以两次count的值都是 1 ,而不是 1,2 。 fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d、n",getpid(

python多任务编程

眉间皱痕 提交于 2020-02-01 10:34:01
文章目录 进程 (Process) 多进程编程 multiprocessing 模块创建进程 创建自定义进程类 进程池技术 进程间通信 (IPC) 管道通信 Pipe 消息队列 共享内存 信号通信 信号量(信号灯) 线程 线程同步互斥方法 多线程并发 意义 : 充分利用计算机的资源提高程序的运行效率 定义 : 通过应用程序利用计算机的多个核心达到同时执行多个任务的目的,一次提高计算机运行效率。 实施方案 : 多进程 多线程 并行 : 多个计算机核心在同时处理多个任务,这时多个任务间是并行关系。 并发 : 同时处理多个任务,内核在多个任务间不断的切换,达到好像都在处理运行的效果。但实际一个时间点内核只能处理其中一个任务。 进程 (Process) 定义 : 程序在计算机中的一次运行过程 程序 : 是一个可执行的文件,是静态的占有磁盘空间,不占有计算机的运行资源 进程 : 进程是一个动态过程的描述,占有计算机的资源,有一定的生命周期 同一个程序的不同运行过程是不同的进程,占用资源和生命周期都不一样。 进程的创建流程 1.用户空间通过运行程序或者调用接口发起创建进程 2.操作系统接受用户请求,开始创建进程 3.操作系统分配计算机资源,确定进程状态,开辟进程空间等工作 4.操作系统将创建好的进程提供给应用程序使用 cpu时间片 如果一个进程占有计算机核心

Python学习理解进程与线程

╄→尐↘猪︶ㄣ 提交于 2020-02-01 09:00:55
1.进程与线程基本概念 进程(英语:process) ,是指计算机中已运行的程序。进程曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立运行。现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)运行的感觉。同样的,使用多线程技术(多线程即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机体系结构,同样程序的平行线程,可在多CPU主机或网络上真正同时运行(在不同的CPU上)。 来源维基百科 线程(英语:thread) ,是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes)