多线程学习1

因为项目需要学习多线程,从最基本的概念学起:
进程:就是正在运行的应用程序;抽象的讲,进程是一些所有权的集合,拥有自己的内存、CPU运行时间等一系列资源,为线程运行提供必要环境。每个进程都有自己的地址空间和动态分配的内存以及文件、线程和其他一些模块。进程是正在运行程序的抽象。一个进程的状态有如下几种:
1.运行
2.就绪(当前能够运行但由于系统正在运行其他进程而需要等待)
3.堵塞(由于得不到所需要的资源或者其他原因,当前进程不能进行,需要等待外部事件的发生)

进程只是表达了所有权概念,线程才是程序的最小执行单位。线程就是程序的一条执行路径,是操作系统分配CPU时间的基本实体。一个进程以一个主线程开始,如果需要还可以创建更多线程。一个进程中多个线程共享进程内的公共资源,同一进程所有线程共享同样的虚拟地址空间、全局变量。
程序:一个静态的指令序列;
进程:为执行程序指令的线程而保留的一系列资源的集合;
线程:操作系统分配调度的最小单位

win2000 进程包含如下几个部分:
1)一个可执行指令的集合;
2)一个私有的虚拟地址空间,即一系列该进程可用的虚拟内存地址的集合;
3)系统资源,包括信号量、通信端口、文件等;
4)至少有一个线程执行
5)进程ID号

线程包含:
1)表示处理器状态寄存器;
2)两个堆栈,一个在线程处于核心模式使用,另一个在线程处于用户模式时使用;
3)一个由子系统、运行时间库和动态链接库使用的私有存储区域;
4)一个线程ID号

单线程和多线程:
传统计算机,只能执行完一个任务后再去执行另外一个;即使在多进程共享很多资源时,也要为每个进程单独分配资源,实际上很难做到资源共享。

多线程:提高工作效率和资源有效利用,采用多线程的思想;在多线程环境中,一个进程的多个线程可同时运行,多个线程共享进程资源;

线程同步问题:
由于多线程,存在相互协调和同步的问题;
线程通过“休眠”(sleeping,暂停所有并执行等待)的方法,来做到与进程中的其他线程同步。在线程休眠前,必须告诉windows,该线程将等待某一事件的发生。当该事件发生时,windows唤醒该线程,使得线程继续执行;
即线程和事件一起被同步,也可以用特殊的对象来进行线程的同步。这些同步对象包括:
1.临界段:临界段对象通过提供所有线程必须共享的对象来控制线程,只有拥有临界段对象的线程才可以访问保护的资源(临界区操作)。在另一个线程可以访问该资源之前,前一个线程必须先释放临界段对象,以便于后一个线程可以获得对临界段对象的访问权;临界段对象也可用来阻值两个及以上线程同时访问共享的资源如文件等;

2.互斥量:互斥量工作方式和临界段非常相似;区别在于互斥量不仅保护一个进程中的资源共享,而且还保护系统中进程之间的资源共享。它通过为互斥量提供一个“互斥量名”来进行进程间资源共享协调的;
3.事件:事件对象用于给线程传递信号,指示线程中特定的操作可以开始或结束。除非线程收到该事件,否则被挂起,当事件对象进入其信号状态时,正在等待该事件的线程就可以开始执行。

4.信号量:与互斥量相似,但是互斥量只允许在同一时刻,一个线程访问它的数据,而信号量允许多个线程在同一时刻访问它的数据;

内核对象:在开发win32应用中经常需要创建、打开并操作一个内核对象,内核对象一般是指由操作系统创建和管理的对象。
常见的对象有下面几种:
**Event Objects:事件对象;
File_Mapping Objects:文件映射对象;
File Objects:文件对象;
MailSlot Objects:邮槽对象;
Mutex Objects:互斥对象;
Pipe Objects:管道对象;
Process Objects:进程对象
Semaphore Objects:信号量对象;
Thread Objects:线程对象**;

这些内核对象的创建都是调用不同win32函数生成的,内核对象实际上是由系统内核分配的一块内存,而且只能由内核来访问,这个内存块是一个数据结构,其成员包括了该对象的信息。一定要记住:
内核对象的数据结构只能由内核访问,应用程序不能再内存中定位这些数据结构,也不可直接改变他们的内容,只能通过win32API函数来操作这些内核对象及其对应的数据结构。当调用创建内核对象的API函数,返回一个用于代表该对象的句柄,它可以被进程中所有的线程使用

可通过如下机制使得多个进程共享某个内核对象:
1.对象句柄继承。当进程之间存在父子关系时,可以使用对象的句柄继承方法来让子进程继承父进程的句柄;
2.使用命名对象,
3.复制对象句柄;

虚拟内存:现在的windows采用32位寻址,每个进程都被分配4G虚拟地址空间,一个32位的地址代表了内存中的一个地址,系统将32位地址转换到4G的虚拟地址空间。在一般系统中,系统将2G分配给操作系统内部使用,另一半分配给进程,作为进程的私有存储。

对象和句柄:
对象:指一个静态定义的对象类型(类)的一个运行实例。
句柄:在系统创建对象后返回的用来代表该对象的一个值。通过句柄用户就可以对对象进行访问,他代表对对象的引用。至于句柄的值具体是多少,不需要关心,我们只需要知道这个句柄值对应该对象,查找句柄从而找到该对象,就比如你的身份证ID号对应你的人一样。

安全属性:内核对象被一个安全描述符保护,安全描述符是针对内核对象而言,每个内核在创建都可以指定安全描述符。但用户对象或其他对象都不能指定安全描述符。对象的安全描述符描述了谁创建了该对象、谁能访问、谁不能访问一系列安全属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值