多任务编程
goodluckwhh
这个作者很懒,什么都没留下…
展开
-
进程及相关API
本文内容来主要来自于unix环境高级编程。一、main函数C语言总是从main函数开始执行(java,c++也是从main开始执行)。main的原型为:int main(int argc, char *argv[]);其中argc是参数个数,argv指向参数的各个指针所组成的数组。ANSI C和POSIX都要求argv[argc]指向NULL。内核在调用main之前会调用一原创 2013-01-23 22:01:08 · 2282 阅读 · 0 评论 -
linux内核“任务”之中断
linux内核中也存在多任务,这些任务可能是不同的类型,它们之间可能也需要进行同步和互斥,在讨论linux内核中的同步和互斥之前有必要先讨论下linux内核中的“任务”类型。linux内核中的任务包括:中断和异常软中断和taskletworkqueue内核定时器内核线程系统调用一、中断和异常1.中断和异常的基本概念1. 中断:指当需要时CPU暂时停止当前程序的执行转而执行处理新原创 2013-05-31 23:44:39 · 4737 阅读 · 0 评论 -
同步和互斥的POSIX支持(读写锁、信号量和记录锁)
一、读写锁1.基本概念当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题。因而有时候将读和写访问区分开来是有益处的。读写锁就提供了这样的能原创 2013-02-03 22:58:38 · 5960 阅读 · 1 评论 -
linux内核“任务”之软中断、tasklet、工作者队列
一. 软中断和Tasklets1.中断的延迟处理在中断的处理中,有一些不紧急不关键的任务在需要的时候可以被延迟一段时间来执行。对于中断服务程序来说,一般情况下如果它不结束执行,就不应该产生新的中断;而这些延迟的任务可以在打开中断的情形下执行,因而把它们从中断服务程序中提取出来可以降低内核的响应时间。linux支持两种非紧迫的、可中断的内核函数: 可延迟函数(包括软中断和tasklets )原创 2013-06-01 17:23:59 · 4958 阅读 · 0 评论 -
linux内核同步之信号量、顺序锁、RCU、完成量、关闭中断
一、信号量1.信号量的概念信号量也是一种锁,当信号量不可用时,尝试获取信号量的任务将挂起直到它拿到了信号量。由于尝试获取信号量的任务可能挂起,因而中断服务程序以及可延迟函数不能使用信号量。对于信号量来说需要注意:只有对信号量计数值的操作是原子的信号量的自旋锁只用于保护信号量的等待队列信号量是比较特殊的,其up操作不是必须由down操作的调用者发起。如果把信号量也看作原创 2013-06-02 14:44:04 · 5692 阅读 · 0 评论 -
同步和互斥的一些问题(死锁,优先级逆转)
一、死锁1.基本概念死锁:死锁指的是系统中并发执行的多个线程(进程)由于无法获所需的资源而永久阻塞的状态。死锁产生的必要条件:排它性互斥:指的是资源在任意时刻只能由一个任务(线程或进程)使用。如果此时还有其它任务请求该资源,则请求者只能等待,直至占有资源的任务释放资源。不可抢占:指的是当一个任务拥有某种资源时,除非它主动释放它,否则无法让该任务失去该资源的拥有权。持有和等待原创 2013-02-07 11:15:12 · 3503 阅读 · 0 评论 -
linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁
linux内核中的各种“任务”都能看到内核地址空间,因而它们之间也需要同步和互斥。linux内核支持的同步/互斥手段包括:技术功能作用范围每CPU变量为每个CPU复制一份数据所有CPU原子操作原子的读-修改-写一个计数器的指令所有CPU内存屏障避免指令被重新排序本地CPU或所有CPU自旋锁原创 2013-06-02 14:01:13 · 5024 阅读 · 0 评论 -
管道、FIFO以及共享内存
一、管道管道是UNIX IPC的最老形式,并且所有UNIX系统都提供此种通信机制,管道有两种限制;它们是半双工的。数据只能在一个方向上流动。它们只能在具有公共祖先的进程之间使用1.创建管道函数pipe用于创建管道。其原型为#include int pipe(int fd[ 2 ]) ; 返回:若成功则为0,若出错则为- 1该函数返回两个描述符,其中fd[0]原创 2013-04-20 10:16:55 · 3986 阅读 · 0 评论 -
System V IPC
一、消息队列1.mesgget,msgsnd,msgrcv消息队列存放在内核中并由消息队列标识符标识。每个消息包含一个正长整型类型字段,一个非负长度以及实际数据字节(对应于长度),所有这些都在将消息添加到队列时,传送给msgsnd。msgrcv用于从队列中取消息。对于该类型的消息队列来说,它不是一个先进先出的队列,可以按消息的类型字段取消息,POSIX消息队列则不能按照消息类型字段提取消息原创 2013-04-23 22:14:37 · 2693 阅读 · 0 评论 -
IPC基础
多任务编程中,除了同步互斥的问题外,还存在另外一种最常见的问题—进程间的信息传递。如果采用了多线程的方式实现了多任务,则由于多个线程之间共享宿主进程的资源(比如文件描述符,堆地址空间),因而这些线程之间可以很方便的实现信息的共享,唯一需要做的就是通过同步、互斥机制保证不出现竞态。但是如果是采用多进程的方式来实现多任务,则由于每个进程都拥有自己独立的资源,因而如果要在他们之间交互信息,就必须借助其它原创 2013-04-20 09:43:19 · 4619 阅读 · 0 评论 -
同步和互斥的POSXI支持(互斥锁,条件变量,自旋锁)
同步和互斥在多线程和多进程编程中是一个基本的需求,互相协作的多个进程和线程往往需要某种方式的同步和互斥。POSIX定义了一系列同步对象用于同步和互斥。同步对象是内存中的变量属于进程中的资源,可以按照与访问数据完全相同的方式对其进行访问。默认情况下POSIX定义的这些同步对象具有进程可见性,即同步对象只对定义它的进程可见;但是通过修改同步对象的属性可以使得同步对象对不同的进程可见,具体的做法是:原创 2013-02-01 22:50:18 · 9374 阅读 · 1 评论 -
同步和互斥
一、同步和互斥的基本概念现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行,同时运行可能是真的同时运行(SMP架构中),也可能仅仅是操作系统提供的服务(通过将CPU时间分片,并将时间片分给不同的任务)。在多任务操作系统中,同时运行的多个任务可能都需要访问/使用同一种资源多个任务之间有依赖关系,某个任务的运行依赖于另一个任务这两种情形是多任务编程中遇到的最基本的问题原创 2013-01-23 21:23:53 · 13145 阅读 · 1 评论 -
POSIX线程
POSIX(Portable Operating System Interface of Unix)是一个操作系统接口,因而遵循(兼容)这一标准的操作系统都应该提供对POSIX线程的支持。多线程一词可以解释为多个控制线程或多个控制流。一、多线程的益处在代码中实现多线程具有以下益处:提高应用程序的响应:可以对任何一个包含许多相互独立的活动的程序进行重新设计,以便将每个活动定义为一转载 2013-01-30 21:25:18 · 941 阅读 · 0 评论 -
POSIX线程属性
一、属性对象通过设置属性,可以指定一种不同于缺省行为的行为。使用 pthread_create创建线程时,或初始化同步变量时,可以指定属性对象。缺省值通常是可以满足需求的。属性对象是不透明的,因而不能通过赋值直接进行修改。相应的系统提供了一组函数,用于初始化、配置和销毁每种对象类型。初始化和配置属性后,属性便具有进程范围的作用域。使用属性时最好的方法即是在程序执行早期一次配置好所有必需转载 2013-01-30 21:37:39 · 1357 阅读 · 0 评论 -
信号(*nix)
在*nix系统中,还存在另外一种异步实体,该异步实体可能在任意时刻被执行,因此它和进程本身的主逻辑之间也算是一种另类的“多任务”, 该异步实体就是信号处理函数,它依赖于*nix系统中的信号机制。一、信号的概念1.信号的基本概念每个信号都有一个名字。这些名字都以三个字符 SIG开头。信号在头文件中,这些信号都被定义为正整数(信号编号)。没有一个信号其编号为0。信号的两个主要目的在原创 2013-01-30 20:55:22 · 1097 阅读 · 0 评论 -
linux内核“任务”之定时器、内核线程、系统调用
一、内核定时器1.基本概念在某些场景下,我们需要在特定的时间后做某些动作,但是又不想一直等待而浪费CPU,这个时候定时器是非常合适的机制。定时器用于在将来的某个时间点执行某个函数以完成特定的任务。内核定时器告诉内核在指定的时间点使用特定的参数来调用特定的函数。定时器是异步运行于其注册者的,定时器运行时,注册该定时器的任务可能在休眠也可能在其它处理器上运行,甚至可能已经退出。linu原创 2013-06-01 21:10:58 · 9525 阅读 · 0 评论