文章目录前言进程概念线程概念地址空间通信手段调度和切换进程何时调度线程切换进程的创建过程fork 函数task_struct父子进程间的文件共享线程的实现一对一模型 (内核级线程) 1:1多对一模型 (用户级线程) M:1多对多模型 两级模型 M:N 前言 书本上的定义: 线程是调度的基本单位, 进程是资源分配的基本单位 应该大家都知道这个概念, 但是进程和线程之间的异同绝不仅仅是这一句话这么简单 进程概念 进程是由正文段 (存放被执行的机器指令), 用户数据段 (存放进程在执行时直接进行操作的所有数据, 包括进程使用的全部变量在内), 系统数据段 (存放程序运行的环境) 而这个所谓的系统数据段也正是进程中最重要的一部分, 它就是进程和程序的区别所在, 进程作为一个动态的程序实例, 这一部分就存放着进程的控制信息, 每个进程都有一个 task_strust 数据结构 (也就是 PCB) 来存放这些控制信息. 操作系统也是通过这些控制信息 (task_struct) 来控制调度所有进程的 线程概念 继续阅读 >>


吕子健 19/01/19 20:36:07
进程池 进程池的使用场景 当我们需要并行的处理大规模任务的时候,需要使用到多进程,多线程技术,比如说服务器处理大量客户端的任务,我在大一的时候写过一个C/S+mysql架构的聊天室,大概是这样处理的,每当有客户端发出连接请求时,服务器accept成功以后就去fork一个进程去处理关于这个客户端的所有请求,经过后来的一系列的学习,这显然是极其不科学的,狂开进程浪费资源且不说,效率也极低。 动态创建进程(或线程)是比较耗费时间的,这将导致较慢的客户响应。 动态创建的子进程(或子线程)通常只用来为一个客户服务(除非我们做特殊处理),这将导致系统上产生大量的细微进程(或者线程)。进程(或者线程)间的切换消费大量CPU时间。 动态创建的子进程是当前进程的完整映像。当前进程必须谨慎地管理其分配的文件描述符和堆内存等系统资源,从而使系统的可用资源急剧下降,进而影响服务器的性能。 池化的思想 为了解决上述问题呀,我们的前辈们相出了用池化的思想来解决这些资源消耗问题。简而言之,就是提前创建好一些进程,一般3-7个 继续阅读 >>


刘嘉辉 19/01/03 10:46:49
fork到底复制了父进程的哪些资源? 我们来看一个例子 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/wait.h> int main() { pid_t pid; int num = 5; int status; pid = fork(); switch(pid) { case -1: perror("create porcess is failed"); exit(-1); case 0: printf("child process num is:%d\n", num); exit(0); default: wait(&status); printf("parent process num is: %d\n", num); break; } return 0; } 运行结果如下: 继续阅读 >>


朱文博 18/08/12 15:45:41
进程 Linux是一个多用户多任务的操作系统。 1概念:进程,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。它的执行需要系统分配资源创建实体之后,才能进行。 举个例子: 我们所写的程序,在运行的时候它也是一个进程。 2进程和程序的区别: 程序相当于是一个文件,是有序代码的集合,是静态的存储在硬盘中。而进程是运行中的程序,系统会为变量分配相应的内存和初始化它们的值,还有一些资源如:堆,栈等…当程序运行完进程也就结束了,但程序还是保存在硬盘中没有消失 进程的特性 (1)并发性:可以与其它进程在宏观上同时向前推进(一会在下面讲解和并行性的区别)。 (2)动态性:进程是执行中程序,动态产生、动态消亡、动态变化。 (3)独立性:进程是系统资源分配的基本单位。 (4)交往性:与其它进程可以进行交互。 (5)异步性:不统一推进。 (6)结构性:每个进程有一个控制块PCB。 (7)并行性:只有在多cpu多处理器的计算机上,进程才能并行执行。 我们谈谈 继续阅读 >>


朱文博 18/08/12 12:06:03
进程学习总结 1.进程基本理解 正在执行的程序就叫进程。 2.进程的产生 在Linux环境下可以使用fork()函数创建进程,使用fork()函数的进程就是fork()函数产生进程的父进程。 3.对新产生进程的操作 使用exec系列函数 exec系列函数共同点就是把一个进程执行的程序换成你指定的程序 在一个进程中,如果你想执行多个程序,那就要使用exec系列函数。 在该进程中,使用fork函数产生一个子进程,然后在该子进程中使用exec子列函数把该进程执行的程序替换,就可以执行你的程序,执行完后退出回到父进程就好。 4.僵尸进程的产生 操在作系统中,一个父进程可以有很多子进程,父进程并不能预测子进程何时结束,所以需要父进程调用wait()/waitpid()函数收集子进程情况,以便子进程结束时系统能及时回收资源。当父进程未调用wait()/waitpid()函数时,若子进程结束,则该子进程成为僵死进程,占用系统的进程号。 5.孤儿进 继续阅读 >>


