进程与线程学习笔记

来源:互联网 发布:淘宝充值苹果账号 编辑:程序博客网 时间:2024/05/17 22:04
关于进程与线程,以下的几点理解非常重要:

1、进程是系统资源分配的基本单元,线程是系统调度的基本单元。程序是静态的,进程是动态的。

2、一个应用程序可以包含多个进程,一个进程可以有多个线程。但是在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。

3、运行程序时,程序会创建至少一个进程,并且会为每个进程在堆heap中分配地址资源。进程之间一般不会相互干扰。在运行一个进程时,进程会创建至少一个线程,每个线程都会在栈stack中分配一定地址资源,同一进程下的线程之间共享heap 中的资源。当线程结束时,操作系统自动回收在stack中为线程开辟的地址资源。

4、同一进程下的不同线程,如线程A不能访问线程B在栈stack中开辟的资源。因为在CPU中不同的线程是顺序执行的,意思就是说先执行A,A执行完之后才可能执行B,由于在A执行完之后操作系统就会释放在stack中分配给A的资源,显然给A在stack中分配的资源是局部变量,因此在执行B线程之时,在stack中分配给A的资源已经不见了。所以线程A不能访问线程B在栈中开辟的资源。

5、通常我们编写的main函数可视为一个线程,也就是说mian函数一般以线程的方式运行。

6、同一进程的不同线程有共享的内存资源,包括:

      1. 进程创建时在堆中分配的内存
      2. 全局变量
      3. 静态变量
      4. 文件等公共资源

7、线程独享的资源包括:

                 1. 栈

                 2.寄存器

8、采用信号量(信号灯)来解决进程同步同步的问题。

为了防止出现因多个  程序(进程或者进程中的线程,本质是线程)同时访问一个共享资源而引发的一系列问题,引入消息量机制来限制访问同一资源的的进程个数。


问题:CPU对进程的执行是按顺序的(因为对线程的执行是顺序执行的,一次只能执行一个),那为什么会有多个进程同时访问一个共享资源呢?
        此提问的说法可能有问题,只要进程不被终止,进程就会一直占用资源。可能多个进程占用的资源就是采用消息量限制访问的共享资源。

9、操作系统的设计

                 1. 多进程,以同时完成多任务
                 2. 多线程,单个任务分工成不同的部分执行

                 3.协调机制,利用信号量机制防止进程之间、线程之间的冲突与资源共享。

10、进程运行状态

参考:http://blog.sina.com.cn/s/blog_6b2328a20100v92x.html


以下部分转至:http://chujiaba.blog.163.com/blog/static/1899181372007221990277/

==============================================
1.程序和进程
(1)程序是计算机指令的集合,它以文件的形式存储在磁盘上。
(2)进程:通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。
(3)进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源。
(4)进程由两个部分组成:
a、操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。
b、地址空间。它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。
2.进程
(1)进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。
(2)单个进程可能包含若干个线程,这些线程都“同时” 执行进程地址空间中的代码。
(3)每个进程至少拥有一个线程,来执行进程的地址空间中的代码。当创建一个进程时,操作系统会自动创建这个进程的第一个线程,称为主线程。此后,该线程可以创建其他的线程。
3.进程地址空间
(1)系统赋予每个进程独立的虚拟地址空间。对于32位进程来说,这个地址空间是4GB。
(2)每个进程有它自己的私有地址空间。进程A可能有一个存放在它的地址空间中的数据结构,地址是0x12345678,而进程B则有一个完全不同的数据结构存放在它的地址空间中,地址是0x12345678。当进程A中运行的线程访问地址为0x12345678的内存时,这些线程访问的是进程A的数据结构。当进程B中运行的线程访问地址为0x12345678的内存时,这些线程访问的是进程B的数据结构。进程A中运行的线程不能访问进程B的地址空间中的数据结构,反之亦然。
(3)4GB是虚拟的地址空间,只是内存地址的一个范围。在你能成功地访问数据而不会出现非法访问之前,必须赋予物理存储器,或者将物理存储器映射到各个部分的地址空间。
(4)4GB虚拟地址空间中,2GB是内核方式分区,供内核代码、设备驱动程序、设备I/O高速缓冲、非页面内存池的分配和进程页面表等使用,而用户方式分区使用的地址空间约为2GB,这个分区是进程的私有地址空间所在的地方。一个进程不能读取、写入、或者以任何方式访问驻留在该分区中的另一个进程的数据。
对于所有应用程序来说,该分区是维护进程的大部分数据的地方。
4.线程
(1)线程由两个部分组成:
a、线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。
b、线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。
(2)当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。
(3)线程总是在某个进程环境中创建。系统从进程的地址空间中分配内存,供线程的堆栈使用。新线程运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他线程的堆栈。这使得单个进程中的多个线程确实能够非常容易地互相通信。
(4)线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。
(5)因为线程需要的开销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。
5.线程运行
(1)操作系统为每一个运行线程安排一定的CPU时间 —— 时间片。系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,因时间片相当短,因此,给用户的感觉,就好像线程是同时运行的一样。
(2)如果计算机拥有多个CPU,线程就能真正意义上同时运行了。
=================================================

另外,一下网址对进程与线程的讲解非常形象通俗:

http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html


0 0
原创粉丝点击