标签:style 使用 文件 数据 for 问题 div 代码
现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行,同时运行可能是真的同时运行(SMP架构中),也可能仅仅是操作系统提供的服务(通过将CPU时间分片,并将时间片分给不同的任务)。在多任务操作系统中,同时运行的多个任务可能
这两种情形是多任务编程中遇到的最基本的问题,也是多任务编程中的核心问题,同步和互斥就是用于解决这两个问题的。
显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个任务之 间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也 是一种互斥)!因此互斥具有唯一性和排它性,但互斥并不限制任务的运行顺序,即任务是无序的。而同步的任务之间则有顺序关系。
在实际的设计、编码中,任务之间的相互依赖也就是情形2是比较容易发现的,而情形1就不那么
明显了,同步/互斥中出现的问题也多和情形1相关。情形1是和资源访问相关的,要避免此类问题或者解决已经出现的此类问题首先要解决的问题是识别那类资源
是被多个任务共享的,然后再使用同步/互斥的机制来保护这些资源的访问。简单的来说资源大概可以分为以下几类:
在进行设计、编码时我们可以首先对任务使用的资源进行分析,看它使用的资源属于那一类,如果有多个任务需要使用同一类资源,那么这里就需要进行同步/互斥
了。(从这里的分析也可以看出,如果用户任务不需要使用内核中的资源也不许要使用存储器中的资源,那么它就不存在情形1所涉及的同步互斥需求)
在这里可以将用户中的资源进行进一步的分类:
1. 进程中的资源:进程是操作系统分配资源的基本单位,进程的资源主要包括
2. 线程中的资源:一个进程中的所有线程共享进程的地址空间(数据段/堆),打开的文件句柄,由线程独享的资源包括
进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然, 程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状 态下的操作系统本身;其它进程就是用户进程。进程是操作系统进行资源分配的单位(比如文件句柄,虚拟地址空间等等)。
linux下创建子进程的调用是fork(),它功能就是产生子进程,其特别之处在于它会返回2次。
线程是可执行代码的可分派单元。这个名称来源于“执行的线索”的概念。在基于线程的多任务的环境中,所有进程有至少一个线程,但是它们可以具有多个任务。这意味着单个程序可以并发执行两个或者多个任务。
简而言之,线程就是把一个进程分为很多片,每一片都可以是一个独立的流程。这已经明显不同于多进程了,进程是一个拷贝的流程,而线程只是把一条河流截成很
多条小溪。它没有拷贝这些额外的开销,但是仅仅是现存的一条河流,就被多线程技术几乎无开销地转成很多条小流程,它的伟大就在于它少之又少的系统开销。
多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。
使用线程的好处有以下几点:
线程唯一的资源包括:
线程是多线程编程中的主编程接口。线程仅在进程内部是可见的,进程内部的线程会共享诸如地址
空间、打开的文件等所有进程资源。由于线程可共享进程指令和大多数进程数据,因此一个线程对共享数据进行的更改对进程内其他线程是可见的。一个线程需要与
同一个进程内的其他线程交互时,该线程可以在不涉及操作系统的情况下进行此操作。
进程是操作系统分配资源的单位,不同的进程拥有的资源不同,比如地址空间、打开的文件等等。
因为多线程共享进程的大多数数据,因此也引入了新的注意事项:
可重入函数编写规范:
线程安全与可重入函数之间的关系:
例如标准库中的malloc是不可重入的,但是标准库的实现一般都有提供线程安全的版本(具体怎么用线程安全的版本可以查看使用的库的手册,总之小心一点)。
线程安全和可重入函数针对的是多线程环境下,由多个线程共享的资源(静态数据、全局数据)的使用问题。之所以有这个问题是因为在某些函数会使用静态 或者全局数据,它运行的结果依赖于这些数据,这时如果此类函数在运行中被切换走,然后另一个线程也调用了该函数就会出问题,因此这类问题是特定存在于多线 程环境的(当然类似的问题在进程环境下也存在,存在的原因是信号处理函数可能在任意时刻被调用,因而它可能打断进程的正常运行;多个进程之间是不存在这类 问题的,因为每个进程看到的都是自己独立的地址空间)。
需要注意的是,并没有所谓的线程间通信,因为同一个进程内部的线程会共享该进程的资源,比如堆空间、打开的文件等等,因而同一个进程内的多个线程之间不存在通信问题;如果是不同进程之间的线程,就按照进程之间通信方式进行通信即可。
这是一个比较艰难的抉择:),取决于应用场景,它们的区别或许是有参考价值的:
标签:style 使用 文件 数据 for 问题 div 代码
原文地址:http://www.cnblogs.com/xiaozhi123/p/3915987.html