严欣豪 18/08/06 00:03:13
关于守护进程 为什么要设置守护进程? 守护进程———>就是脱离用户终端的后台进程 当我们关闭终端时,该进程也不会退出。举个例子:比如我们远程登录一个linux系统,通过终端运行服务器程序,此时我们关闭终端退出来的时候,我们希望该服务器程序依然运行。此时就需要使该服务器进程是守护进程。 他是Linux的一种长期运行的后台服务进程。我们常见的httpd,named,sshd等服务都是以守护进程Daemon方式运行的,通常服务名称以字母d结尾。 与普通进程相比的特点有: 无需终端控制(不需要与用户交互) 在后台运行 生命周期比较长,一般是随系统启动和关闭 守护进程的实现步骤: 1.让进程在后台执行。 方法是:调用fork产生一个子进程,让父进程退出,子进程就成了孤儿进程 ,使子进程成为后天进程。 2.在子进程中创建新的会话,脱离控制终端 刚开始,一个会话组id对应一个终端,会话组里包含前台进程组和后台进程组。当关闭终端时,会话组里的所有进程都关闭。所以子进程要想脱离终端时,使用setsid()就 继续阅读 >>


李重乐 18/08/05 19:36:05
前言&背景 平时在做一些开发时难免要调一些shell脚本或者外部程序,golang提供了exec包很方便的帮我们解决了这个问题。但是当外部程序或者shell脚本夯死就使得我们自身的程序很不稳定。与此同时,当我们已经感知到程序脚本运行出现问题时,我们可能需要立刻对程序进行杀死的操作,但是当我们很自然的想到cmd.Process.Kill()时,我们又遇上了另外一个问题,因为这个操作并没有将子进程kill掉,所以我们的需求就出来了,那就是: Kill进程及其子进程 首先给出解决方案,那就是kill掉进程组 给出一个有测试和原理分析的相关链接,我这里也来说下具体用法。 cmd := exec.Command("/bin/sh", "-c", "...........") // Go会将PGID设置成与PID相同的值 cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} syscall.Kill(-cmd.Process.Pid 继续阅读 >>


朱新全 18/08/05 12:04:20
进程总结 1.进程概念 进程是运行中的程序,程序是保存在硬盘上的可执行代码 进程内部又划分了许多线程,线程基本上不拥有系统资源,他与同属一个进程的其他线程共享进程的全部资源。 进程在执行过程中拥有独立的内存单元。内部线程可共享这些内存,一个线程可以创建和撤销另一个线程,同一个线程中的多个进程可以并行执行。 ps或pstree可以查看当前的进程 2.进程标识 获得进程各种标识符的函数表 include 3.进程结构 | 名称 | 内容 | | —— | —————————————————- | | 代码段 | 存放程序可执行代码 | | 数据段 | 存放全局变量,常量,静态变量 | | 堆 | 存放动态分配的内存变量 继续阅读 >>


李重乐 18/08/04 09:59:23
  在linux系统中,对于进程进行控制的主要系统调用以下所示 fork:用于创建一个新进程。 exit:用于终止进程 exec:用于执行一个应用程序 wait:将父进程挂起,等待子进程终止 getpid:获取当前进程的进程ID nice:改变进程的优先级 1.fork函数 函数声明 #include<sys/types.h> #include<unistd.h> pid_t fork(void);   根据书上所介绍的,fork函数有两个返回值,调用一次返回两次,一个是父进程调用fork后的返回值,一个是子进程中fork函数的返回值,该返回值为0。fork函数返回两次的前提是进程创建成功,如果进程创建失败,则只返回-1   以下是man手册里的部分相关描述:   fork() creates a new process by duplicating the calling process. The new 继续阅读 >>


陈健源 18/08/03 21:53:40
先来看下进程是什么? 1、首先进程是什么呢? 进程是一个动态的实体,是程序的一次执行过程。进程是操作系统资源分配的基本单位。 2、进程和程序有什么区别呢? 进程和程序的区别在于进程是动态的,程序是静态的,进程是运行中的程序,程序是一些保存在硬盘上的可执行的代码。 注:linux下可通过命令ps或pstree查看当前系统中的进程 linux操作系统中,每个进程都是通过唯一的进程ID标识的(此ID是一个非负数)。 在linux系统中,用于对进程进行控制的主要系统调用如下: fork:用于创建一个新进程。 exit:用于中止进程。 exec:用于执行一个应用程序。 wait:将父进程挂起来,等待子进程终止。 getpid:获取当前进程的进程ID nice:改变进程的优先级 5.进程状态 运行状态(R):程序正在运行 可中断等待状态(S):进程正在等待某个事件完成(如数据到达)。等待过程可被信号或定时器唤醒。 不可中断等待状态(D):进程等待某个事 继续阅读 >>


刘甜 18/08/02 21:20:39