精华内容
下载资源
问答
  • 【计算机操作系统】进程管理详解?进程与线程区别是什么?进程调度的算法有哪些?进程通信有哪些? 1.进程与线程的区别是什么(高频)? a.拥有资源 进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属...

    【计算机操作系统】进程管理详解?进程与线程区别是什么?进程调度的算法有哪些?进程通信有哪些?

    1.进程与线程的区别是什么(高频)?

    a.拥有资源

    进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

    b.调度

    线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程的切换,从一个进程的线程切换到另一个进程中线程时,会引起进程切换。

    c.系统开销

    由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备,所付出的开销远大于创建或撤销线程时的开销。 在进程进程切换时,涉及当前执行进程CPU环境的保存以及新调度进程CPU环境的设置,而线程切换时只需保存和设置少量寄存器内存,开销很小;

    d.通信方法

    线程间可以通过直接读写同一进程中的数据进行通信,但是进程间通信需要借助IPC。

    2.进程状态的切换

    就绪状态(ready):等待被调度

    运行状态(running)

    阻塞状态(waiting):等待资源

    3.进程调度算法

    不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法;

    批处理系统:

    • 先来先服务(按照请求顺序);
    • 短作业优先(按照运行时间最短的顺序调度);
    • 最短剩余时间优先(按照剩余运行时间调度顺序调度);

    交互式系统:

    • 时间片轮转;
    • 优先级调度;

    4.进程同步与进程通信

    • 进程同步:控制多个进程按一定顺序执行;
    • 进程通讯:进程间传输信息;

    5.进程同步

    • 临界区: 对临界资源进行访问的那段代码被称为临界区;
    • 同步与互斥: 同步多个进程有一定的先后执行关系;互斥是多个进程在同一时刻只能有一个进程能进入临界区;
    • 信号量: 信号量是一个整型变量,可以对其执行down和up操作,即常见的P和V操作;
    • 管程: 使用信号量机制实现的生产者消费者问题需要客户端代码做很多控制,而管程把控制的代码独立出来了。

    哲学家就餐的问题,如何防止死锁的发生,可以设置两个条件:

    • 必须同时拿起左右两根筷子;
    • 只有在两个邻居都没有进餐的情况下才允许就餐;

    6.进程通信(高频)

    进程同步与进程通信很容易混淆,它们的区别在于:

    • 进程同步:控制多个进程按一定顺序执行;
    • 进程通信:进程间传输信息;

    为了能够达到进程同步的目的,需要让进程间进行通信,传输一些进程同步所需要的信息;

    a.管道

    管道是通过调用pipe函数创建的,fd[0]用于读,fd[1]用于写;

    • 只支持半双工通信(单向交替传输);
    • 只能在父子进程或者兄弟进程中使用;

    b.FIFO命名管道

    也被称为命名管道,去除了管道只能在父子进程中使用的限制。常用于客户进程和服务器进程之间传递数据。

    c.消息队列

    相比较FIFO,消息队列:

    • 可以独立于读写进程存在;
    • 避免了FIFO的同步阻塞问题;
    • 读进程可以根据消息类型有选择地接收消息,而不像FIFO那样只能默认地接收。

    d.信号量

    它是一个计数器,用于为多个进程提供对共享数据对象的访问;

    e.共享存储

    允许多个进程共享一个给定的存储区,因为数据不需要在进程之间复制,所以这是最快的一种IPC;

    f.套接字

    与其它通信机制不同,它可用于不同机器间的进程通信;

    相关问题对比:

    进程通信:管道、FIFO、消息队列、共享存储、信号量、套接字

    线程通信:共享变量、阻塞唤醒、管道

    展开全文
  • 进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) TASK_INTERRUPTIBLE(可中断等待状态) TASK_...

    一、进程

    在这里插入图片描述

    进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些?

    • TASK_RUNNING(可运行状态)
    • TASK_INTERRUPTIBLE(可中断等待状态)
    • TASK_UNINTERRUPTIBLE(不可中断等待状态)
    • TASK_STOPPED(进程被其它进程设置为暂停状态)
    • TASK_TRACED(进程被调试器设置为暂停状态)
    • TASK_DEAD(退出状态)

    进程由于所需资源得不到满足,从而进入等待队列,但是该状态能够被信号中断。比如当一个正在运行的进程因进行磁盘I/O操作而进入可中断等待状态 时,在I/O操作完成之前,用户可以向该进程发送SIGKILL,从而使该进程提前结束等待状态,进入可运行态,以便响应SIGKILL,执行进程退出代 码,从而结束该进程。

    当进程退出时(例如调用exit或者从main函数返回),需要向父进程发送信号,父进程进行信号处理时,需要获取子进程的信息,因此这时不能删除 子进程的task_struct。另外每个进程都有一个内核态的堆栈,当进程调用exit()时,在切换到另外一个进程前,总是要使用内核态堆栈,因此当 进程调用exit()时,完成必要的处理后,就把state设置为TASK_DEAD,并切换到其他进程。当顺利地切换到其他进程后,由于该进程的状态设 置为TASK_DEAD,因此这个进程不会被调度,之后当调度器检查到状态为TASK_DEAD的进程时,就会删除这个进程的task_struct结 构,这样这个进程就彻底的消失了。

    EXIT_ZOMBIE(僵死进程):父进程等待子进程结束时发送的SIGCHLD信号(默认情况下,创建进程都会设置在进程退出的时候向父进程发送信号的标志,除非创建的是轻权进程),此时子进程已退出,并且SIGCHLD信号已经发送,但是父进程还没有被调度运行;EXIT_DEAD(僵死撤销状态):父进程对子进程的退出信号“没兴趣”,或者在子进程退出时,父进程通过waitpid()调用等待子进程的SIGCHLD信号。

    二、僵尸进程

    在这里插入图片描述
    1) 怎么产生僵尸进程

    一个进程在调用exit命令结束自己的时候,其实它并没有真正的被销毁,只是进程不能被调度并处于EXIT_ZOMBIE状态,它占用的所有内存就 是内核栈、thread_info结构和task_struct结构。此时进程存在的唯一目的就是向它的父进程提供信息,如果它的父进程没有调用wait 或waitpid等待子进程结束,又没有显示地忽略该信号,那么它就一直保持EXIT_ZOMBIE状态。

    2) 怎么查看僵尸进程

    利用命令ps,看到有标记为Z的进程就是僵尸进程。

    3) 怎么清理僵尸进程

    • 父进程可以调用waitpid、wait函数来等待子进程结束
    • 把父进程杀掉,父进程死后,僵尸进程成为“孤儿进程”,过继给init进程,init进程始终负责清理僵尸进程,它产生的所有僵尸进程也跟着消失。

    文章福利】小编推荐自己的C/C++、Linux技术交流群:【1106675687】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!
    在这里插入图片描述
    在这里插入图片描述

    三、PID管理

    在Linux系统中用pid结构体来标识一个进程,通过pidmap位图来管理所有的进程号(即pid:与前面的pid结构体不是同一个意思),目 的就是要更快的找到目标进程。用pid结构体来表示进程的优点:比直接用数字pid_t更容易管理(进程退出时pid回收再分配效率高),比直接用 task_struct标识进程占用空间小。

    pid结构体如下所示:

    struct pid 
    { 
    atomic_t count; 
    int nr;                          /*存放pid数值*/ 
    struct hlist_node pid_chain;        /*把该pid链到哈希表中*/ 
    struct hlist_head tasks[PIDTYPE_MAX]; 
    struct rcu_head rcu; 
    }; 
    

    因为对于32位系统来说,默认最大的pid为32768,由于pidmap位图中每一位表示这个pid是否可用,共需要32768位,正好一个物理页的大小(410248)。

    pidmap结构体如下所示:

    struct pidmap { 
           /* 
            *这个变量用来统计这个结构体对应的一页物理内存中有多少个位 
                *是0的,即空闲pid的数量 
            */ 
           atomic_t nr_free;  
           void *page;      /*这个就是指向存放这个位图的内存页的指针*/ 
    }; 
    

    下面首先来看Linux内核启动之初在start_kernel函数中对pidmap位图的初始化函数pidmap_init如下所示:

    void __init pidmap_init(void) 
    { 
       /*申请一页物理内存,并初始化为0*/ 
    init_pid_ns.pidmap[0].page = kzalloc(PAGE_SIZE, GFP_KERNEL); 
      /*将第0位设置为1,表示当前进程使用pid为0,即现在就是0号进程*/ 
    set_bit(0, init_pid_ns.pidmap[0].page); 
       /*同时更新nr_free统计空闲pid的值*/ 
    atomic_dec(&init_pid_ns.pidmap[0].nr_free); 
    pid_cachep = KMEM_CACHE(pid, SLAB_PANIC); 
    } 
    

    再来看Linux内核启动之初在start_kernel函数中对pid hash表的初始化函数pidhash_init如下所示:

    void __init pidhash_init(void) 
    { 
    int i, pidhash_size; 
       /* 
        *nr_kernel_pages表示内核内存总页数,就是系统DMA和NORMAL内 
            *存页区的实际物理内存总页数 
        *megabytes:统计的是内核内存有多少MB 
        */ 
    unsigned long megabytes = nr_kernel_pages >> (20 - PAGE_SHIFT); 
      /*从下面两行代码可以看出pidhash_shift是在4~12之间的*/ 
    pidhash_shift = max(4, fls(megabytes * 4)); 
    pidhash_shift = min(12, pidhash_shift); 
    pidhash_size = 1 << pidhash_shift; 
    printk("PID hash table entries: %d (order: %d, %Zd bytes)\n", 
    pidhash_size, pidhash_shift, 
    pidhash_size * sizeof(struct hlist_head)); 
       /* 
       *由alloc_bootmem可知pid_hash是在低端物理内存申请的,由于 
           *pidhash_init函数是在mem_init函数执行之前被调用的,所以这里申请  
           *的内存是不会被回收的 
       */ 
    pid_hash = alloc_bootmem(pidhash_size * sizeof(*(pid_hash))); 
    if (!pid_hash) 
    panic("Could not alloc pidhash!\n"); 
    for (i = 0; i < pidhash_size; i++) 
           /*初始化每个表的每个表项的链表*/ 
    INIT_HLIST_HEAD(&pid_hash[i]); 
    } 
    

    总结:内核维护两个数据结构来维护进程号pid,一个是哈希表pid_hash,还有一个位图pidmap。在 do_fork()中每调用一次alloc_pid(),首先会通过调用alloc_pidmap()修改相应的位图,该函数的主要思想是:last记录 上次分配的pid,此次分配的pid为last+1,如果pid超出最大值,那么就循环回到最初值(RESERVED_PIDS),然后测试pidmap 上该pid所对应的bit是否为0,直到找到为止。其次通过hlist_add_head_rcu函数在pid_hash表中增加一项。

    四、进程的堆栈

    一个进程有两个堆栈:用户态堆栈和内核态堆栈。用户态堆栈的空间指向用户地址空间,内核态堆栈的空间指向内核地址空间。

    当进程由于中断或系统调用从用户态(进程在执行用户自己的代码)转换到内核态(进程在执行内核代码)时,进程所使用的栈也要从用户栈切换到内核栈。

    用户栈向内核栈的切换:进入内核态后,首先把用户态的堆栈地址保存在内核堆栈中,然后设置堆栈指针寄存器的地址为内核栈地址。

    内核栈向用户栈的切换:把保存在内核栈中的用户栈地址恢复到堆栈指针寄存器即可。

    五、Linux下进程与线程的区别

    1)进程是资源分配的基本单位,线程是CPU调度的基本单位

    2)进程有独立的地址空间,线程有自己的堆栈和局部变量,但是没有独立的地址空间(同一个进程内的线程共享进程的地址空间)

    六、写时拷贝机制(copy on write)

    为了节约物理内存,在调用fork()生成新进程时,新进程与原进程会共享同一物理内存区(调用clone()建立线程,还会共享虚拟地址空间),只有当其中一进程进行写操作时,系统才会为其另外分配物理内存页面,这就是写时拷贝机制。

    详细解释如下:当进程A使用系统调用fork()创建一个子进程B时,由于子进程B实际上是父进程A的一个拷 贝,因此会拥有与父进程相同的物理页面。为了节约内存和加快创建速度的目标,fork()函数会让子进程B以只读方式共享父进程A的物理页面,同时将父进 程A对这些物理页面的访问权限也设为只读,这样,当父进程A或子进程B任何一方对这些已共享的物理页面执行写操作时,都会产生页面出错异常中断,此时 CPU会执行系统提供的异常处理函数do_wp_page()来解决这个异常,do_wp_page()会对这块导致写入异常中断的物理页面取消共享操 作,为写进程复制一份新的物理页面。最后,从异常处理函数返回时,CPU就会重新执行刚才导致异常的写入操作指令,使进程继续执行下去。

    七、0号进程的建立

    内核启动时“手工”建立了0号进程,即swapper进程,这是一个内核态进程,它的页表swapper_pg_dir和内核态堆栈是在内核启动建立的,这个进程定义如下:

    struct task_struct init_task = INIT_TASK(init_task);
    init_task的各种进程资源对象都是通过INIT_xxx进程初始化的,在start_kernel()的最后由rest_init()函数 调用kernel_thread()函数,以swapper进程为“模板”建立了kernel_init内核进程,之后这个进程会建立init进程,执行 /sbin//-init文件,从而把启动过程传递到用户态。而swapper进程则执行cpu_idle()函数让出CPU,以后如果没有任何就绪的进 程可调度执行,就会调度swapper进程,执行cpu_idle()函数,这个函数将调用tick_nohz_stop_sched_tick()进入 tickless状态。

    八、进程的切换

    在这里插入图片描述
    1) 主动切换

    • 当前进程主动进行可能引起阻塞的I/O操作,此时当前进程被设置为等待状态,加入到相关资源的等待队列,并调用schedule()函数让出CPU。
    • 进程主动通过exit系统调用退出。

    2) 被动切换

    • 时间片到期

    • I/O中断唤醒了某个I/O等待队列中的更高优先级的进程

    由于这两种情况通常发生在时钟中断或者其他I/O中断处理函数中,而中断上下文环境下不能阻塞进程,所以通常中断处理程序中通过设置need_resched标志请求调度,这个调度被延迟到中断返回处理。

    九、Linux系统的进程间通信的方式

    管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用(进程的亲缘关系通常是指父子进程关系)。

    命名管道(named pipe):命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

    信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

    消息队列(message queue):消息队列就是一个消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    信号(sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

    共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号配合使用,来实现进程间的同步和通信。

    套接字(socket):套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机间的进程通信。

    十、Linux进程调度机制

    在这里插入图片描述
    1) 什么是调度

    • 从就绪的进程中选出最适合的一个来执行

    2) 学习调度需要掌握哪些知识点

    • 调度策略
    • 调度时机
    • 调度步骤

    3) 调度策略

    • SCHED_NORMAL:普通的进程
    • SCHED_FIFO:先入先出的实时进程
    • SCHED_RR:时间片轮转的实时进程

    4) 调度器类

    分为CFS调度类和实时调度类。

    • CFS调度类是针对普通进程的,采用的方法是完全摒弃时间片而是分配给进程一个处理器使用比重。实时调度类分为SCHED_FIFO和SCHED_RR。
    • SCHED_FIFO实现了一种简单的、先入先出的调度算法:它不使用时间片,可以一直执行下去,只有更高优先级的SCHED_FIFO或者SCHED_RR任务才能抢占SCHED_FIFO任务。如果有两个或者更多的同优先级的SCHED_FIFO进程,它们会轮流执行,但是依然只有在它们愿意让出处理器时才会退出。

    SCHED_RR与SCHED_FIFO大体相同,只是SCHED_RR级的进程在耗尽事先分配给它的时间后就不能再继续执行了。

    5) 调度时机

    主动式
    在内核中直接调用schedule():当进程需要等待资源而暂时停止运行时,会把进程的状态设置为等待状态,并主动请求调度,让出CPU。

    例:current->state=TASK_INTERRUPTIBLE;
    schedule();

    被动式

    用户抢占:内核即将返回用户空间的时候,如果need_resched标志被设置,会导致schedule()被调用,此时就会发生用户抢占。

    内核抢占:只要重新调度是安全的,那么内核就可以在任何时间抢占正在执行的任务

    6) 调度步骤

    • 清理当前运行中的进程
    • 选择下一个要运行的进程
    • 设置新进程的运行环境
    • 进程上下文切换

    十一、Linux进程管理之问题

    1、为什么调用fork()函数将返回两次?

    这是因为在do_fork->copy_process->copy_thread函数中,将子进程的用户态堆栈的开始地址设置为父进 程的用户态堆栈的开始地址,这样当父子进程从内核态返回到用户态的时候,返回的地址相同,这就解释了为什么fork一次却返回两次的原因。

    2、为什么要在task_struct中设置mm和active_mm两个mm_struct成员呢?

    这是由于内核线程没有用户态地址空间,所以它的mm设置为NULL,但是由于页目录的地址是保存在mm结构中的,从其他进程切换到这个内核态线程 时,调度器可能需要切换页表,为此增加了一个active_mm,对于mm为NULL的内核态线程,就借用其他进程的mm_struct,也就是说把它的 active_mm指向其他进程的mm结构,当进行进程切换时,统一使用active_mm就可以了。但是其他进程不是有自己独立的页表吗?由于内核态线 程只使用内核地址空间,因此这不会有问题。

    3、有如下说法:1.task_struct的mm成员用来描述3GB用户态虚拟地址空间;2.内核线程可以借用上一个调用的用户 进程的mm中的页表来访问内核地址空间。如果是这样的话,那么task_struct的mm成员能不能描述1GB的内核地址空间?如果不能的话,为什么会 有2这种说法?

    task_struct的mm成员不能描述1GB的内核地址空间,只是因为mm成员中保存了页目录的信息pgd_t,而且所有进程共享1G的内核态地址空间,所以可以使用上一个用户进程的mm中的页表访问内核地址空间。(什么意思?)

    4、为什么所有进程共享1G的内核态地址空间?

    因为fork()会复制当前进程的task_struct结构,同时会为新进程复制mm结构。此时当前进程的3GB~4GB的内核态虚拟地址对应的 页表项(页目录项)被复制到进程的页表项(页目录项)中,所以说所有进程共享1G内核态地址空间。但是对于用户态虚拟地址区域,则把它的进程页表项(页目 录项)设置为只读,这样当其中一个进程对其进行写入操作时,do_page_fault()会分配新的物理页面,并建立映射,从而实现COW机制。

    5、父进程要求子进程退出时发送信号,那么父进程要求子线程退出时发送信号吗?为什么?

    父进程不要求子线程退出时发送信号,这是因为子线程共享父进程的一些资源,所以不需要父进程来获取这些信息,也就不需要向父进程发送信号。这一点可以在do_fork->copy_process

                p->exit_signal=(clone_flags & CLONE_THREAD) ? -1 :(clone_flags &CSIGNAL);
    

    以及do_exit->exit_notify

    if (tsk->exit_signal != -1 && thread_group_empty(tsk)) {
    
                int signal = tsk->parent == tsk->real_parent ? tsk->exit_signal : SIGCHLD;
    
            do_notify_parent(tsk, signal);
    
           } else if (tsk->ptrace) {
    
             do_notify_parent(tsk, SIGCHLD); 
    
           }
    

    中看出来。
    6、 为什么子进程退出时,如果父进程没有调用wait等待子进程结束,则子进程会变成僵尸进程?

    在内核源码中有如下的代码:

       do_exit->exit_notify->
    
                               state = EXIT_ZOMBIE
    
                           if (tsk->exit_signal == -1 &&
    
                                (likely(tsk->ptrace == 0) ||
    
                                unlikely(tsk->parent->signal->flags & SIGNAL_GROUP_EXIT)))
    
                             state = EXIT_DEAD;
    
                           tsk->exit_state = state;
    
    

    说明如果定义了子进程退出时向父进程发送信号,则设置进程状态为EXIT_ZOMBIE,否则为EXIT_DEAD。而子进程退出时一定会向父进程发送

    信号,所以进程的状态为EXIT_ZOMBIE,如果此时父进程调用wait等待子进程结束的话,由 do_wait->wait_task_zombie函数可以将进程的状态设置为EXIT_DEAD,并且释放进程的内核堆栈资源,最后由 put_task_struct将其task_struct结构体释放掉。否则子进程会变成僵尸进程。

    展开全文
  • 不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法; 批处理系统: 先来先服务(按照请求顺序); 短作业优先 (按照运行时间最短的顺序调度); 最短剩余时间优先 (按照剩余运行时间调度顺序调度);...

    不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法;

    批处理系统:

    • 先来先服务(按照请求顺序);
    • 短作业优先 (按照运行时间最短的顺序调度);
    • 最短剩余时间优先 (按照剩余运行时间调度顺序调度);

    交互式系统:

    • 时间片轮转;
    • 优先级调度;
    展开全文
  • 今天就来看一下 Nginx 进程管理中的信号是怎样使用的。 Nginx 进程管理:信号 从上图可以看出,能够发送和处理信号的 master 进程、worker 进程、Nginx 命令行。 首先让我们来看下 Master 进程。 Master 进程 ...

    Nginx 是一个多进程的程序,多进程之间进行通讯可以使用共享内存、信号等。当做进程间管理的时候,通常只使用信号。

    今天就来看一下 Nginx 进程管理中的信号是怎样使用的。

    Nginx 进程管理:信号

    Nginx进程管理:信号

    从上图可以看出,能够发送和处理信号的有 master 进程、worker 进程、Nginx 命令行。

    首先让我们来看下 Master 进程。

    Master 进程

    因为 master 进程会启动 worker 进程,所以它管理 worker 进程的方式首先是监控 worker 进程有没有发送 CHLD 信号,因为 Linux 操作系统中规定当子进程终止的时候会向父进程发送 CHLD 信号,所以如果 worker 进程由于一些模块代码 bug 导致 worker 进程意外终止,那么 master 进程可以立刻通过 CHLD 发现这样一个事件,然后重新把 worker 进程拉起。

    Master 进程还会通过接受一些信号,来管理 worker 进程。

    Master 进程可以接受的信号有:

    • TERM、INT:立刻停止 Nginx 进程
    • QUIT:优雅停止 Nginx 进程,不会对用户立刻发送结束连接请求(比如像 TCP 中的 reset 复位请求这样的报文)
    • HUP:表示重载配置文件
    • USR1:表示重新打开日志文件,做日志文件的切割
    • USR2:专门针对做热部署使用
    • WINCH:表示优雅的退出所有 worker 进程

    其中,粉色的信号 USR2 和 WINCH 只能通过 Linux 的 kill 命令行发送信号,也就是说我们需要先找到 master 进程所在的 PID,对这个 PID 发送 USR2 或者 WINCH,而其他的 4 个有对应的 Nginx 命令的。

    Worker 进程

    通常是不直接对 worker 进程发送信号的,因为我们希望由 master 进程来管理 worker 进程。虽然直接对 worker 进程发送信号,也会让 worker 进程产生同样的结果,但是通常不这样做,往往是由 master 进程管理,master 进程收到信号后,会再把信号发送给 worker 进程。

    Nginx 命令行

    Nginx 在启动以后,Nginx会把他的 PID 放到一个文件中。默认是记录在 Nginx安装目录的 /logs/nginx.pid 文件中,记录了 Nginx 的 master 进程的 PID。

    当我们再次使用 nginx -s 这样的命令行的时候,那么 nginx 的工具命令行就会去读取PID文件中的 master 进程的 PID,向这个 PID 发送同样的 HUP、USR1、TERM、QUIT 这样的信号,而这样的命令对应着命令 reload、reopen、stop、quit,所以调用 nginx 命令行和直接用 kill 发送信号的效果是一样的。

    总结

    这篇文章主要介绍了 Nginx 进程管理中信号的使用,主要涉及到 Master 进程、Worker 进程和 Nginx 命令行。我们可能会看到网络上有很多管理日志文件或者管理热升级的脚本,这些脚本中有时候是用 kill 直接发送信号,有时候是调用 nginx -s 这样一个命令行,很多人之前可能还会很困惑,那么我相信大家现在应该很了解这样一个过程怎样发生的了。

    展开全文
  • Google浏览优化机制,多个进程可能会被合并为一个 浏览器五大进程(2和5可以多个) 1.Browser进程 a.界面显示,用户交互 b.页面管理:其他页面(进程)的创建与销毁 c.Renderer进程中的内存中的Bitmap,绘制到...
  • 进程管理

    2021-03-11 22:51:02
    1. 进程管理 1.1 查看进程 静态 ps 或 动态 top 命令 或 利用 pstree 来查看进程 ps命令是“process status”的缩写,ps命令用于显示当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序 ps命令是最...
  • Oracle中的进程共分为三类:用户进程、...其中后台进程伴随实例的启动而启动,他们主要是维护数据库的稳定,相当于一个企业中的管理者及内部服务人员。他们并不会直接给用户提过服务。 一:database write :数据
  • Linux进程管理

    2021-04-03 13:11:00
    进程管理与 SELinux 初探前言一、 什么是进程...比如:系统中的进程 =有哪些状态?不同状态会如何影响系统的运行?进程之间是否可以相互管理?SELinux是什么,它的工作机制又是什么? 等等。 一、 什么是进程 1.1 .
  • 引起进程创建的事件有哪些

    万次阅读 2017-06-09 21:03:19
    进程控制的功能进程创建,进程阻塞,进程唤醒,进程撤销。进程创建是进进程控制的基本功能之一。引起进程创建的事件。 1,系统生成时,系统会创建承担资源分配和管理的系统进程。 2,用户作业调入系统时,作业...
  • 2. 如何查看系统中有哪些进程? a.使用ps指令查看 实际工作中,配合grep来查找程序中是否存在某一个进程 b.使用top指令查看,类似windows任务管理器 3. 什么是进程表示符 每个进程都有一个非负整数表示的唯一ID,叫做pid...
  • 进程管理之进程调度

    2019-03-13 19:14:07
    文章目录一、进程调度基础1、进程调度定义2、进程调度目标二、基本调度算法1、先来先服务算法2、时间片轮转算法3、短任务优先算法4、优先级调度算法5、混合调度算法   在多进程并发的环境里...这就涉及到进程管理...
  • 进程管理 Linux

    2021-05-20 19:30:26
    基本介绍 在Linux中,每个执行的程序都称为一个进程。...ps命令是用来查看目前系统中,有哪些正在执行,以及他们的执行情况。可以不要参数 ps显示选项 字段 说明 PID 进程识别号 TTY 终端机
  • 进程管理引言管道(最简单的方式)匿名管道命名管道消息队列共享内存(最快的方式)信号量信号套接字Socket通信 引言 每个进程的用户地址空间都是独立的,一般而言是不能相互访问的,但内核空间是每个进程都共享的...
  • 基本介绍 在LINUX中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个ID号。...ps命令是用来查看目前系统中,有哪些重在执行,以及他们执行的状况,可以不加任何参数。 显示当前终端的所有进程信息: ps -
  • linux进程管理

    2019-09-01 20:07:13
    ps命令是用来查看目前系统中有哪些进程正在执行,以及他们执行的状况,可以不加任何参数。 ps -a显示当前终端所有进程信息 ps -u以用户的格式显示进程信息 ps -x显示后台进程运行的参数 ps -e显示所有进程 ps -f全...
  • 一、进程管理 1.查看进程:ps + 【参数】 ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、...
  • 2、如何查看系统中有哪些进程? 用ps -aux指令查看所有进程 用ps -aux|grep xxx 来查看我们需要的进程 xxx为查看的进程名 还可以使用top指令来查看,类似于windows的任务管理器 3、什么是进程标识符? 每个进程都有...
  • 浏览器都包含哪些进程? 知道了浏览器是多进程后,再来看看它到底包含哪些进程:(为了简化理解...负责各个页面的管理,创建和销毁其他进程 将Renderer进程得到的内存中的Bitmap,绘制到用户界面上 网络...
  • Centos7-系统进程管理

    千次阅读 2018-10-21 22:44:14
    进程的概述和ps进程管理1.1什么是进程?1.2ps查看进程工具2.uptime查看系统负载3.top动态管理进程4.查看进程正在读哪些文件5.前后台进程切换5.1前台进程与后台进程的区别5.2相关命令6.关闭进程8.screen后台实时备份 ...
  • Linux-进程管理

    2021-05-31 22:28:03
    1.1 基本介绍 在操作系统中,每个执行的程序都称为一个进程。每一个进程都分配一个 ID 号(pid,进程号)。...ps 命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。可以不加任何参数。
  • 16进程管理与SElinux

    2020-05-03 13:40:37
    系统的进程有哪些状? 不同的状态会如何影响系统的运行? 进程之间是否可以互相管理?。 与进程有关的还有SElinux这个加强文件存取安全性的东西 16.1什么是进程 Linux下所有命令与你能够执行的操作都与权限有关 系统...
  • ps命令是Process Status的缩写,用来列出系统中当前运行的那些进程,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。 ps 为我们提供了进程的一次...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,221
精华内容 488
关键字:

进程管理有哪些