进程与线程

线程共享的 环境包括:
                 进程代码段,
                 进程的公有数据(利用这些数据,线程很容易实现相互间的通讯) ,                    进程打开的文件描述符,
                 信号的处理器进程的当前目录和进程用户ID与进程组ID。
进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:
              1.线程ID。
            2.寄存器组的值。
            3 .线程的堆栈(堆栈是保证线程独立运行所必需的)。
            4.错误码的返回值。
            5.线程的信号屏蔽码(但所有的线程都共享同样的信号处理器)。
            6.线程的优先级
进程是资源分配的基本单位,线程是系统调度的基本单位。
平时我们写的程序都是作为线程运行的;进程可以看做是包括一系列线程和资源的统称;一个进程至少包括一个
线程(主线程,进入main函数时产生的);在其中可以创建其它线程,也可以不创建。

同一进程间的线程究竟共享哪些资源呢,而又各自独享哪些资源呢?
共享的资源有
a. 堆.  由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)
b. 全局变量.  它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
c. 静态变量.  虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的
d. 文件等公用资源.  这个是共享的,使用这些公共资源的线程必须同步。Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。
独享的资源有
a. 栈. 栈是独享的
b. 寄存器.  这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC

进程的三种状态及转换

    进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态。

就绪(Ready)状态

    当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

执行(Running)状态
当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。

阻塞(Blocked)状态
正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。
引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等

                                                  
1:就绪->执行, 当前运行进程阻塞,调度程序选一个优先权最高的进程占有处理机;
2:执行->就绪, 当前运行进程时间片用完;
3:执行->阻塞,当前运行进程等待键盘输入,进入了睡眠状态。
4:阻塞->就绪,I/O操作完成,被中断处理程序唤醒。


进程的执行状态分为:核心态和用户态,两者的主要区别就是在于进程能否获取计算机的所有资源(核心态可以,用户态则受到限制)。凡是涉及到计算机根本运行的事情都应该在内核态下执行,而中断、时钟日期、存储映象图都属于系统级的资源,对这些资源的修改则都必须在核心态,但是读取则没有强制要求。

进程的组成:进程有PCB(进程控制块)、有关程序段、和该程序段对其进行操作的数据结构集组成。

创建进程的必须步骤:
1.申请空白PCB(进程控制块)
2.为新进程分派资源
3.初始化PCB
4.将新进程插入就绪队列


进程与线程的主要区别:
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一 个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

线程和进程的区别联系:
1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
根本区别就一点:多线程的每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:
1、速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。
2、资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。
3、同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值