我们学习高级进程通信,指用户可直接利用操作系统所提供的一组通信命令高效地传送大量数据的一种通信方式。 进程间通信的几种主要手段:管道、消息队列、共享内存、套接字 管道 管道,指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,只存在于内存中,是一种两个进程间进行单向通信的机制。在创建管道时,系统为管道分配一个页面作为数据缓冲区,通过管道通信的两个进程通过读写这个缓冲区来进程通信,写在缓冲区尾部,从头部读取数据。 局限性: 数据单向传递,即半双工;管道没有名字,只能用于具有亲缘关系的进程间通信;管道的缓冲区大小受限制;管道传送的是无格式的字节流。 管道的创建: int pipe(int fd[2]) //调用成功返回0,且数组中包含两个新的fd,失败返回-1 管道两端分别用fd[0]和fd[1]描述,管道两端的任务固定,fd[0]只能用于读,称为管道读端;fd[1]只能用于写,称为管道写端。 管道一旦创建成功,就可以作为一般的文件来使用,对一般文件进行操作的I/O函数也适用于管道。 管道的读写:如果某进程要读取管道中 继续阅读 >>


杜肖孟 17/04/16 13:42:11
net_speeder??? 同一份数据包发送两份。这样的话在服务器带宽充足情况下,丢包率会平方级降低。 直接优点是降低丢包率,直接缺点是耗费双倍流量。一些延伸影响是更容易触发快速恢复逻辑,避免了丢包时窗口缩减过快。一定程度也能提高网络速度。 安装过程 1:下载源码并解压 wget https://github.com/snooda/net-speeder/archive/master.zip unzip master.zip 2:准备编译环境 debian/ubuntu: #安装libnet-dev: apt-get install libnet1-dev #安装libpcap-dev: apt-get install libpcap0.8-dev centos: #下载epel:https://fedoraproject.org/wiki/EPEL/zh-cn 例:CentOS6 64位: wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noa 继续阅读 >>


杜肖孟 17/04/05 14:00:26
进程内存布局 每个进程分配的内存由很多部分组成,通常称为“段”。 1.文本段:包含了进程运行的程序二进制机器语言指令,只读,可共享,因为多个进程可同时运行同一程序; 2.初始化数据段:包含显式初始化的全局变量和静态变量; 3.未初始化数据段:也称为BSS段,包含未进行显示初始化的全局变量和静态变量。为什么分开放呢?主要原因在于程序在磁盘上存储时,没有必要为未经初始化的变量分配存储空间,相反可执行文件只需记录未初始化数据段的位置及所需大小,直到运行时再由程序加载器来分配这一空间。 4.栈段:动态增长和收缩的段,由栈帧组成,系统会为每个当前调用的函数分配一个栈帧,存储函数的局部变量、实参和返回值。动态存储函数之间的关系,以保证被调用函数在返回时恢复到母函数继续执行 5.堆:可在运行时为变量动态进行内存分配的一块区域,并在用完之后归还给堆区。 32位计算机限制了虚拟地址空间为4GB的大小。 栈与系统栈 栈在内存中的存放是高地址是栈底,低地址是栈顶。 内存的栈区实际上指的就是系统栈,系统栈由系统自动维护,它用于实现高级语言中函数的调用。对于类似 继续阅读 >>


杜肖孟 17/03/28 21:28:26
C++11一个重要的特性就是对多线程的支持。 何谓并发 计算机领域的并发指的是在单个系统里同时执行多个独立的任务,而非顺序的进行一些活动。 并发的两种方式: 1.多核处理器,每个任务在自己核心上执行,称为硬件并发,机器能够真正的并行多个任务; 2.单核机器,通过多任务操作系统的切换功能,同时运行多个程序。机器只能在某一时刻执行一个任务,不过它每秒可以执行多次任务切换。因为任务切换的很快,以至于无法感觉任务在何时被暂时挂起,而切换到另一任务,如今仍然称这样的系统为并发, 关系:当应用在多任务切换的环境下和真正并发的环境下执行相比,行为还是有区别的。任务切换在多核处理器上仍然适用。 并发的途径 1.多进程并发——有多个 单线程的 进程 2.多线程并发——单个进程运行多个进程 为什么使用并发 1.为了分离关注点 把不同的关注点分离开来,是处理复杂性的一个原则。通过将相关的代码与无关的代码分离,可使程序更容易理解和测试;同时可使每个线程的逻辑变的更加简单。 2.为了性能 两种方式利用并发提升性能: 继续阅读 >>


杜肖孟 17/03/27 22:35:15
1、进程之间的两种相互制约关系 (1)间接相互制约关系(互斥关系) 同处于一个系统中的进程,通常都共享着某种资源,如共享CPU、共享I/O设备等,所谓间接相互制约即源于这种资源共享,使系统中本来没有关系的进程因竞争资源产生了制约关系。 (2)直接制约关系(同步关系) 这种制约主要源于进程间的合作。比如输入、计算、输出。在运行过程中,某进程可能要在某些同步点上等待另一伙伴(协作进程)为它提供消息,在未获得消息之前,该进程处于等待状态,获得信息后被唤醒进入就绪态,才能被执行。 几个概念: 互斥:两个进程不能同时使用同一资源 死锁:指多个进程互不相让,都得不到足够的资源 饥饿:指一个进程一直得不到资源(其他进程可能轮流占用资源) 2、临界资源和临界区 进程的互斥是由于共享资源而引起的,为了描述这类情况,引入了临界资源和临界区的概念。 临界资源:系统中一次只允许一个进程访问的资源。如I/O设备、共享文件、共享变量等。 临界区:并发执行的进程中,访问临界资源的必须互斥执行的代码段叫临界区。 3、进程同步机制 (1) 继续阅读 >>


