Process and Thread
文章平均质量分 87
ctthuangcheng
这个作者很懒,什么都没留下…
展开
-
posix多线程有感--自旋锁
自旋锁是SMP架构中的一种low-level的同步机制。 当线程A想要获取一把自旋锁而该锁又被其它线程锁持有时,线程A会在一个循环中自旋以检测锁是不是已经可用了。对于自选锁需要注意:由于自旋时不释放CPU,因而持有自旋锁的线程应该尽快释放自旋锁,否则等待该自旋锁的线程会一直在那里自旋,这就会浪费CPU时间。持有自旋锁的线程在sleep之前应该释放自旋锁以便其它线程可以获得自旋锁原创 2013-05-09 19:54:18 · 2491 阅读 · 0 评论 -
posix多线程有感--线程高级编程(互斥量属性)
互斥量具有一些属性,通过修改这些属性可以控制锁的一些行为。缺省的互斥锁属性及其值如下:pshared: PTHREAD_PROCESS_PRIVATEtype: PTHREAD_MUTEX_DEFAULTprotocol: PTHREAD_PRIO_NONEprioceiling: – robustness:原创 2013-05-09 09:51:07 · 3159 阅读 · 3 评论 -
posix多线程有感--线程高级编程(pthread_key_t)
下面说一下线程中特有的线程存储,Thread Specific Data 。线程存储有什么用了?他是什么意思了?大家都知道,在多线程程序中,所有线程共享程序中的变量。现在有一全局变量,所有线程都可以使用它,改变它的值。而如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,而它的值在每一个线程中又是单独存储的。这就是线程存储的意义。原创 2013-05-07 15:06:55 · 1808 阅读 · 0 评论 -
posix多线程有感--线程高级编程(pthread_once)
有时候我们需要对一些posix变量只进行一次初始化,如线程键(我下面会讲到)。如果我们进行多次初始化程序就会出现错误。 在传统的顺序编程中,一次性初始化经常通过使用布尔变量来管理。控制变量被静态初始化为0,而任何依赖于初始化的代码都能测试该变量。如果变量值仍然为0,则它能实行初始化,然后将变量置为1。以后检查的代码将跳过初始化。 但是在多线程程序设计中,事情就变的复杂的多。如果原创 2013-05-07 11:33:43 · 1374 阅读 · 0 评论 -
UNIX环境高级编程——线程
我原创 2013-07-15 17:39:24 · 1790 阅读 · 0 评论 -
posix多线程有感--线程高级编程(进程的优先级)
作为多任务的操作系统,Linux内核为每个创建的进程分配时间片并根据其优先级进行调度。当进程被创建时,其对应的task_struct里包含了四个优先级:struct task_struct { …… int prio, static_prio, normal_prio; unsigned in原创 2013-05-11 02:28:52 · 2465 阅读 · 0 评论 -
posix多线程有感--线程高级编程(线程堆栈)
先来讲说线程内存相关的东西,主要有下面几条:进程中的所有的线程共享相同的地址空间。任何声明为static/extern的变量或者堆变量可以被进程内所有的线程读写。一个线程真正拥有的唯一私有储存是处理器寄存器。线程栈可以通过暴露栈地址的方式与其它线程进行共享。 有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在原创 2013-05-10 21:06:58 · 2099 阅读 · 0 评论 -
posix多线程有感--线程高级编程(线程内存模式)
一组并发线程运行在一个进程的上下文中,每个线程都有自己独有的线程上下文,上下文中包括线程ID,栈,栈指针,程序计数器,条件代码和通用寄存器值,每个线程与其他线程共享部分进程上下文,其中包括整个虚拟地址空间(这个空间有只读文本(代码)区),读/写数据区,堆和所有共享库代码和数据区,线程也同样共享已打开的文件和已安装的信号句柄。从可操作的角度而言,不可能从一个线程去读取或写另一个线程的寄存器值,但任何原创 2013-05-09 17:10:32 · 2485 阅读 · 0 评论 -
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
/* * thread_attr.c * * Create a thread using a non-default attributes object, * thread_attr. The thread reports its existence, and exits. The * attributes object specifies that the thread be原创 2013-05-08 11:47:37 · 1684 阅读 · 0 评论 -
posix多线程有感--线程高级编程(互斥量属性)(代码)
/* * mutex_attr.c * * Create a mutex using a non-default attributes object, * mutex_attr. If the implementation supports the pshared * attribute, the mutex is created "process private" so th原创 2013-05-09 09:58:08 · 1455 阅读 · 0 评论 -
posix多线程有感--线程高级编程(条件变量属性)
1.条件变量的初始化int pthread_cond_init(thread_cond_t *cond,pthread_condattr_t *attr); 参数:cond 条件变量 attr 条件变量属性 成功返回0,出错返回错误编号。 注意:如果参数attr为空,那么它将使用缺省的属性来设置所指定的条件变量。2.条件变量摧毁函数原创 2013-05-09 15:36:19 · 1774 阅读 · 0 评论 -
posix多线程有感--线程高级编程(线程和fork,exec)
当多线程进程调用fork创建子进程时,Pthreads指定只有那个调用fork的线程在子进程内存在(表示子进程中只有调用线程这个线程)。尽管当从fork调用返回时,只有调用线程在子进程中存在,所有其他的Pthreads线程状态仍保留为与调用fork时相同的状态。在子进程中,线程拥有与在父进程内相同的状态。它拥有相同的互斥量,同样的线程私有数据键值等。尽管当调用fork时在同步对象上等待的任何线程不原创 2013-05-10 10:14:39 · 3602 阅读 · 0 评论 -
posix多线程有感--API
一.头文件#include 二.编译选项-lpthread三.结构体[cpp] view plaincopyprint?pthread_t pthread_attr_t pthread_barrier_t pthread_barrierattr_t pthread_cond_t pthread_condattr_t pthread_key_t原创 2013-05-09 20:00:14 · 1512 阅读 · 0 评论 -
posix多线程有感--线程高级编程(线程属性pthread_attr_t)---实时调度
一、系统支持的线程优先级的最大和最小值名称::sched_get_priority_maxsched_get_priority_min功能:获得系统支持的线程优先权的最大和最小值头文件:#include函数原形:int sche原创 2013-05-07 17:17:05 · 2343 阅读 · 0 评论 -
posix多线程有感--线程高级编程(线程属性pthread_attr_t)
1.线程属性 线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化。名称::pthread_attr_init/pthread_attr_destroy原创 2013-05-07 16:25:16 · 1678 阅读 · 0 评论 -
posix多线程有感--同步
1.创建和销毁互斥量pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t *attr);int pthread_mutex_destroy(pthread_mutex_t *mutex); 不能拷贝互斥量变原创 2013-05-02 11:47:12 · 1245 阅读 · 0 评论 -
posix多线程有感--线程高级编程(线程调度以及优先级设置)
当在属性对象中设置调度策略或优先级时,必须同时设置inheritsched属性(即继承属性设置为:PTHREAD_EXPLICIT_SCHED)。linux内核的三种调度方法:SCHED_OTHER 分时调度策略SCHED_FIFO实时调度策略,先到先服务SCHED_RR实时调度策略,时间片轮转 实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和c原创 2013-05-10 22:42:08 · 2521 阅读 · 0 评论 -
posix多线程有感--线程高级编程(线程属性pthread_attr_t)---实时调度(代码)
/* * sched_attr.c * * Demonstrate use of POSIX 1003.1c-1995 thread priority * scheduling attributes, by creating an attributes object with * realtime scheduling policy and priority. * * Special原创 2013-05-07 17:20:55 · 1812 阅读 · 0 评论 -
posix多线程有感--线程高级编程(优先级有关)
今天查看了linux下的实时线程,FIFO和RR策略的调度,遇到一个问题: priority越大优先级越高呢?还是越小越高呢? 回答这个问题要明白一个问题,首先,linux2.6内核将任务优先级进行了一个划分: 0——99 实时进程 100——139 非实时进程 现在,这个划分是起决定作用的,而且一定是数值越小,优原创 2013-05-11 02:49:14 · 2145 阅读 · 0 评论 -
posix多线程有感--线程高级编程(均衡负载CPU绑定)
多线程、多进程的情况下。可以同过指定CPU进行负载均衡,而不是让操作系统自动进行负载均衡。因为你比操作系统更了解自己的程序,为了避免调度器愚蠢的调度你的程序,或是为了在多线程程序中避免缓存失效造成的开销。 将进程/线程与cpu绑定,最直观的好处就是提高了cpu cache的命中率,从而减少内存访问损耗,提高程序的速度。我觉得在NUMA架构下,这个操作对系统运行速度的提升有原创 2013-05-10 16:08:56 · 3355 阅读 · 0 评论 -
posix多线程有感--POSIX 线程间的内存可视性
pthreads提供了一些有关内存可视性的基本规则。你可以指望所有的标准实现都遵循以下规则:(1)当线程调用pthread_create时,它所能看到的内存值也是它建立的线程能够看到的。任何在调用pthread_create之后向内存写入的数据,可能不会被建立的线程看到,即使写操作发生在启动新线程之前。(2)当线程解锁互斥量时看到的内存中的数据,同样也能被后来直接锁住(或通过等待条件变量锁原创 2013-05-03 15:13:28 · 1490 阅读 · 0 评论 -
UNIX环境高级编程——线程与进程区别
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:(1)一个程序至少有一个进程,一个进程至少有一个线程。(2)线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的原创 2013-07-17 11:57:44 · 2882 阅读 · 0 评论 -
UNIX环境高级编程——线程同步之互斥量
互斥量(也称为互斥锁)出自POSIX线程标准,可以用来同步同一进程中的各个线程。当然如果一个互斥量存放在多个进程共享的某个内存区中,那么还可以通过互斥量来进行进程间的同步。互斥量,从字面上就可以知道是相互排斥的意思,它是最基本的同步工具,用于保护临界区(共享资源),以保证在任何时刻只有一个线程能够访问共享的资源。互斥量类型声明为pthread_mutex_t数据类型,在中有具体的定义。原创 2013-07-16 13:59:11 · 1904 阅读 · 0 评论 -
UNIX环境高级编程——互斥量属性
互斥量具有一些属性,通过修改这些属性可以控制锁的一些行为。缺省的互斥锁属性及其值如下:pshared: PTHREAD_PROCESS_PRIVATEtype: PTHREAD_MUTEX_DEFAULTprotocol: PTHREAD_PRIO_NONEprioceiling: – robustness: PT原创 2013-07-17 16:17:23 · 2805 阅读 · 0 评论 -
UNIX环境高级编程——线程属性之分离属性
说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的。 我们知道,进程中的线程可以调用:int pthread_join(pthread_t tid, void **rval_ptr); 来等待某个线程的终止,获得该线程的终止状态,并收回所占的资源。如果对线程的返回状态不感兴趣,可以将rval_ptr设置为NULL。也可以调用:int p原创 2013-07-17 16:07:19 · 1700 阅读 · 0 评论 -
UNIX环境高级编程——线程同步之条件变量以及属性
条件变量变量也是出自POSIX线程标准,另一种线程同步机制。主要用来等待某个条件的发生。可以用来同步同一进程中的各个线程。当然如果一个条件变量存放在多个进程共享的某个内存区中,那么还可以通过条件变量来进行进程间的同步。 每个条件变量总是和一个互斥量相关联,条件本身是由互斥量保护的,线程在改变条件状态之间必须要锁住互斥量。条件变量相对于互斥量最大的优点在于允许线程以无竞争的方式等待条件的发生原创 2013-07-16 22:59:40 · 1860 阅读 · 0 评论 -
UNIX环境高级编程——线程私有数据
下面说一下线程中特有的线程存储,Thread Specific Data 。线程存储有什么用了?他是什么意思了?大家都知道,在多线程程序中,所有线程共享程序中的变量。现在有一全局变量,所有线程都可以使用它,改变它的值。而如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,而它的值在每一个线程中又是单独存储的。这就是线程存储的意义。原创 2013-07-17 17:04:00 · 5192 阅读 · 1 评论 -
UNIX环境高级编程——线程和fork
当线程调用fork时,就为子进程创建了整个进程地址空间的副本。子进程通过继承整个地址空间的副本,也从父进程那里继承了所有互斥量、读写锁和条件变量的状态。如果父进程包含多个线程,子进程在fork返回以后,如果紧接着不是马上调用exec的话,就需要清理锁的状态。 在子进程内部只存在一个线程,它是由父进程中调用fork的线程的副本构成的。如果父进程中的线程占有锁,子进程同样占有这些锁。问题是子进原创 2013-07-18 17:01:05 · 1947 阅读 · 0 评论 -
UNIX环境高级编程——进程管理和通信(总结)
进程管理与通信进程的管理进程和程序的区别:进程: 程序的一次执行过程 动态过程,进程的状态属性会发生变化程序:存放在磁盘上的指令、数据的有序集合 是个文件,可直观看到程序program 静态的概念,本身不会发生变化。指令谁来执行,数据谁来访问?cpu!但前提是cpu能够接触到,程序执行过程需要cpu、内存、以及相关的资源。进程是动态的,需要执行时才创建,运行结束要回收,包括创建、调度、执行、原创 2013-07-19 12:49:58 · 2307 阅读 · 0 评论 -
UNIX环境高级编程——线程和信号
每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的。这意味着尽管单个线程可以阻止某些信号,但当线程修改了与某个信号相关的处理行为以后,所有的线程都必须共享这个处理行为的改变。这样如果一个信号选择忽略某个信号,而其他的线程可以恢复信号的默认处理行为,或者为信号设置一个新的处理程序,从而可以撤销上述线程的信号选择。原创 2013-07-18 17:41:53 · 2072 阅读 · 0 评论 -
一个 Linux 上分析死锁的简单方法
简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一转载 2013-08-12 11:20:06 · 2132 阅读 · 0 评论 -
UNIX环境高级编程——线程同步之读写锁以及属性
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程。当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步,和互斥量不同的是:互斥量会把试图进入已保护的临界区的线程都阻塞;然而读写锁会视当前进入临界区的线程和请求进入临界区的线程的属性来判断是否允许线程进入。相对互斥量只有加锁和不加锁两种状态,读写锁有三种状态:原创 2013-07-16 15:16:35 · 2374 阅读 · 0 评论 -
UNIX环境高级编程——线程属性之并发度
并发度控制着用户级线程可以映射的内核线程或进程的数目。如果操作系统的实现在内核级的线程和用户级的线程之间保持一对一的映射,那么改变并发度并不会有什么效果,因为所有的用户级线程都可能被调度到。但是,如果操作系统的实现让用户级线程到内核级线程或进程之间的映射关系是多对一的话,那么在给定时间内增加可运行的用户级线程数,可能会改善性能。 pthread_setconcurrency函数可以用于提示原创 2013-07-17 15:48:01 · 2985 阅读 · 0 评论 -
UNIX环境高级编程——线程属性
pthread_attr_t 的缺省属性值 属性值结果scopePTHREAD_SCOPE_PROCESS新线程与进程中的其他线程发生竞争。detachstatePTHREAD_CREATE_JOINABLE线程退出后,保留完成状态和线程 ID。stackaddrNULL新线程具有系统分配的栈地址。stacksize1M新线程具有系统定义的栈大小。priority0新线程的优先级为0。inheri原创 2013-07-17 13:32:54 · 1691 阅读 · 0 评论 -
posix多线程有感--线程高级编程(条件变量)
1.初始化条件变量pthread_cond_initint pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);返回值:函数成功返回0;任何其他返回值都表示错误初始化一个条件变量。当参数cattr为空指针时,函数创建的是一个缺省的条件变量。否则条件变量的属性将由cattr中的属性值来决定。调原创 2013-05-03 10:41:19 · 1141 阅读 · 0 评论 -
posix多线程有感--进程调度策略(SCHED_OTHER,SCHED_FIFO,SCHED_RR)
linux内核的三种调度策略:SCHED_OTHER 分时调度策略,(默认的)SCHED_FIFO实时调度策略,先到先服务SCHED_RR实时调度策略,时间片轮转 实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。原创 2013-05-11 13:25:52 · 4448 阅读 · 1 评论 -
posix多线程有感--Ubuntu下看不见pthread_create(安装pthread线程库)
由于学习多线程编程,所以用到pthread,但是man的时候却发现没有pthread函数库的手册页,然后安装$sudo apt-get install glibc-doc 安装以后,发现还是有很多函数不全,只有一小部分pthread的函数,使用man -k pthread或apropos pthread可以查找到当前manpages中关于pthread的手册。安装ma原创 2013-05-04 13:36:44 · 4824 阅读 · 0 评论 -
posix 多线程有感--线程
1.进程:资源分配单位(存储器,文件)和CPU调度(分配)单位。 线程:作为CPU调度单位,而进程只作为其资源分配单位。 (1)只拥有必不可少的资源,如:线程状态,寄存器上下文和栈。 (2)具有就绪,阻塞和执行三种基本状态。2.进程和线程的比较:(1)地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线程间共享。(2)通信:进程间通信IPC,线程间原创 2013-05-02 10:36:30 · 1292 阅读 · 0 评论 -
UNIX环境高级编程——死锁
死锁 操作系统中有若干进程并发执行,它们不断申请、使用、释放系统资源,虽然系统的进程协调、通信机制会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能继续运行,否则就阻塞的情况。此时,若不借助外界因素,谁也不能释放资源,谁也不能解除阻塞状态。根据这样的情况,操作系统中的死锁被定义为系统中两个或者多个进程无限期地等待永远不会发生的条件,系统处于停滞状态,这就是死锁。 产生死锁的原因主要原创 2013-07-17 11:53:23 · 2005 阅读 · 0 评论 -
UNIX环境高级编程——线程同步之互斥锁、读写锁和条件变量(小结)
一、使用互斥锁1、初始化互斥量pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//静态初始化互斥量int pthread_mutex_init(pthread_mutex_t*mutex,pthread_mutexattr_t*attr);//动态初始化互斥量int pthread_mutex_destory(pthread_mutex_t*m原创 2013-07-17 12:27:26 · 2571 阅读 · 0 评论