精华内容
下载资源
问答
  • Linux程序调试--Bus Error

    千次阅读 2019-06-28 16:39:12
    Linux程序调试--BusError Bus Error究竟是指什么 一 Bus Error,即总线错误。 引发原因: CPU出于性能方面的考虑,要求对数据进行访问时都必须是地址对齐的。如果发现进行的不是地址对齐的访问,就会发送SIGBUS...

    Linux程序调试--Bus Error

    Bus Error究竟是指什么

    一  Bus Error,即总线错误。

       引发原因:

      CPU出于性能方面的考虑,要求对数据进行访问时都必须是地址对齐的。如果发现进行的不是地址对齐的访问,就会发送SIGBUS信号给进程,使进程产生 core dump。RISC包括SPARC(一种微处理器架构)都是这种类型的芯片。x86系列CPU都支持不对齐访问,也提供了开关禁用这个机制。x86架构不要求对齐访问的时候,必定会有性能代价。例如,对int的访问应该是4字节对齐的,即地址应该是4的倍数,对short则是2字节对齐的,地址应该是2的倍数。

       Bus Error也有可能是因为机器物理问题或者访问无效物理地址,但这种情况非常少见。

       Linux平台上执行malloc(),如果没有足够的RAM,Linux不是让malloc()失败返回,而是向当前进程分发SIGBUS信号。
              注: 对该点执怀疑态度,有机会可自行测试确认当前系统反应。

    SIGBUS与SIGSEGV信号的一般区别如下:

       1) SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。
        2) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。

     

    二  例子程序:

     

    1 int main(){
      6 #if defined(__GNUC__)
      7 # if defined(__i386__)
      8    
      9     __asm__("pushf\n orl $0x40000,(%esp) \n popf");
     10 # elif defined(__x86_64__)
     11     
     12     __asm__("pushf\norl $0x40000,(%rsp)\npopf");
     13 # endif
     14 #endif
     24    short array[16];
     25
     26    int * p = (int *) &array[1];
     27    *p = 1;
     28
     29    return 1;
     30 }

     short类型大小为2个字节,其地址必是2的倍数。而对于int指针来说,能够使用以访问数据的地址应该是4的倍数,转化arrary[1]的地址为int *并访问,系统会发出SIGBUS信号,导致程序崩溃。

       wiki上的例子:

        http://en.wikipedia.org/wiki/Bus_error#Bus_error_example

    #include <stdlib.h> 
     
     int main( int argc, char ** argv) { 
     int * iptr; 
     char * cptr; 
     
     #if defined(__GNUC__) 
     # if defined(__i386__) 
     
    __asm__( "pushf/n orl $0x40000,(%esp)/n popf" ) ; 
     # elif defined(__x86_64__)  
     
    __asm__( "pushf/n orl $0x40000,(%rsp)/n popf" ) ; 
     # endif 
     #endif 
     
     
    cptr = malloc( sizeof ( int ) + 1) ; 
     
     
    iptr = ( int * ) ++ cptr; 
     
     
     * iptr = 42 ; 
     
     return 0 ; 
     } 
     
    $ gcc -ansi sigbus.c -o sigbus
    $ ./sigbus 
    Bus error
    $ gdb ./sigbus
    (gdb) r
    Program received signal SIGBUS , Bus error.
    0x080483ba in main ()
    (gdb) x/i $pc
    0x80483ba <main+54>: mov DWORD PTR [eax],0x2a
    (gdb) p/x $eax
    $1 = 0x804a009
    (gdb) p/t $eax & (sizeof(int) - 1)
    $2 = 1
     

     

    三,编译器和硬件平台相关性

     

        上述已经描述,对于x86平台,默认允许非对齐访问,只不过会有性能代价。开启检测可以使用上述代码中的宏。

     

        这段程序如果用Sun Studio编译器的话,运行就没有问题。这是因为Sun Studio默认对32位编译使用的参数是-xmemalign=8i,其中i选项设置明确指明不产生SIGBUS信号。
        不过如果编译成64位程序,Sun Studio使用的-xmemalign=8s,其中s选项设置意味对这种非对齐访问产生SIGBUS信号,则仍旧会遇到这个错误。

     

        如果坚持在SPARC上使用GCC去编译这种代码,可以如下进行:

        GCC有一个Type Attributes特性,例如在需人工对齐的变量后加上:__attribute__ ((aligned (4))); 其意义就是指定偏移量为4的倍数。比如:

     short array[10] __attribute__ ((aligned (4)));

        不过这个属性只对Linker连接器可见的变量有效,也就是说对local variable无效。而且这种特性作用粒度比较大,比如这里只对第一个元素有作用,并不为数组的每个成员设置偏移量。如果一定要针对local variable或者数组的每个成员进行偏移量设置,可以使用union类型:

     union {
    short s;
    int i;
    }
    

     

    Linux程序调试--Bus Error(2)

    我们经常会发现有两种内存转储(core   dump)
    一种是段错误(segment error)通常是在一个非法的地址上进行取值赋值操作造成。
    一种是总线错误(bus   error)通常是指针强制转换,导致CPU读取数据违反了一定的总线规则。

    下面请大家讨论一下总线错误

    有例子如下sizeof(int)==4:
    #include   <stdio.h>
    #include   <stdlib.h>
    int   main()
    {
    int   i[5];
    int   j;
    i[0]=65536+2;
    i[1]=65536*3+4;
    j=*((int   *)((char   *)i+2));      
    printf( "size   of   int   is   %d\nj=%d ",sizeof(int),j);
    return   0;
    }

    我们姑且不考字节序问题,不管j结果是几.

    在一般RISC的CPU上,一般的unix机器上都会出现bus   error。
    而在windows机器上,我用了vc的cl   borland的bcc32和gnu的gcc编译执行都没问题。

    大家有兴趣可以讨论一下

    ***********************************************************************************************

    我想,说来说去bus error都是一个“边界”问题。以下是我的看法:
    从硬件的角度来看,大家应该发现内存是一小块一小块的吧,每一块都有固定大小,现在应该都是4的整数倍,又或者说int大小的整数倍,又或者说地址线总数的整数倍。为什么要这样?硬件好处理呀。举个例子来说吧,如果int型为四字节大小,且首字节地址不受限制的话,该int就可能跨在2个内存块之间(又或者别人说的“跨在2个页内存之间”),那么硬件如何来取数据呢?熟悉硬件的人都应该知道,内存访问是用“十字交叉”来决定地址的,也就是说,每个内存块是互斥的,这时要读这个数据岂不麻烦?如果地址硬规定4的整数倍,可想而知,问题解决了,效率也高了。
    从编程的角度来说,采用的是虚内存,与页内存存在映射关系,当然会导致上述问题。

    unix出现该错误,用我的观点应该可以解释,至于楼主说的vc,如果将奇地址转化为int指针再取值的话,应该会出现问题,那为什么2倍数非4倍数取能够正确执行呢?我想,这可能和操作系统的内存映射有关,unix下可能采用的是“完全对齐”原则,而windows可能给虚内存加了一个边界,也就是说实际的虚页总比实页少至少2字节以上,目的可能是为了防止越界而导致系统崩溃(个人猜测)。

    想到结构体的sizeof问题,顺带提一下,之所以> =内部变量和的大小,是否仔细看过大小的规律?这也应该是“边界”问题,可以说是编译器为了追求数据访问速度而做的一点预处理。

    *********************************************************************************************
    一下代码
    int   main()
    {
    int   a[4]={0,0,0,0};
    int   *pi;
    pi=(int   *)(((char   *)a)+1);
    *pi=3;
    printf( "a0   is   %d\n "   "a1   is   %d\n "   "pi   is   %d\n ",a[0],a[1],*pi);
    printf( "sizeof   int   is   %d\n ",sizeof(int));
    return   0;
    }
    同样用GCC编译
    HP_UX上是出总线错误,(其他UNIX机器上也出,以前做过)
    但拿到WINDOWS   2000机器上就好使。
    a0   is   768
    a1   is   0
    pi   is   3
    sizeof   int   is   4
    现不考虑字节序问题,为什么在windows上就好使呢,难道编译出来的不是32位的程序。难道还作了什么特殊的处理。理论上已改出错才对。怪异
    **************************************************************************************************
    不知道你用的是哪种unix,我记得在Solaris是会存在类似的bus   error的。
    我在linux和sco下进行一些测试,即使你采用编译器默认的对齐方式,对于奇地址强制转化为int地址的情况,程序运行正常,在linux和sco下编译器从栈中为非对齐的结构体非配空间的方式有点小差异,如上所述的结构体,linux是从偶地址开始,sco是从奇地址开始。。。

    撇开上面这些先不谈。
    1。每个操作系统都会有自己的进程载入和调度程序,也就是说,虚内存到实内存的映射,每种os都会有自己的特点,他们可以根据自己的情况避开某些小概率事件,“边界”也应该可以称之为小概率事件,在分配空间时做点手脚,对于分配者来说应该不会困难。
    2。对齐问题,很久以前就听别人说,是为了提高访问效率,想想也是,多一种情况就不得不“if”,而且对齐也利于硬件“批量”访问数据。
    3。采用非对齐方式会降低程序的效率,有些书上可能会提到这些,建议让编译器来决定采用哪种方式,毕竟每种编译器都是根据系统而来的。
    4。在进行地址转换取值的时候,尽量用位拷贝,这样不同的os也不用当心。
    5。不管os怎样对待bus   error问题,不管编译器如何优化,硬件访问数据时的边界问题始终存在,开发可移植系统时,我认为不应该漏掉这个问题。

    你的疑问:
    1。pi-> a对于开发者来说是int,对于c编译起来说是int,对于汇编器来说是一段空间,对于硬件来说是一段空间,在目标代码一级,没什么所谓的类型。
    2。cpu访问数据是通过发指令来控制硬件访问数据的,通常是先读到cache、寄存器。形象一点的话,和十字路口的红绿灯的控制下的车流差不多。看《微机原理》或许会有所帮助。
    3。我认为,硬件在遇到边界问题时,应该会有警告,各各os处理不同罢了。
    4。Solaris的特点

    建议:暂时不用钻得太深,除非你有足够的资料。知道这个问题和大致的可能原因就差不多了,不是说不去掌握它,而是计算机这个东西内容太多,很多硬件问题采用避开而不是花很大代价去解决。等有了足够的知识积累,相信这个问题不会是什么难事。

    展开全文
  • 自毕业至今,一直从事着c++相关的工作,有在windows下,也有在linux下,一直想写一篇文章关于windows和linux程序设计的区别,现在从以下几点进行简短的总结,希望和各位小伙伴共勉。 一、为何windows比较适合...

    自毕业至今,一直从事着c++相关的工作,有在windows下,也有在linux下,一直想写一篇文章关于windows和linux下程序设计的区别,现在从以下几点进行简短的总结,希望和各位小伙伴共勉。

    一、为何windows比较适合客户端程序,linux适合服务端程序

    为何windows适合开发客户端程序,从他诞生开始,就是为普通的用户而生,简洁的界面,方便的操作,就是适合运行客户端程序,虽然他也有server版本,但是奔溃和挂起是常有的状态,与linux是无法相提并论的。本人从事windows c++ 客户端程序主要是采用direct ui思想的duilib图形渲染库,和其他音视频相关功能的dll,或com组件。

    linux适合开发服务端程序:黑黑的界面就是适合在背后默默的工作!没有绚丽多彩的界面,稳定,安全,开源是其重要的特点。

    linux往往承载着cpu巨大的压力,往往要与文件服务器,数据库服务器相关,作者本人一直以来从事c/c++ 的音视频相关性工作,也不是很了解这中间的关系。在音视频领域,服务器压力往往都在带宽,cpu计算的压力,如果是视频会议服务器sfu模式,只负责一些转发工作,若是mcu类型的往往需要gpu参与大量的计算的。以janus为例,janus程序中的视频会议,主要处理与客户端相关的信令以及与音视频相关的流

     

    二、异步架构的区别

    不管是客户端程序还是服务端程序,弄清楚需求的前提下,由下而上的设计,往往需要为整个程序选好基础框架,一个优秀的异步框架,是保证整个程序高效运行的基础。

    windows 选用比较多的异步框架libuv

    linux下 glib main event loop

    虽然各自都有上层应用封装的异步库,我还是想要简单的分析一下,windows和linux的异步库的区别:

    实现的目标不同:

    windows:主动性, 一般应用客户端程序,实时性要高,同时UI交互的强

    linux: 被动性,一般应用服务端程序,高负荷性工作,需要考虑负载均衡等特点

    windows与linux的异步程序实现的区别

    windows高效的异步设计模式为iocp,

    linux高效的异步设计模式为epoll,

    iocp与epoll有什么区别:

    与传统的select和poll相比,该异步结构的内存分配方式都是由应用层分配,引用的方式传递,不需要在底层内核重新分配内存

    iocp的通知与读写,整个流程都是由系统完成,

    epoll的通知与读写是分离的,通知是由系统完成的,读写由程序应用本身完成。

     

    三、 多线程和多进程之间通信的区别

     

    简单的聊聊两个平台下的多线程同步和多进程通信的区别

    多线程之间的同步与交互:

    同步:windows 下由mutex,criticalsection(临界区,用户态),event,

    linux:mutex,读写锁

    多线程下的数据交互:全局变量,单列模式,windows特有的 SendMessage和PostMessage

     

    多进程之间的同步与交互:

    多进程由两大类,进程与进程之间有亲子关系,另外一种是没有亲子关系。

    windows核心编程中提到的多进程通信,主要由核心句柄通过继承,命名,复制三种方式

    所以多进程之间通信,也有一定的规律,亲子关系,只要通过父子进程之间的继承关系,就可以进行通信,如管道pipe,半双工模式,数据是单向流动的,只能一端可以读,一端可以写

    windows下还有两种特有的方式,文件映射,子进程继承父进程的句柄,可以往相同的句柄共享数据。

    另外就是子进程复制父进程句柄,通过wm_copydata,发送消息,进行多进程通信

    第二大类,共享模式,

    大块内存和小块内存共享分界点0xFFFFFFFFF

    前面:文件映射模式,也分继承方式,命名方式,复制方式

    后者:内存共享模式

    命名模式:如命名管道,毫无亲缘关系的进程

    数据共享,win32 dll动态连接库的全局变量可以被所有调用的进程共享。

    动态的多进程共享:

    socket,数据进行共享

    linux特有的进程同步,信号和信号量,消息队列

    四、程序设计模式的不同

    windows程序往往因为交互流程复杂,各个窗口之间的交互会比较复杂,个人比较喜欢使用的程序框架的设计模式为中介者模式,

    该模式能清晰的将所有的功能模块独立,而不需要设计过多的子类,所谓的功能解耦。

    缺点是:如果所有的功能都中介类进行分发处理,中介类会比较庞大,导致业务复杂,所以在子功能设计之间,需要借用观察者,单列模式来缓和中介类的压力

    linux程序往往是默默在后台处理程序,不会逆向前行,往往采用command模式,一个线程负责生产command,一个线程负责消费command。当并发高的时候,多开几个线程才消费command。

     

     

     

     

     

     

    展开全文
  • linux上的两种可执行程序

    千次阅读 2017-11-21 17:06:00
    一、 Linux 系统上有两类的 Linux 可执行程序。1、 静态链接的可执行程序。静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”。因为这一原因,静态可执行程序不依赖任何外部库就可以运行。 2、 ...

    一、 Linux 系统上有两类的 Linux 可执行程序。

    1、 静态链接的可执行程序。静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”。因为这一原因,静态可执行程序不依赖任何外部库就可以运行。
    2、 动态链接的可执行程序。
     静态程序与动态程序的区别: 动态程序是不完整的程序,所占的空间小,依靠外部共享库来提供运行所需的大部分函数

    二、 ldd 命令来确定某一特定可执行程序是否为静态链接的

    #ldd /sbin/sln
    not a dynamic executable
    
    #ldd /bin/ln
    libc.so.6 => /lib/libc.so.6 (0x40021000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

    三、 如果动态可执行程序不包含运行所需的所有函数,Linux 的哪部分负责将这些程序和所有必需的共享库一起装入,以使它们能正确执行呢?答案是动态装入器(dynamic loader)

    要查看 ldconfig 可以“看到”的所有共享库,请输入:

    # ldconfig -p | less

    四、 另一个方便的技巧可以用来配置共享库路径。有时候您希望告诉动态装入器在尝试任何 /etc/ld.so.conf 路径以前先尝试使用特定目录中的共享库。在您运行的较旧的应用程序不能与当前安装的库版本一起工作的情况下,这会比较方便。

    LD_LIBRARY_PATH

      要指示动态装入器首先检查某个目录,请将 LD_LIBRARY_PATH 变量设置成您希望搜索的目录。多个路径之间用冒号分隔;例如:

    # export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"

      导出 LD_LIBRARY_PATH 后,如有可能,所有从当前 shell 启动的可执行程序都将使用 /usr/lib/old 或 /opt/lib 中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf 中指定的库

    展开全文
  • Linux程序管理

    2019-02-22 11:29:34
    程序: ...进程彼此之间具有相关性 触发任何一个事件时,系统都会将他定义成为一个进程,并且给与这个进程一个ID,称为PID,同时依据这个触发进程的用户与其相关属性的关系,给PID一组有效的权限...

    程序:
    通常以二进制放置在存储媒介中,以物理文件的形式存在

    进程:
    程序被触发后,执行者的权限与属性、程序的代码与所需数据都会被加载到内存中,操作系统并给与这个内存内的一个单元标识符(PID)
    进程就是正在运行中的程序
    进程彼此之间具有相关性

    触发任何一个事件时,系统都会将他定义成为一个进程,并且给与这个进程一个ID,称为PID,同时依据这个触发进程的用户与其相关属性的关系,给PID一组有效的权限设置

    工作管理:
    直接将命令丢到后台执行:&
    将目前的工作丢到后台“暂停”:[ctrl]+z
    查看目前的后台工作状态:jobs [ -lrs ]
    -l:除了列出正在工作的名字与命令串外,同时列出PID的号码
    -r:仅列出正在后台进行的工作
    -s:仅列出正在后台暂停的工作

    将后台工作拿至前台处理:fg %jobname
    jobname:工作号码,%可有可无

    让工作在后台下的状态变成运行中:bg

    管理后台当中的工作:kill
    kill -l:-l:列出目前kill能够使用的信号有哪些

    kill -signal %jobname

    • signal :代表给与后面的工作的怎样的指示
      -1:重新读取参数配置文件
      -2:代表与由键盘输入[ctrl] +c 同样的操作
      -9:立刻强制删除一个工作
      -15:以正常的程序结束方式终止一项工作

    进程查看:
    静态查看:
    查看系统所有的进程数据:ps aux / ps -lA
    -A:所有的进程均显示出来
    -a:不与terminal有关的所有进程
    -u:与有效用户相关的进程
    x:与a参数同用,列出较为完整的信息

    连同部分进程树的状态 ps axjf
    输出格式规划
    l:较长、较详细列出所有PID的信息列出
    j:工作的格式
    -f:更完整的输出

    动态查看:
    持续检测进程运行的状态:top
    top [ -d 数字 ] | top [ -bnp ]
    -d:多少秒更新一次。默认是5秒
    -b:以批次的方式执行top
    -n:需要进行几次top的输出结果。与-b搭配
    -p:指定PID进行查看检测

    展开全文
  • Linux 程序管理

    2013-09-02 00:01:56
    Linux当中触发任何一个事件时,系统都会将他定义为一个程序,并且给予程序一个ID,成为PID,同时依据启动这个程序 的用户与相关属性关系,给予这个PID一组有效的权限设定,从此之后,这个PID能够在系统上面进行的...
  • 2019年常见Elasticsearch 面试题答案详细解析(下)

    千次阅读 多人点赞 2019-12-26 15:51:03
    (5)补充:Query Then Fetch 的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch 增加了一个预查询的处理,询问 Term 和 Document frequency,这...
  • Linux设备驱动程序学习笔记

    千次阅读 2017-05-15 18:02:51
    Linux设备驱动程序的作用 简介 设备 驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作细节。用户的操作通过一组标准化的调用执行,而这些调用独立...
  • Linux中用C语言进行OpenMP并行程序设计 ················································································...
  • Linux -- Linux -- LLiinnuuxx设备驱动程序学习与硬件通信 平台相关性 由于自身的特性I/O 指令与处理器密切相关的非常难以隐藏系统间 的不同所以大部分的关于端口 I/O 的源码是平台依赖的以下是x86 和ARM 所使用函数...
  • Window,Linux及应用程序监控

    千次阅读 2018-08-28 20:52:59
    这些例行程序执行所有在计算机上的如安排和同步活动等基本的程序,并提供对非图形设备、内存管理和名称空间管理的访问。 如果Interrupts/sec大于System Calls/sec.,则系统中某一硬件设备产生过多的中断。 ...
  • 1、程序(program):通常为二进制程序,放置在存储媒介中,以物理文件的形式保存 ...3、进程彼此之间是有相关性的,故有父进程与子进程之分,而Linux系统所有进程的父进程就是init这个PID为1...
  • Linux环境下,如果通过源代码编译安装程序的简单过程可以描述为:./configure-->make-->make install。其中./configure配置脚本功能就是对你的系统做很多的测试,以用来检测出你的安装平台的目标特征,比如它会检测...
  • linux从入门到精通.chm

    2010-05-17 09:11:20
    4.9.3 包的相关性 4.9.4 包的安装 5 结束安装 5.1 配置鼠标 5.2 配置X Windows 5.2.1 配置XFree86服务器 5.3 配置网络 5.3.1 网络配置对话 5.4 配置时钟 5.5 选择重启动时启动的Services 5.6 配置打印机 ...
  • 平时应用程序在运行时都是由操作系统管理的。操作系统对应用进程进行调度,使其在不同的核上轮番运行。 对于普通的应用,操作系统的默认调度机制是没有问题的。但是,当某个进程需要较高的运行效率时,就有必要...
  • 一个程序被载入到内存当中运行,那么在内存内的那个数据就被称为程序(process)。程序是操作系统上非常重要的概念, 所有系统上面跑的数据都会以程序的型态存在。那么系统的程序有哪些状态?不同的状态会如何影响...
  • Linux程序树 : pstree

    千次阅读 2012-07-04 11:20:37
    转:http://blog.chinaunix.net/space.php?uid=23054351&do=blog&id=2560359   pstree ...-A :各程序树之间的连接以 ASCII 字元来连接; -U :各程序树之间的连接以万国码的字元来连接。
  • Linux软件安装的三种方法

    千次阅读 2020-08-31 15:36:47
    在Windows下安装一个软件很轻松,只要双击setup或者.exe的文件,安装提示连续“下一步”即可,然而linux系统下安装一个软件并不那么轻松,因为我们不是在图形界面下,所以要学会如何在linux下安装一个软件软件的安装...
  • 在我们的程序包中,我们为跨媒体相关性计算实现了四种单独的方法,为跨媒体相关性融合实现了一种后融合方法。 #####个别方法: :将图像投影到“单词袋”空间中。 :将项目查询到视觉特征空间
  • 这包括通过命令行在Linux机器上安装应用程序。 我已经使用Linux大约25年了,一次又一次,我发现自己回到了命令行来安装我的应用程序。 从命令行安装应用程序最常见的方法是使用软件包管理器通过软件存储库(存储...
  • 浅析linux 程序中的库

    千次阅读 2011-12-04 22:26:10
    linux下的程序如许多命令(ls 、echo、cd)要实现他们的功能,需要许多函数,在这些程序的源码中,这些函数的来源可以有两种,一种是自己编写,另一种是通过调用别人已经写好的函数,自己在编写程序的时候如果有别人...
  • 平台相关性 由于自身的特性,I/O 指令与处理器密切相关的,非常难以隐藏系统间的不同。所以大部分的关于端口 I/O 的源码是平台依赖的。以下是x86和ARM所使用函数的总结: IA-32 (x86) x86_64 这个体系支持...
  • 第十七章、程序管理与 SELinux 初探 最近升级日期:2009/09/11 一个程序被加载到内存当中运行,那么在内存内的那个数据就被称为程序(process)。程序是操作系统上非常重要的概念,所有系统上面跑的数据都会以...
  • Linux Coscheduling调度器简介

    千次阅读 2019-09-30 09:20:14
    Coscheduling的这种策略对于需要并行化执行的多线程程序非常有意义,比如并行计算,虚拟化这些,最大限度地提高了资源的利用率,减少了切换带来的颠簸。 如果我们把时间和空间看作是效果等同的两个维度,其实我们...
  • 我们尽力使它成为一个独立的程序包,这意味着我们将所有依赖项都包含在此存储库中。 该代码是由编写的。 先决条件 Linux(Ubuntu 16.04) Matlab R2015b 入门 安装 克隆此存储库 在将“ First”标志更改为1的同时...
  • 引用:《鸟哥的Linux私房菜基础篇第三版》   与Minix之间 Linus Torvalds(托瓦兹, 1969年出生)的外祖父是赫尔辛基大学的统计学家,他的外祖父为了让自己的小孙子能够学点东西,所以从小就将托瓦兹带到身边来管理...
  • 在写阻塞与非阻塞的驱动程序时,经常用到等待队列。 一、阻塞与非阻塞  阻塞调用是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回。  非阻塞指不能立刻得到结果之前,该函数不会阻塞...
  • 见图:操作系统所处位置系统分类:Unix家族和Windows家族见图:Unix家族图和Windows家族和发展平台相关性:我们称能够支持程序运行的硬件或软件环境为平台。不同的平台都有其特有的指令格式,也就是说W

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,580
精华内容 5,432
关键字:

linux程序相关性

linux 订阅