精华内容
下载资源
问答
  • Linux线程挂掉是否影响进程

    千次阅读 多人点赞 2017-04-02 13:39:22
    如果没有设置对应的Signal Handler操作系统就自动终止进程(或者说默认的Signal Handler就是终止进程);如果设置了,理论上可以恢复进程状态继续跑(用longjmp之类的工具) 线程有自己的 stack,但是没有...
    严格的说没有“线程崩溃”,只是触发了SIGSEGV (Segmentation Violation/Fault)。如果没有设置对应的Signal Handler操作系统就自动终止进程(或者说默认的Signal Handler就是终止进程);如果设置了,理论上可以恢复进程状态继续跑(用longjmp之类的工具)

    线程有自己的 stack,但是没有单独的 heap,也没有单独的 address space。只有进程有自己的 address space,而这个 space 中经过合法申请的部分叫做 process space。Process space 之外的地址都是非法地址。当一个线程向非法地址读取或者写入,无法确认这个操作是否会影响同一进程中的其它线程,所以只能是整个进程一起崩溃。


    1.进程(主线程)创建了多个线程,多个子线程均拥有自己独立的栈空间(存储函数参数、局部变量等),但是多个子线程和主线程共享堆、全局变量等非栈内存。
    2.如果子线程的崩溃是由于自己的一亩三分地引起的,那就不会对主线程和其他子线程产生影响,但是如果子线程的崩溃是因为对共享区域造成了破坏,那么大家就一起崩溃了。3.举个栗子:主线程是一节车厢的乘务员,诸多乘客(也就是子线程)就是经过乘务员(主线程)检票确定可以进入车厢的,也就是主线程创建了诸多子线程,每个子线程有自己独立的区域(座位啊啥的),但是诸多乘客和乘务员共享走廊啊卫生间啊等等,如果其中一名乘客座位坏了,摔了(可以认为奔溃了),那么其他乘客和乘务员都不受影响,但是如果乘客将卫生间给破坏了,他也无法使用卫生间(崩溃了),其他乘客和乘务员也不能用卫生间,好吧,那么大家一起憋着吧(崩溃了)。

    总体来说,线程没有独立的地址空间,如果崩溃,会发信号,如果没有错误处理的handler,OS一般直接杀死进程。就算是有handler了处理,一般也会导致程序崩溃,因为很有可能其他线程或者进程的数据被破坏了。





    展开全文
  • 在《unix高级编程》中,第八章中有一个例子,是一个父进程和一个子进程,在nice值不同的情况下,竞争cpu的情况。 当两个进程nice相同时,则计数值基本相同,如果nice不同,则nice大的进程计数值小。不过由于目前的...

    在《unix高级编程》中,第八章中有一个例子,是一个父进程和一个子进程,在nice值不同的情况下,竞争cpu的情况。

    当两个进程nice相同时,则计数值基本相同,如果nice不同,则nice大的进程计数值小。不过由于目前的cpu基本是多核的,所以如果两个进程安排在不同的核上面运行,

    则无法得到实验的效果。

    我查看了一下自己的机器,如下:

    ThinkCentre:~/unixcode$ cat /proc/cpuinfo
    processor    : 0
    vendor_id    : GenuineIntel
    cpu family    : 6
    model        : 15
    model name    : Intel(R) Pentium(R) Dual  CPU  E2180  @ 2.00GHz
    stepping    : 13
    microcode    : 0xa3
    cpu MHz        : 1203.000
    cache size    : 1024 KB
    physical id    : 0
    siblings    : 2
    core id        : 0
    cpu cores    : 2
    apicid        : 0
    initial apicid    : 0
    fdiv_bug    : no
    hlt_bug        : no
    f00f_bug    : no
    coma_bug    : no
    fpu        : yes
    fpu_exception    : yes
    cpuid level    : 10
    wp        : yes
    flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm
    bogomips    : 3989.64
    clflush size    : 64
    cache_alignment    : 64
    address sizes    : 36 bits physical, 48 bits virtual
    power management:

    processor    : 1
    vendor_id    : GenuineIntel
    cpu family    : 6
    model        : 15
    model name    : Intel(R) Pentium(R) Dual  CPU  E2180  @ 2.00GHz
    stepping    : 13
    microcode    : 0xa3
    cpu MHz        : 1203.000
    cache size    : 1024 KB
    physical id    : 0
    siblings    : 2
    core id        : 1
    cpu cores    : 2
    apicid        : 1
    initial apicid    : 1
    fdiv_bug    : no
    hlt_bug        : no
    f00f_bug    : no
    coma_bug    : no
    fpu        : yes
    fpu_exception    : yes
    cpuid level    : 10
    wp        : yes
    flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm
    bogomips    : 3989.64
    clflush size    : 64
    cache_alignment    : 64
    address sizes    : 36 bits physical, 48 bits virtual
    power management:


    可见,这是一个单物理cpu,双核心的处理器。因而,可以判断,实验无法达到预期效果。

    经过实际的测试,实际情况确实是这样的。

    那么,如何才能验证nice的作用呢?是否3个进程,就可以有两个进程有这样的效果呢?

    于是对程序进行了改动,fork了两个子进程,世界执行如下:

    所有进程nice相同:

    ThinkCentre:~/unixcode$ a.out
    NZERO = 20
    current nice value in parent is 20
    current nice value in child is 20, adjusting by 0
    curr nice value in child is 20
    current nice value in child2 is 20, adjusting by 0
    curr nice value in child2 is 20
    child 2 count = 23826021
    parent count = 27491779
    child count = 22913818

    child的nice是39,child2是20,parent是20,此时,很明显,child的计数少,而且其输出是最后一个显示在屏幕上。

    ThinkCentre:~/unixcode$ a.out 20
    NZERO = 20
    current nice value in parent is 20
    current nice value in child is 20, adjusting by 20
    curr nice value in child is 39
    current nice value in child2 is 20, adjusting by 0
    curr nice value in child2 is 20
    child 2 count = 36449177
    parent count = 36736444
    child count = 753635

    至此,可以看出child无论和那个进程在同一个cpu核心上运行,都明显占用cpu比较少,实验成功。

    展开全文
  • 在测试子线程的调度问题时,发现了一个自己说不清楚的问题,就是在进程中写了一个线程,且线程函数还是一个死循环程序,在此循环中输出一句话,本想会出现一直输出一句话,结果出乎意料,只是输出几句程序结束了,很...

    在测试子线程的调度问题时,发现了一个自己说不清楚的问题,就是在进程中写了一个线程,且线程函数还是一个死循环程序,在此循环中输出一句话,本想会出现一直输出一句话,结果出乎意料,只是输出几句程序结束了,很是不解。然后就在去上网搜索,结果没有找到答案,然后就自己猜想原因去验证。通过验证发现是主线程返回进程就结束这让自己恍然大悟,解决方法就是让主线程一直不退出。。

    代码如下:

     

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h>

     

    void *fn1()

    {

    while(1)

    {

    printf("first\n");

    }

    }

     

     

    int main()

    {

    pthread_t tid1,tid2;

    int err;

    err=pthread_create(&tid1,NULL,fn1,NULL);//创建线程 

    if(err!=0)

    {

    printf("fail to create1\n");

    exit(1);

    }

    while(1);//让主线程一直不退出 

    }

    总结:虽然这是一个小问题,但是使自己感觉很多,学习一定要认真。

     

     

    展开全文
  • 浅谈操作系统的进程通信部分对于数据库的影响进程间的通信共享内存的实现共享内存与Oracle SGA 最近在温习操作系统相关的基本原理,结合以前的数据库实践,就简单说一说最基础的操作系统进程通信部分对数据库的一些...

    浅谈操作系统的进程通信对于数据库的影响

    最近在温习操作系统相关的基本原理,结合以前的数据库实践,就简单说一说最基础的操作系统进程通信部分对数据库的一些影响。

    进程间的通信

    操作系统内的进程在执行时可以分为独立的或者是协作的。
    独立进程的含义是该进程不能影响其他进程或受其他进程影响,反之,则是协作的进程。
    协作进程的意义通常在于以下理由:
    1、加速计算:这也是计算机发展到多个处理内核和进行进程间调度的原因,充分利用cpu资源以达到加快程序处理的作用。如果需要一个进程能够快速计算,那么应将其拆分为多个子程序或者说是子任务,在多处理器内核上并行执行。
    2、模块化的要求:在一个计算机系统中,可能会需要用模块化的方式构造系统,会将系统功能拆分成独立的进程或线程,这些进程或线程共同组成了一个完整的系统。
    3、信息的共享:多用户系统中,由于多个用户可能需要访问同样的信息,所以就需要提供一套信息共享的环境来允许这些用户并发的访问这些信息。
    4、多任务的并行要求:从小处说是进程需要并行执行来提高效率,从大处来说,用户可以并行的进行编写代码、听音乐等工作。

    那进程之间要如何进行协作?这里就需要提到IPC(进程间通信:InterProcess Communication)机制,以便进程间交互信息。
    进程之间的通信有两种模式:共享内存、管道通信和消息传递。
    消息传递这种模式适合于交换较小数量的数据,消息传递有个缺点是它的实现经常要采用系统调用,所以就需要更多的时间来让内核介入到进程的处理中,因此在一个分布式的系统中,消息传递的模式要比共享内存更容易实现。
    共享内存的模式,需要通信进程建立共享内存区域来实现信息的共享,在建立共享内存区域时采用系统调用,而一旦建立好该区域,对于该区域的访问就无需内核介入了,直接读取,不需要拷贝数据。
    这里多说一嘴,对于多个处理内核的系统,消息传递的模式要优于内存共享的模式,虽然共享内存是最快的IPC模式。但在共享内存的模式中,共享数据会在多个高速缓存之间迁移,会有高速缓存一致性的问题。对于多个进程对共享内存区域的并发读写问题,共享内存模式并没有提供同步的机制,所以引入了信号量的机制来实现对共享内存的同步访问控制。这里如果熟悉数据库或分布式系统的人很容易就会联想到其中的读写一致性问题。

    共享内存的实现

    在Linux中,每个进程都有属于自己的进程控制块(PCB:进程实体的一部分,记录了操作系统所需要的、用于描述进程和控制进程运行的全部信息)和地址空间(Addr Space),并且都有一个与之对应的页表,负责将进程的虚拟地址与物理地址进行映射(逻辑关联),通过内存管理单元(MMU)进行管理。两个不同的虚拟地址通过页表映射到物理空间的同一块区域,它们所指向的这块区域即共享内存,这种方法称为内存映射(memory mapping)文件。
    在这里插入图片描述

    共享内存与Oracle SGA

    SGA是orace中的一个巨大的内存共享区域,在linux中,其设置与系统内核参数shamax有关。
    shamax参数的作用是系统允许的单个共享内存段的最大值,如果这个参数远小于oracle sga的大小,那么SGA可能被分配成很多个共享内存段。
    在Oracle的使用中,我们一般不希望Oracle的共享内存段跨区,我们希望共享内存是在一个段中或者减少共享内存段的数量,来减少碎片的产生和提升一些特定场景下的性能,所以我们会建议调整shamax参数来限制共享内存段的数量。
    在linux中,我们可以通过ipcs命令来管理共享内存。
    查看:
    在这里插入图片描述

    关于共享内存段的题外话:大家可能会在某些场景下碰到共享内存段没有释放导致的oracel无法启动的问题,这时就需要手动释放这些共享内存。

    展开全文
  • 如题,大神,如何在当前进程调用system,而又不影响当前进程的正常运行!3q!
  • 让linux 进程不受终端影响
  • 疑惑,到底android 开启多进程时会对Application有什么影响?网上许多文章只是说会重复onCreate(),其实就是不听进程有不同Application Log日志中打印的两次Application对象的Hashcode不一致
  • 当要处理信号捕捉问题时,我们可以为某一信号设置自定义的信号处理函数,这个信号处理函数会对正在执行的进程有怎样的影响? 一、对进程执行的干预: 1.当信号被捕捉时,进程正在执行用户态程序指令,(即用户自行...
  • [TOC]## 线程理论知识### 什么是线程和多线程* **线程:**顾名思义,就是一条流水线工作的过程,而一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个...
  • 影响历史进程的三只苹果

    千次阅读 2016-05-22 08:26:51
     三只苹果影响着人类的历史,同样也影响着计算机科学技术发展的历史。  有人说,历史上有三只苹果改变世界,一是亚当和夏娃的苹果,二是牛顿的苹果,三是乔布斯的苹果。  也有人说有三只苹果改变了计算机科学与...
  • 进程

    2019-09-24 15:51:51
    进程之间是相对独立的,一个进程无法直接访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,windows系统就是利用进程把工作划分为多个独立的区域的。进程可以理解为一...
  • 稳定性好: 多进程的优点是稳定性好,一个子进程崩溃了,不会影响进程以及其余进程。基于这个特性,常常会用多进程来实现守护服务器的功能。 然而多线程不足之处在于,任何一个线程崩溃都可能造成整个进程的崩溃...
  • 进程中使用exit对于子进程复制父进程数据段、堆栈的影响
  • 当一个进程调用fork时,因为子进程在开始时复制父进程的存储映像,信号捕捉函数的地址在子进程中是有意义的,所以子进程继承父进程的信号处理方式。 特殊的是exec,因为exec运行新的程序后会覆盖从父进程继承来的...
  • 当一个进程调用fork时,因为子进程在开始时复制父进程的存储映像,信号捕捉函数的地址在子进程中是有意义的,所以子进程继承父进程的信号处理方式。  但是当子进程调用exec后,因为exec运行新的程序后会覆盖从父...
  • vfork()会产生一个新的子进程.但是vfork创建的子进程与父进程共享数据段.看如下代码#include #include #include #include int globVar = 5;int main(void) { pid_t pid; int var = 1,i; printf
  • 修改进程名称但不影响主要功能:以jdk示例一台服务器上运行着多个JAVA服务,如多个TOMCAT、定制服务程序,在进程列表查看进程状态时很难区分出各个JAVA进程的的实际意义,这里是一个简单有效的方法:到JDK的bin目录...
  • 理解 主进程main thread: 程序执行的入口,可以理解为常用的main 函数。 父进程parent thread:...如果没有标记为daemon , 则杀死父进程不会对子进程的运行状态有丝毫影响。 守护进程daemon thread: 即daemon thread
  • 如果没有设置对应的Signal Handler操作系统就自动终止进程(或者说默认的Signal Handler就是终止进程);如果设置了,理论上可以恢复进程状态继续跑(用longjmp之类的工具) 线程有自己的 stack,但是没有单独的 ...
  • 使用grep命令过滤进程时,如何消除grep本身进程影响 你是否也遇到了跟我同样的问题: 使用 grep 命令过滤并统计一个进程出现的次数,如下所示: [root@lb01~ ]#ps -ef | grep nginx root 20239 1 0 Jul06 ?...
  • 2019独角兽企业重金招聘Python工程师标准>>> jstat在查看进程时对进程有多大影响 转载于:https://my.oschina.net/u/138995/blog/215162

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,216
精华内容 5,686
关键字:

影响进程