随笔分类 -  OS/Linux

Linux进程间通信之信号量(semaphore)、消息队列(Message Queue)和共享内存(Share Memory)
摘要:System V 进程通信方式:信号量(semaphore)、消息队列(Message Queue)和共享内存(Share Memory)信号量信号量(semaphore)实际是一个整数,它的值由多个进程进行测试(test)和设置(set)。就每个进程所关心的测试和设置操作而言,这两个操作是不可中断的,或称“原子”操作,即一旦开始直到两个操作全部完成。测试和设置操作的结果是:信号量的当前值和设置值相加,其和或者是正或者为负。根据测试和设置操作的结果,一个进程可能必须睡眠,直到有另一个进程改变信号量的值。信号量可用来实现所谓的“临界区”的互斥使用,临界区指同一时刻只能有一个进程执行其中代码的代码 阅读全文

posted @ 2012-11-04 15:15 as_ 阅读(14901) 评论(0) 推荐(0) 编辑

Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
摘要:整理自网络Unix IPC包括:管道(pipe)、命名管道(FIFO)与信号(Signal)管道(pipe)管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;实现机制:管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的 阅读全文

posted @ 2012-11-03 13:26 as_ 阅读(44262) 评论(2) 推荐(4) 编辑

Linux 多线程环境下 进程线程终止函数小结
摘要:pthread_kill:pthread_kill与kill有区别,是向线程发送signal。,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数。int pthread_kill(pthread_t thread, int sig);向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出。pthread_kill(threadid, SIGKILL)杀死整个进程。 如果要获得正确的行为,就需要在线程内实现si 阅读全文

posted @ 2012-10-11 19:13 as_ 阅读(23685) 评论(0) 推荐(0) 编辑

Linux 多线程环境下 线程joinable状态和unjoinable状态
摘要:这里主要讨论这两种状态下,线程终止以及资源释放的问题linux线程中,pthread有两种状态joinable状态和unjoinable状态。joinable状态下,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符。只有当你调用了pthread_join之后这些资源才会被释放,这是需要main函数或者其他线程去调用pthread_join函数。unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。设置unjoinable状态设置有两种办法 一是可以在pthread_create时指定,二是线程创建后在线程中pt 阅读全文

posted @ 2012-10-11 18:02 as_ 阅读(3718) 评论(0) 推荐(0) 编辑

Belady现象
摘要:Belady现象:采用FIFO算法时,如果对—个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。Belady现象可形式化地描述为:一个进程户要访问M个页,OS分配舻个内存页面给进程P;对一个访问序列S,发生缺页次数为PE(占,N)。当N增大时,PE(S,N)时而增大时而减小。Belady现象的原因是FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,即被置换的页面并不是进程不会访问的。 先进先出算法(FIFO)。选择装入最早的页面置换。可以通过链表来表示各页的装入时间先后。FIFO的性能较差,因为较早调入的页往往是经常被访问的页,这些页在FIFO算法下 阅读全文

posted @ 2012-09-26 10:35 as_ 阅读(4172) 评论(0) 推荐(0) 编辑

Linux进程模型总结
摘要:来源于网络 原创不详Linux进程通过一个task_struct结构体描述,在linux/sched.h中定义,通过理解该结构,可更清楚的理解linux进程模型。 包含进程所有信息的task_struct数据结构是比较庞大的,但是该数据结构本身并不复杂,我们将它的所有域按其功能可做如下划分:进程状态(State)进程调度信息(Scheduling Information)各种标识符(Identifiers)进程通信有关信息(IPC:Inter_Process Communication)时间和定时器信息(Times and Timers)进程链接信息(Links)文件系统信息(File S.. 阅读全文

posted @ 2012-08-01 13:02 as_ 阅读(4408) 评论(0) 推荐(0) 编辑

Linux虚拟文件系统小结
摘要:1.inode1).inode简介inode 是 UNIX/Linux 操作系统中的一种数据结构,其本质是结构体,它包含了与文件系统中各个文件相关的一些重要信息,例如文件及目录的基本信息,包含时间、档名、使用者及群组等。在 UNIX/Linux中创建文件系统时,同时将会创建大量的 inode 。通常,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号,我们可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。文件属性保存在索引结点里,在访问文件时,索引结点被复制 阅读全文

