什么是进程、进程控制、进程通信、线程等

          进程:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立的单位。


          进程控制快:为了使参与并发执行的程序(含数据)能独立的运行,必须为之配置一个专门的数据结构。


          进程的状态:运行状态,就绪状态,阻塞状态(等待状态),创建状态,结束状态


          进程的创建可用fork(),返回类型为pid_t的类型。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

            1)在父进程中,fork返回新创建子进程的进程ID;

               2)在子进程中,fork返回0;

               3)如果出现错误,fork返回一个负值;

所以可以通过fork的返回值来判断当前的进程是父进程还是子进程。


           引用一位网友的话来解释fork的返回值为什么在父子进程中不同。“其实就相当于链表,进程形成了链表,父进程的pid(p 意味point)指向子进程的进程id, 因为子进程没有子进程,所以其fpid为0.


       fork出错可能有两种原因:

                1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。

                2)系统内存不足,这时errno的值被设置为ENOMEM。


            一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留
着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存
着导致该进程终止的信号是哪个。


            僵尸进程:如果一个进程已经终止,但是它的父进程尚未调用wait 或waitpid对它进行清理,这时的进程状
态称为僵尸(Zombie)进程。任何进程在刚终止时都是僵尸进程,正常情况下,僵尸进程都立刻被父进程清理。


        守护进程:Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能和用户交互。其他进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直运行着。这种进程就是守护进程。


        引入进程的目的,是为了使多道程序并发执行,以提高资源利用率和系统吞吐量;而引入线程,则是为了减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。


        线程:最直接的理解就是“轻量级的进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。


        进程只作为除CPU以外的系统资源的分配单元,线程则作为处理机的分配单元。


        线程和进程的比较:

                1. 调度:线程是独立调度的基本单位,进程是资源拥有的基本单位。在同一进程中,线程的切换不会引起

                    进程切换。

                2. 拥有资源:进程是拥有资源的基本单位,而线程不一定拥有系统资源(也由一点必不可少的资源),但

                    线程可以访问其隶属进程的系统资源。

                3. 并发性: 不仅进程之间可以并发执行,而且同一进程内的多个线程之间也可以并发执行。

                4. 系统开销:创建或撤销进程操作系统所付出的开销大于创建或撤销线程时的开销。由于同一进程内

                    多个线程共享进程的地址空间,因此,这些线程之间的同步和通信非常容易实现。

                5. 地址空间和其他资源:进程的地址空间之间相互独立,同一进程的各线程共享进程的资源,某进程内的

                    线程对于其他进程不可见。

                6. 通信方面:进程间通信需要进程同步和互斥手段的辅助,以保证数据的一致性,而线程间可以直接读/写

                    进程数据段(如全局变量)来进行通信。


        线程控制

               创建线程:#include <pthread.h>
                                         int pthread_create(pthread_t *restrict thread,
                                                 const pthread_attr_t *restrict attr,
                                                 void *(*start_routine)(void*), void *restrict arg);

                                 返回值:成功返回0,失败返回错误号。以前学过的系统函数都是成功返回0,失败返回-1,而
                                 错误号保存在全局变量errno 中,而pthread库的函数都是通过返回值返回错误号,虽然每个线
                                 程也都有一个errno ,但这是为了兼容其它函数接口而提供的,pthread库本身并不使用它,通
                                 过返回值返回错误码更加清晰。














           

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值