
多线程***
文章平均质量分 63
first_wolf
linux
展开
-
linux内核学习之进程和线程
一.定义关于进程、轻量级进程、线程、用户线程、内核线程的定义,这个很容易找到,但是看完之后你可以说你懂了,但实际上你真的明白了么?在现代操作系统中,进程支持多线程。进程是资源管理的最小单元;而线程是程序执行的最小单元。一个进程的组成实体可以分为两大部分:线程集合和资源集合。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。线程转载 2013-02-18 11:41:42 · 605 阅读 · 0 评论 -
线程与IO
待续...原创 2013-05-13 16:23:03 · 737 阅读 · 0 评论 -
线程安全与可重入
一 概述: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 可重入函数:这个函数是可以被中断的,除了使用自己栈上的数据之外不依赖与任何环境。 可重入函数主要用于多任务环境中,一个可重入的函数简单来说原创 2013-02-18 11:11:50 · 480 阅读 · 0 评论 -
进程或线程终止时锁的处理
一 进程终止时:(1)进程终止时系统不会自动释放所持有的互斥锁、读写锁和Posix信号量,进程终止时内核总是自动清理的唯一同步锁类型是fcntl记录锁。System V信号量,应用程序可以选择进程终止时内核是否自动清理某个信号量。二 线程终止时:(1)一个线程也可以在持有某个互斥锁期间终止,自己调用pthread_exit或被另一个线程取消。如果线程调用pthread_exit原创 2013-08-08 18:12:08 · 2537 阅读 · 0 评论 -
线程的实现模型
一 用户级线程(User-Level Thread,ULT):(1)定义:应用程序可以通过使用线程库来设计多线程程序。线程库是用户级线程管理的一个包,它包含用于创建和销毁线程、在线程间传递信息和数据、调度线程执行的代码以及保存和恢复线程上下文的代码。(2)优点:1.所有线程的管理数据结构都在一个进程的地址空间内,线程切换不需要内核支持。2.调度可以是和应用程序相关的。3.用户级原创 2013-08-09 20:29:53 · 701 阅读 · 0 评论 -
用户态与内核态
用户态:待续。。。内核态:待续。。。 用户态切换到内核态的3种方式1) 系统调用 这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。2) 异常 当CPU在执行运行在用户态下的程序时,发原创 2013-02-18 11:31:16 · 1349 阅读 · 0 评论 -
死锁
一 概述:(1)死锁定义:当一组进程的每个进程都在等待某个事件(典型情况是等待所请求的资源释放),而只有在这组进程中的其他被阻塞的进程才能出发该事件。*死锁原因归结为两点:竞争资源;进程间推进顺序非法。(2)资源的分类:*可重用资源:指一次只能供一个进程安全地使用,并且不会由于使用而耗尽的资源。可重用资源包括:处理器、I/O通道、设备等。*可消耗资源(又称临时资源):指可以被创原创 2013-05-17 13:36:28 · 964 阅读 · 0 评论 -
进程与信号、线程与信号
待续...原创 2013-05-13 16:23:25 · 960 阅读 · 0 评论 -
网络编程经验
一 进程相关:(1)当fork子进程时必须捕获SIGCHLD信号,并且SIGCHLD的信号处理程序需正确编写,使用waitpid函数。(2)当捕获信号时,必须处理被中断的系统调用:当一个进程阻塞在系统调用时捕获某个信号且信号处理程序返回时,该系统调用可能返回一个EINTR错误。有些内核自动重启某些被中断的系统调用。为了便于移植,必须对系统调用返回EINTR做好准备;在套接字中,accept原创 2013-09-11 19:44:12 · 715 阅读 · 0 评论 -
进程间和线程间同步综述
一 概述:(1)互斥锁、条件变量和读写锁都是无名的,即它们是基于内存的,能够很容易的在单个进程内的不同线程间共享,进行线程间同步;然而只有它们放在不同进程间共享的内存区中时,它们才可能为这些进程所共享。(2)Posix信号量有两种形式:有名信号量和基于内存的信号量。有名信号量总能在不同进程间共享(因为它们是用Posix IPC名字标示的);基于内存的信号量必须放在进程间共享内存区中才能实现原创 2013-08-08 17:59:32 · 629 阅读 · 0 评论 -
线程池
一 线程池(选自:操作系统概念 第7版):线程的来源:需要时创建和线程池。(1)多线程服务器潜在的问题:*第一个问题:处理请求之前用以创建线程的时间,以及线程完成工作之后就要被丢弃这一事实。*第二个问题:如果允许所有并发请求都通过新线程来处理,那么将没法限制在系统中并发执行的线程的数量。无限制的线程会耗尽系统资源(如:CPU和内存),解决方法使用线程池。(2)主要思想:原创 2013-05-12 19:33:04 · 846 阅读 · 0 评论 -
线程私有数据
线程私有数据的作用?线程私有数据的实现?一 概述:(1)线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制。*在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变量,都可以被进程内所有的线程读写。*一个线程真正拥有的唯一私有存储是处理器寄存器,栈在“主人”故意暴露给其他线程时也原创 2013-05-13 08:56:31 · 997 阅读 · 0 评论 -
线程(二)线程控制
一 线程属性:(1)可使用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来。*int pthread_attr_init(pthread_attr_t *attr):初始化pthread_attr_t结构。pthread_attr_init初始化的结构就是系统实现支持的线程所有属性的默认值,要改变其中个别属性的值,就需要调用其它函数。*int pt原创 2013-05-09 18:56:06 · 819 阅读 · 0 评论 -
线程的状态
一 线程的四个基本状态:(一)就绪状态:线程能够运行,但在等待可用处理器。*可能刚刚启动,或刚从阻塞状态恢复,或者被其它线程抢占。(二)运行状态:线程正在运行。在多处理器系统中,可能有多个线程处于运行态。1.初始线程(即主线程)与普通线程的一些不同:(三)阻塞状态:线程由于等待处理器外的其他条件无法运行,如条件变量的改变、加锁互斥量或等待I/O操作结束。原创 2013-07-31 18:43:54 · 835 阅读 · 0 评论 -
同步(三)读写锁
一 概述:(1)读写锁的分配规则:*只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有读写锁用于读。*仅当没有线程持有某个给定的读写锁用于读或写时,才能分配该读写锁用于写。(2)读写锁:*也称为共享-独占锁:获取一个读写锁用于读称为共享锁;获取一个读写锁用于写称为独占锁。*某些应用中读数据比修改数据频繁,这时用读写锁代替互斥锁能提供更高的并发度。(3)读原创 2013-05-11 12:37:19 · 826 阅读 · 0 评论 -
同步(一)互斥锁与条件变量
一 概述:(1)互斥锁与条件变量的特点:*互斥锁用于上锁,条件变量用于等待。*互斥锁和条件变量可以用于线程或进程间的同步,是基于共享内存区。用于进程间同步时,需放置在多个进程的共享内存区中。*互斥锁必须由给它上锁的线程解锁。*任何时刻只有一个线程能够锁住一个给定的互斥锁。*静态分配的互斥锁或条件变量具备默认属性,我们可以利用函数来以非默认属性初始化它们。*编程技巧:把共原创 2013-05-09 18:56:29 · 1090 阅读 · 3 评论 -
进程及进程控制(二)
一 exec函数:(1)作用:*exec并不创建进程,只是用一个全新的程序替换当前进程的正文、数据、堆和栈段,exec前后进程的ID并未改变。*exec的新程序可以是:带有main函数的程序、linux命令或自己写的脚本文件等可执行文件。*execve是系统调用,其余五个是库函数,它们都要调用execve。(2)种类(6个exec函数):*基本的进程控制原语:用fo原创 2013-05-08 21:08:43 · 650 阅读 · 0 评论 -
同步(二)Posix信号量
一 Posix信号量:(1)信号量(semaphore):是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。*二值信号量:其值或为0或为1的信号量。可用于互斥,像互斥锁一样,但互斥锁必须总是由锁住它的线程解锁,信号量的释放(post)却不必由执行过它的等待操作的同一个线程执行。*计数信号量:通常初始化为某个值N,指示可用的资源数(比如缓冲区)。(2)Posi原创 2013-05-11 12:34:42 · 1327 阅读 · 0 评论 -
进程及进程控制(一)
一 基本概念:1.进程标识符进程标识符(ID)是一个非负整数,是唯一的,但是可以重用。系统专用进程:交换进程:ID为0,是内核的一部分,也被成为系统进程。init进程:ID为1,在自举过程结束时由内核,调用,通常读与系统有关的初始化文件(如/etc/init.d中的文件),并将系统引导到一个状态。init进程不会终止,是一个普通用户进程(原创 2013-05-08 21:08:19 · 751 阅读 · 0 评论 -
线程实时调度
待续...原创 2013-05-13 20:13:00 · 739 阅读 · 0 评论 -
进程调度
一 处理器调度类型:(1)长程调度(又称作业调度):决定是否把进程添加到当前活跃的进程集合中。决定哪个程序可以进入系统处理,因此,控制系统并发度。*系统并发度:可处于等待处理器执行的进程的个数。(2)中程调度:是交换功能的一部分,决定是否把进程添加到那些至少部分在内存中并且可以被执行的集合中。主要目的提高内存利用率和系统吞吐量。(3)短程调度(即进程调度):决定下一次执行哪一个就绪原创 2013-05-14 10:23:57 · 1256 阅读 · 0 评论 -
IPC综述
一 IPC分类:(1)IPC(interprocess communication):消息传递和同步。(2)主要四个领域:*消息传递(管道、FIFO、消息队列)*同步(互斥锁、条件变量、读写锁、信号量)*共享内存区(匿名共享内存区、有名共享内存区)*过程调用(Sun RPC)二 IPC对象的持续性:(1)随进程持续(process-persistent):一原创 2013-02-18 11:08:22 · 799 阅读 · 0 评论 -
linux中错误类型和处理
一 概述:(1)UNIX函数出错时,常常返回一个负值,而且整形变量errno通常被设置为含有附加信息的一个值(线程函数除外)。*线程的处理:线程相关函数(e.g.pthread_create),出错时通常返回错误码,不设置errno变量。Pthread中的函数通过返回值来表示错误状态,而不是用errno变量,但发生错误时,函数返回一个包含在中的错误代码。Pthread没有像perror函数原创 2013-05-28 10:55:20 · 1176 阅读 · 0 评论 -
共享内存区
一 概述:*共享内存区是最快的IPC形式。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传递就不在涉及内核,然而往该内存区存放信息或从中取走信息的进程间需要同步。*无亲缘关系进程间共享内存区的两种方法:1.内存映射文件(父子进程或无亲缘关系都可):由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间的一个文件。2.共享内存区对象:由shm_open原创 2013-05-16 13:41:09 · 972 阅读 · 0 评论 -
线程(一)创建和终止
一 线程基本概念:(一)注意:1.线程在进程内执行环境必需的信息:线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。2.进程内的所有信息对该进程内的所有线程都是共享的:包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。3.Pthreads引入了一种全新的报错方式:Pthreads中的函数通过返回值表示错误状态原创 2013-05-09 18:55:45 · 1018 阅读 · 0 评论