前言&背景 平时在做一些开发时难免要调一些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.进程调度的功能 记录系统中所有进程的状态、优先数和资源的需求情况 确定调度算法。决定将CPU分配给哪个进程及多长时间 分配处理机给进程 2.进程调度方式 非抢占式 :直到进程完成或因为某时间而不能运行时,才将CPU分配给其他进程 。通常用在批处理系统中。主要优点是简单、系统开销小 抢占式 :当一个进程正在执行,系统可以基于某种策略剥夺CPU给其他进程。剥夺的原则有:优先权原则、短进程优先原则和时间原则。主要用于分时系统和实时系统,以便及时响应各进程请求 3.引进进程调度的时机 正在执行的进程正确完成/由于错误终止运行(陷阱和中断) 执行的进程提出I/O请求,等待其完成 分时系统中,进程时间片用完 按照优先级调度时,有更高的优先级进程变为就绪时(抢占方式) 发生阻塞(执行的进程执行了wait、阻塞原语和唤醒原语时) 4.进程调度算法的评价准则 1)面向系统的调度性能准则 吞吐量 处理及利用率 各个设备的均衡利用 2)面向用户的调度性能准则 周转时间 响应时 继续阅读 >>


吕子健 18/04/14 22:18:09
1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 2.关系 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 3.区别 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切 继续阅读 >>


楚东方 17/12/21 23:48:08
1. 什么是守护进程 守护进程daemon,是指没有控制终端,运行在后台的进程,通常伴随着系统启动产生,系统关机结束。可以使用命令ps -axj查看系统的守护进程,输出如下所示: 父ID PID 组ID 会话ID 终端 状态 用户ID 命令 PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 1 1 1 ? -1 Ss 0 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 0 2 0 0 ? -1 S 0 0:00 [kthreadd] 2 3 0 0 ? -1 S 继续阅读 >>


杨博东 17/11/28 01:12:09
进程实验: /* POSIX 下进程控制的实验程序*/ #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <signal.h> #include <ctype.h> /* 允许建立的子进程个数最大值 */ #define MAX_CHILD_NUMBER 10 /* 子进程睡眠时间 */ #define SLEEP_INTERVAL 2 int proc_number=0; /* 子进程的自编号,从0开始 */ void do_something(); int main(int argc, char* argv[]) { /* 子进程个数 */ int child_proc_number = MAX_CHILD_NUMBER; int i, ch; pid_t child_pid; pid_t p 继续阅读 >>


贺含悦 17/08/07 12:38:51
看了线程一个礼拜,我觉得最能考验知识就是这次实验题,让我知道了学习中很多的不足 一、进程原题 /* POSIX 下进程控制的实验程序残缺版 */ #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <signal.h> #include <ctype.h> /* 允许建立的子进程个数最大值 */ #define MAX_CHILD_NUMBER 10 /* 子进程睡眠时间 */ #define SLEEP_INTERVAL 2 int proc_number=0; /* 子进程的自编号,从0开始 */ void do_something(); int main(int argc, char* argv[]) { /* 子进程个数 */ int child_proc_number = MAX_CHILD_NUMBER; int i, ch; pid_ 继续阅读 >>


陈文浩 17/08/06 14:59:15
共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输。这种高效率带来的问题是,我们必须用其他辅助手段来同步进程对共享内存的访问,否则会产生竞态条件。因此,共享内存通常和其他进程间通信方式一起使用。 Linux下有三种共享内存的IPC技术:System V共享内存、共享文件映射(mmap)、POSIX共享内存。 我们在这里只介绍POSIX共享内存。 要使用POSIX共享内存对象需要完成下列任务。 使用shm_open()函数打开一个与指定的名字对应的对象。shm_open()函数与open()系统调用类似,它会创建一个新的共享对象或打开一个既有对象。作为函数结果,shm_open()会返回一个引用该对象的文件描述符。 将上一步中获得的文件描述符传入mmap()调用并在其flags参数中指定MAP_SHARED。这会将共享内存对象映射进进程的虚拟地址空间。与mmap()的其他用法一样,一旦映射了对象之后就能够关闭该文件描述符而不会影响到这个映射。 创建共享内存对象 shm_open()函数创建和打开一个新的共享内 继续阅读 >>


冯鑫 17/08/02 21:15:34
当多个进程同时访问系统上的某个资源的时候,就需要考虑进程的同步问题,以确保任一时刻只有一个进程可以拥有对资源的独占式访问。POSIX信号量不仅可以用于进程之间的同步,也可以用于线程之间的同步。 概述 SUSv3规定了两种类型的POSIX信号量。 命名信号量:这种信号量拥有一个名字。通过使用相同的名字调用sem_open(),不相关的进程能够访问同一个信号量。 未命名信号量:这种信号量没有名字,相反,它位于内存中一个预先商定的位置处。未命名信号量可以在进程之间或一组线程之间共享。当在进程之间共享时,信号量必须位于一个共享内存区域中。当在线程之间共享时,信号量可以位于被这些线程共享的一块内存区域中(如在堆上或在一个全局变量中)。 POSIX信号量是一个整数,其值不能小于0。 命名信号量 要使用命名信号量必须要使用下列函数。 sem_open()函数打开或创建一个信号量并返回一个句柄以供后续调用使用,如果这个调用会创建信号量的话还会对所创建的信号量进行初始化。 sem_post()和sem_wait()函数分别递增和递减一个信号量值。 继续阅读 >>


冯鑫 17/08/01 10:33:37
接上一章,在进行了进程最后部分的学习后,现将进程最后部分的知识进行总结学习 同时会附上进行my_shell项目文档实现的经验 一,进程的其他操作 本部分是一些进程的其他操作,虽然不如进程操作的部分重要,但是还是有很重要的意义 1.获取进程ID 进程ID,是进程的标识之一,进程ID(即PID)的重要性不言而喻 而且,通过进程ID,方便对进程进行其他的操作 #incldue<unistd.h> #incldue<sys/types.h> pid_t getpid(void) //获取当前进程ID pid_t getppid(void) //获取当前进程父进程ID 另外还有获取进程实际用户,有效用户的函数,在之前已经提到过,此处不再赘述 2.setuid与setgid 看过<鸟哥的Linux私房菜>的同学,可能对这两个概念了解的比较好一点 简而言之,这两个函数,使用来处理程序中对用户权限的处理问题 #include&l 继续阅读 >>


陈森 17/07/31 22:53:55
先来跟鸭鸭理清几个名词吧~ 多用户:多个用户同一时间使用计算机 多任务:同时执行几个任务,并且可以在还没有执行完一个任务的时候执行另一个任务 程序:静态,保存在硬盘上的可执行代码 进程:动态,运行中的程序,表示过程(操作系统资源管理的最小单位) 线程:在进程内部,比进程更小的能独立运行的基本单位    PS.与同属一个进程的其他线程共享进程拥有的全部资源    一个线程可以创建和撤销另一个线程,同进程的多个线程可以并行执行(注意并行与并发的区别) 进程标识:ID(唯一的为非负数) 实际用户:标识运行该进程的用户 有效用户:标识来运行该进程的用户身份 父进程和子进程:相当于父亲和儿子 那么如何获取进程标识符呢? 可以使用下面这几个函数: pid_t getgid(id) //进程id pid_t getppid(id) //父进程id pid_t getuid(id) //实际用户id pid_t geteuid(id) //有效用户id pid_t getgi 继续阅读 >>


贺含悦 17/07/31 10:58:49