posted @ 2012-07-27 12:52 as_ 阅读(7069) 评论(2) 推荐(3) 编辑

Linux ext2文件系统小结
摘要:本文来源:http://learn.akae.cn/media/ch29s02.html有修改1.ext2文件系统整体布局一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息。下图是一个磁盘分区格式化成ext2文件系统后的存储布局。文件系统中存储的最小单位是块(Block),一个块究竟多大是在格式化时确定的,例如mke2fs的-b选项可以设定块大小为1024、2048或4096字节,这些 blocks 被聚在一起分成几个大的 block group。每个 block group 阅读全文

posted @ 2012-07-26 12:50 as_ 阅读(5096) 评论(0) 推荐(1) 编辑

可重入函数与不可重入函数
摘要:参考自网络的各种资料:可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。如果确实需要 阅读全文

posted @ 2012-07-24 10:10 as_ 阅读(1087) 评论(0) 推荐(0) 编辑

信号量、互斥体和自旋锁
摘要:一、信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作: (1) 测试控制该资源的信号量。 (2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。 (3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。 (4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。 维护... 阅读全文

posted @ 2012-07-21 14:50 as_ 阅读(39560) 评论(5) 推荐(11) 编辑

Linux写时拷贝技术(copy-on-write)
摘要:源于网上资料COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。 那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢? 在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exe 阅读全文

posted @ 2012-07-20 20:24 as_ 阅读(110080) 评论(10) 推荐(42) 编辑

Linux的原子操作以及LOCK前缀
摘要:关于原子操作所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念。 原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。 原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的。原子类型定义如下: typedef struct { volatile int counter; } atomic_t; volatil 阅读全文

posted @ 2012-07-20 12:45 as_ 阅读(3105) 评论(0) 推荐(0) 编辑

进程和线程
摘要:进程进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程是表示资源分配的基本单位,又是调度运行的基本单位。 进程特性:动态性,并发性,独立性,异步性 进程状态:1)就绪状态(Ready) 2)运行状态(Running) 3)阻塞状态(Blocked) 引起进程创建事件:1) 用户登录 2) 作业调度 3) 提供服务 4) 应用请求 调度算法:FIFO(First Input First Output 先进先出法)、RR(时间片轮转算法)、(HPF)最高优先级算法 进程间通信:1.管道(pipe)及有名管道(named pipe 阅读全文

posted @ 2012-07-16 16:42 as_ 阅读(1183) 评论(0) 推荐(0) 编辑

执行程序的内存分布总结
摘要:以下内容为各方资料汇总 所以逻辑顺序不大清晰一般认为在c中分为这几个存储区: 1. 栈--有编译器自动分配释放 2. 堆--一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3. 全局区(静态区)-- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。 4. 另外还有一个专门放常量的地方。程序结束释放。 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了stat... 阅读全文

posted @ 2012-07-14 19:14 as_ 阅读(1371) 评论(0) 推荐(0) 编辑

堆和栈概念整理
摘要:1.内存管理方式: 堆:一般由程序员分配释放,程序员申请时需要指明大小,leg,C语言中malloc函数:p1=(char*)malloc(10),C++中:p2=new char[20].若程序员不去释放,当程序结束时可能由操作系统释放 ,注意其与数据结构的堆完全是两回事,分配方式类似于链表,分配释放的关键字:new,malloc,delete,free 栈:由系统自动分配和释放,存放函数的参数值,局部变量等等,操作类似于数据结构的栈,eg:生命一个局部变量 int b,系统自动在栈中为其开拓空间2.系统响应: 堆:OS有一个记录空闲内存地址的链表,当OS收到程序的申请时,会遍历该链表,寻找 阅读全文

posted @ 2012-07-12 13:14 as_ 阅读(970) 评论(0) 推荐(1) 编辑

导航