杜肖孟 17/03/16 23:36:19
进程概念的引入 进程的概念: 进程是程序的一次执行; 进程是可以和别的计算器并发执行的计算; 可定义为一个数据结构及能在其上进行操作的一个程序; 一个程序及其数据在处理机上顺序执行时所发生的活动; 是程序在一个数据集合上的运行过程﹐是系统进行资源分配和调度的一个独立单位。 综合定义为﹕可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的独立单位。 进程的表示和调度状态 进程的表示:通常由三部分组成 1.程序段:描述进程所要完成的功能,是进程执行时不可修改的部分 2.数据段:程序执行时所需要的数据和工作区,为一个进程专用,可修改 3.PCB:包含进程的描述信息和控制信息,是进程的动态特性的集中反应 PCB:进程控制块 PCB是进程存在的唯一标志,通常PCB包含以下几类信息: 1)进程描述信息 进程标识符PID:是进程的内部标识,用来唯一标识一个进程 进程名:进程的外部标识 2)处理器状态信息—现场信息 由处理器寄存器内容组成: 通用寄存器(8-32个) 指令计数器(下一条指令的地址) 继续阅读 >>


杜肖孟 17/03/15 23:47:53
一:无操作系统 1.手工 特点:(1)用户独占全机(2)CPU等待人工操作 问题:(1)计算机处理能力低(2)计算机工作效率低 2.脱机输入/输出方式 特点:数据的输入输出是在脱离主机的控制下完成的,通常是在外围机的控制下完成的 优点:(1)减少了CPU的空闲时间,缓和了人机矛盾(2)提高了I/O速度 二:单道批处理系统—晶体管 特点:利用磁带将若干个作业分类编成作业执行序列,每个批作业由一个专门的监督程序自动依次处理。 批:供一次加载的磁带或磁盘,通常由若干个作业组装成,在处理中使用相同的系统软件。 批作业组成:用户程序、数据、作业说明书(作业控制语言) 特征:(1)自动性—顺利情况下,磁带上的作业能自动地逐个依次进行(2)顺序性—先调入内存地作业先完成(3)单道性—内存中仅有一道程序运行,当该程序完成或发生异常时,才调入其后继程序进入内存执行 三:多道批处理系统 背景:60年代硬件两重大发展:中断技术和通道技术 中断技术 含义:指CPU在收到外部中断信号后,停止原来工作,转去处理该中断事件,完毕后回到原来断点继续工作。 继续阅读 >>


杜肖孟 17/03/14 23:13:00
硬盘组成 整块磁盘的组成主要有: 圆形的盘片(主要记录数据的部分);机械手臂与机械手臂上的磁头(可读写盘片上的数据);主轴马达,可以转动盘片,让机械手臂的磁头在盘片上读写数据。 盘片上的物理组成: 扇区(sector)为最小的物理存储单位,每个扇区为512bytes;将扇区组成一个圆,那就是柱面,柱面是分区的最小单位; 第一个扇区重要i,里面有硬盘主引导记录(MBR,446字节)及分区表(partition table,64字节)。 接口的磁盘在linux中文件名为: /dev/sd[a-p][1-15]:为SCSI,SATA,USB,Flash等接口的磁盘文件名; /dev/hd[a-d][1-63]:为IDE接口的磁盘文件名。 分区 磁盘分区指的是告诉操作系统“我这块磁盘在此分区可以访问的区域是由A柱面到B柱面之间的块”。 因为分区表只有64字节,所以最多只能记录四条分区的记录,我们称之为主分区或扩展分区;扩展分区只能有一个,扩展分区还能再分出逻辑分区;能够被格式化后作为数据访问的分区为主要分区和逻辑分区,扩展分区无法格式 继续阅读 >>


杜肖孟 17/03/04 15:02:17
Linux系统从启动到提供服务的过程是这样,先是机器加电,然后通过MBR或者UEFI加载GRUB,再启动内核,内核启动服务,然后开始对外服务。 步骤: 加载BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动的设备(比如硬盘); 读取并执行第一个开机装置内MBR 的boot Loader (即grub2, spfdisk 等程序); 依据boot loader 的设置加载Kernel ,Kernel 会开始检测硬件与加载驱动程序; 在硬件驱动成功后,Kernel 会主动调用init进程,而init会取得run-level信息; init 执行/etc/rc.d/rc.sysinit文件来准备软件执行的操作环境(如网络、时区); init 执行run-level的各个服务的启动(script方式); init 执行/etc/rc.d/rc.local 文件; init 执行终端机模拟程序mingetty来启动login进程,最后就等待用户登录。 下面详细介绍每一步程序。 BIOS和MBR都是硬件本身会支持的功能,Boot Loade 继续阅读 >>


杜肖孟 17/03/02 12:33:49
什么是内核模块? 其全称为动态可加载内核模块。之所以提供模块机制,是因为Linux是“单块内核”的操作系统,单内核的最大优点是效率高,因为所有的内容都集中在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。Linux内核是模块化组成的,它允许我们方便地在运行时动态地向内核中插入或从中删除代码。 模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时加载,被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。 特点: 装入的内核模块和其他内核部分完全一样,具有相同的访问权限,因此,差的内核模块会导致系统崩溃; 模块编程和内核版本密切相连,内核版本和模块版本的不兼容,也可能导致系统崩溃; 这些代码被一并组合在一个单独的二进制镜像中,这样基本内核镜像就尽可能的小,而且灵活性很好否则,在需要添加新硬件或者升级设备驱动时,必须重新构建内核。 用户层编程和内核模块编程的区别 选项 应用程序 内核模块程序 使用函数 libc 库 内核函数 运行空间 继续阅读 >>


杜肖孟 17/02/27 20:59:36